it-swarm.com.de

Curl und PHP - Wie kann ich einen Json durch Pocken, POST, GET passieren

Ich habe an der Entwicklung einer Rest-API für die Hölle gearbeitet, und ich habe es getestet, während ich mit curl von der Kommandozeile aus weiter arbeite, was für CRUD sehr einfach ist

Ich kann diesen Aufruf erfolgreich von der Befehlszeile aus durchführen

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

Die obigen Aufrufe sind einfach von der Kommandozeile aus zu machen und funktionieren gut mit meiner API, aber jetzt möchte ich PHP verwenden, um die Locken zu erzeugen. Wie Sie sehen können, übergebe ich Daten als Json-String. Ich habe herumgelesen und denke, ich kann wahrscheinlich die POST und die POST -Felder einfügen, aber ich konnte nicht herausfinden, wie man http-Body-Daten mit GET übergibt. Alles, was ich sehe, besagt, dass Sie es an die URL anhängen müssen, aber auf dem Befehlszeilenformular sieht es nicht so aus. Wie auch immer, ich würde es lieben, wenn jemand die richtige Vorgehensweise für diese vier Operationen in PHP hier auf einer Seite schreiben könnte. Ich würde gerne den einfachsten Weg sehen, es mit curl und php zu tun. Ich denke, ich muss alles durch den http-Body leiten, da meine PHP-API alles mit php: // eingeht

47
Gilberg

STELLEN

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

ERHALTEN Siehe @ Dan H Antwort

LÖSCHEN

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

Sie können diese kleine Bibliothek verwenden: https://github.com/jmoraleda/php-rest-curl

Einen Anruf tätigen ist so einfach wie:

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

Und für die Variable $ result:

  • $ result ['status'] ist der HTTP-Antwortcode
  • $ result ['data'] ein Array, in dem die JSON-Antwort analysiert wurde
  • $ result ['header'] eine Zeichenfolge mit den Antwortheatern

Ich hoffe es hilft

10
ledfusion

Für mich selbst kodiere ich es einfach in die URL und benutze $ _GET auf der Zielseite. Hier ist eine Zeile als Beispiel.

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

BEARBEITEN: Zielausschnitt hinzufügen ... (BEARBEITUNG 2 wurde oben auf Anforderung von OPs hinzugefügt)

<?php
if(!isset($_GET['json']))
    die("FAILURE");
$json = json_decode($_GET['json']);
$method = $json->method;
...
?>
7
Dan H

Ich habe mit Elastic SQL plugin ..__ gearbeitet. Die Abfrage wird mit der GET-Methode durchgeführt, die cURL wie folgt verwendet:

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'

Ich stellte einen benutzerdefinierten Port auf einem öffentlichen Server zur Verfügung und machte einen Reverse-Proxy mit der Einstellung Basic Auth.

Dieser Code funktioniert gut und Basic Auth Header:

$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
Luiz Vaz