Curl et PHP - Comment puis-je passer un json à travers curl par PUT, POST,GET

j'ai travaillé sur la construction D'une API Rest pour l'enfer de lui et je l'ai testé au fur et à mesure en utilisant curl à partir de la ligne de commande qui est très facile pour CRUD

je peux réussir à faire ces appels à partir de la ligne de commande

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

les appels ci-dessus sont faciles à faire à partir de la ligne de commande et fonctionnent bien avec mon api, mais maintenant je veux utiliser PHP pour créer la boucle. Comme vous pouvez le voir, je passe des données comme une chaîne json. J'ai lu et je pense que je peux probablement faire le POST et inclure les champs POST, mais je n'ai pas été en mesure de trouver comment passer les données du corps http avec GET. Tout ce que je vois indique que vous devez l'attacher à l'url, mais il ne semble pas de cette façon sur le formulaire de ligne de commande. De toute façon, j'aimerais que quelqu'un puisse écrire la bonne façon de faire ces quatre opérations en PHP ici sur une page. J'aimerais voir de la façon la plus simple de le faire avec curl et php. Je pense que j'ai besoin de passer tout par le corps http parce que mon api php la capture de tout avec php://input

44
demandé sur Gilberg 2014-01-22 03:22:03

5 réponses

$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);

POST

$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 Voir @Dan H réponse

DELETE

$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);
129
répondu voodoo417 2014-01-22 00:05:10

Vous pouvez utiliser cette petite bibliothèque: https://github.com/jmoraleda/php-rest-curl

Faire un appel est aussi simple que:

// 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); 

et pour la variable $result:

  • $result['statut'] est le code HTTP de la réponse
  • $result['data'] un tableau avec la réponse JSON analysée
  • $result['header'] une chaîne avec les en-têtes de réponse

j'Espère que ça aide

9
répondu ledfusion 2014-03-12 02:18:31

pour moi, je viens de l'encoder dans l'url et d'utiliser $_GET sur la page de destination. Voici une ligne comme un exemple.

$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);

EDIT: ajout de l'extrait de destination... (EDIT 2 a ajouté plus de ci-dessus à l'OPs demande)

<?php
if(!isset($_GET['json']))
    die("FAILURE");
$json = json_decode($_GET['json']);
$method = $json->method;
...
?>
5
répondu Dan H 2014-01-21 23:34:37

définir une propriété de plus curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false);

0
répondu user1759579 2017-07-07 16:15:28

je Travaille avec Elastic SQL plugin. La requête est faite avec la méthode GET en utilisant cURL comme ci-dessous:

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'

j'ai exposé un port personnalisé sur un serveur public, faisant un mandataire inverse avec un Auth de base.

Ce code fonctionne très bien ainsi que les en-Tête d'Authentification:

$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
0
répondu Luiz Vaz 2018-06-28 05:11:41