por - recibir json en php post
Curl y PHP: ¿cómo puedo pasar un json a través de curl mediante PUT, POST, GET (5)
He estado trabajando en la construcción de una API de reposo por pura casualidad y la he estado probando a medida que avanzo usando curl desde la línea de comandos, lo cual es muy fácil para CRUD
Puedo hacer estas llamadas con éxito desde la línea de comando
curl -u username:pass -X GET http://api.mysite.com/pet/1
curl -d ''{"dog":"tall"}'' -u username:pass -X GET http://api.mysite.com/pet
curl -d ''{"dog":"short"}'' -u username:pass -X POST http://api.mysite.com/pet
curl -d ''{"dog":"tall"}'' -u username:pass -X PUT http://api.mysite.com/pet/1
Las llamadas anteriores son fáciles de hacer desde la línea de comandos y funcionan bien con mi API, pero ahora quiero usar PHP para crear el curl. Como puede ver, paso los datos como una cadena json. He leído todo y creo que probablemente pueda hacer el POST e incluir los campos POST, pero no he podido averiguar cómo pasar datos corporales http con GET. Todo lo que veo dice que debes adjuntarlo a la url, pero no se ve de esa manera en la línea de comando. De todos modos, me encantaría que alguien pudiera escribir la forma correcta de hacer estas cuatro operaciones en PHP aquí en una página. Me gustaría ver la forma más sencilla de hacerlo con curl y php. Creo que necesito pasar todo a través del cuerpo http porque mi API está capturando todo con la entrada php: //
Estaba trabajando con el plugin Elastic SQL . La consulta se realiza con el método GET utilizando cURL como se muestra a continuación:
curl -XGET http://localhost:9200/_sql/_explain -H ''Content-Type: application/json'' /
-d ''SELECT city.keyword as city FROM routes group by city.keyword order by city''
Expongo un puerto personalizado en el servidor público, haciendo un proxy inverso con el conjunto de autenticación básica.
Este código funciona bien más el encabezado básico de autenticación:
$host = ''http://myhost.com:9200'';
$uri = "/_sql/_explain";
$auth = "john:doe";
$data = "SELECT city.keyword as city FROM routes group by city.keyword order by city";
function restCurl($host, $uri, $data = null, $auth = null, $method = ''DELETE''){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $host.$uri);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(''Content-Type: application/json''));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if ($method == ''POST'')
curl_setopt($ch, CURLOPT_POST, 1);
if ($auth)
curl_setopt($ch, CURLOPT_USERPWD, $auth);
if (strlen($data) > 0)
curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
$resp = curl_exec($ch);
if(!$resp){
$resp = (json_encode(array(array("error" => curl_error($ch), "code" => curl_errno($ch)))));
}
curl_close($ch);
return $resp;
}
$resp = restCurl($host, $uri); //DELETE
$resp = restCurl($host, $uri, $data, $auth, ''GET''); //GET
$resp = restCurl($host, $uri, $data, $auth, ''POST''); //POST
$resp = restCurl($host, $uri, $data, $auth, ''PUT''); //PUT
Para mí, solo codifico en la url y uso $ _GET en la página de destino. Aquí hay una línea como ejemplo.
$ch = curl_init();
$this->json->p->method = "whatever";
curl_setopt($ch, CURLOPT_URL, "http://" . $_SERVER[''SERVER_NAME''] . $this->json->path . ''?json='' . urlencode(json_encode($this->json->p)));
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
curl_close($ch);
EDITAR: Agregar el fragmento de destino ... (EDIT 2 agregó más arriba en la solicitud de OP)
<?php
if(!isset($_GET[''json'']))
die("FAILURE");
$json = json_decode($_GET[''json'']);
$method = $json->method;
...
?>
Puede usar esta pequeña biblioteca: https://github.com/jmoraleda/php-rest-curl
Hacer una llamada es tan simple como:
// GET
$result = RestCurl::get($URL, array(''id'' => 12345678));
// POST
$result = RestCurl::post($URL, array(''name'' => ''John''));
// PUT
$result = RestCurl::put($URL, array(''$set'' => array(''lastName'' => "Smith")));
// DELETE
$result = RestCurl::delete($URL);
Y para la variable $ result:
- $ result [''status''] es el código de respuesta HTTP
- $ result [''data''] una matriz con la respuesta JSON analizada
- $ result [''header''] una cadena con los encabezados de respuesta
Espero eso ayude
establecer una propiedad más curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false);
PONER
$data = array(''username''=>''dog'',''password''=>''tall'');
$data_json = json_encode($data);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(''Content-Type: application/json'',''Content-Length: '' . strlen($data_json)));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, ''PUT'');
curl_setopt($ch, CURLOPT_POSTFIELDS,$data_json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
ENVIAR
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(''Content-Type: application/json''));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$data_json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
GET Ver respuesta @Dan H
BORRAR
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_POSTFIELDS,$data_json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);