Wie poste ich JSON mit Curl auf PHP

108

Ich bin vielleicht weit von der Basis entfernt, aber ich habe den ganzen Nachmittag versucht, den Befehl curl post in diesem PHP-Framework-Tutorial für die Pause auszuführen . Was ich nicht verstehe ist, wie PHP meinen POST interpretieren soll, er erscheint immer als leeres Array.

curl -i -X POST -d '{"screencast":{"subject":"tools"}}'  \
      http://localhost:3570/index.php/trainingServer/screencast.json

(Der Schrägstrich dort soll mich nur nicht wie einen Idioten aussehen lassen, aber ich habe dies unter Windows mit PHP 5.2 ausgeführt, das auch auf einem Linux-Server versucht wurde, dieselbe Version mit Linux Curl)

Es muss etwas geben, das mir fehlt, weil es ziemlich einfach zu sein scheint. Der Beitrag wird einfach nicht richtig interpretiert. Wenn es so wäre, würde alles großartig funktionieren.

Folgendes bekomme ich zurück:

HTTP / 1.1 409-Konflikt
Datum: Fr, 01. Mai 2009 22:03:00 GMT
Server: Apache / 2.2.8 (Win32) PHP / 5.2.6
X-Powered-By: PHP / 5.2.6
Übertragungscodierung: Chunked
Inhaltstyp: text / html; Zeichensatz = iso-8859-1

{"screencast": {"id": null, "subject": null, "body": null,
         "dataUrl": null, "dataMedium": null, "createdOn": null, "author": null}}
Peter Turner
quelle
Könnten Sie bitte auch Ihre .php-Datei kopieren und einfügen? Sind Sie sicher, dass die URL localhost: 3570 / index.php / trainingServer / screencast.json Ihr Skript ausführt ? Es sieht nicht wie eine PHP-URL aus.
Punkte
@pts; Peter verwendet ein MVC-Framework. Schauen Sie sich index.php in dieser URL an.
Alan Storm
@pts Ich verwende Delphi für PHP (daher das: 3570) und das Recess MVC-Framework ohne .htaccess-Datei, daher die index.php / in der URL.
Peter Turner
7
Vergessen Sie nicht, es als zu senden application/json.
Gumbo
1
Es ist nicht erforderlich, die doppelten Anführungszeichen zu umgehen, wenn Sie sie in einfache Anführungszeichen einbetten.

Antworten:

107

Jordans Analyse, warum das $ _POST-Array nicht gefüllt ist, ist korrekt. Sie können jedoch verwenden

$data = file_get_contents("php://input");

um einfach den http-Körper abzurufen und selbst damit umzugehen. Siehe PHP-Eingabe- / Ausgabestreams .

Aus Protokollsicht ist dies tatsächlich korrekter, da Sie ohnehin nicht wirklich mehrteilige http-Formulardaten verarbeiten. Verwenden Sie außerdem application / json als Inhaltstyp, wenn Sie Ihre Anfrage veröffentlichen.

Emil H.
quelle
7
Das Ausführen von json_decode (file_get_contents ("php: // input"), true) hat funktioniert. Danke
Peter Turner
Hat meiner Situation auch sehr geholfen! Danke Emil H!
Steve
FANTASTISCH. Ich hatte große Probleme mit Zend, weil ich dachte, es würde den Pfosten abstreifen. Eine einfache Extraktion, die für mich funktionierte. Außerdem hat Peter Turners json_decode () hinzugefügt, der ein \ stdClass-Objekt bereitstellt. Ich habe es für Garmin API-Ping-Antworten verwendet
JI-Web
120

Normalerweise wird der Parameter -dals formularcodiert interpretiert. Sie benötigen den -HParameter:

curl -v -H "Content-Type: application/json" -X POST -d '{"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json
Jim Carrig
quelle
18

Ich glaube, Sie erhalten ein leeres Array, da PHP erwartet, dass die veröffentlichten Daten in einem Querystring-Format vorliegen (key = value & key1 = value1).

Versuchen Sie, Ihre Curl-Anfrage zu ändern:

curl -i -X POST -d 'json={"screencast":{"subject":"tools"}}'  \
      http://localhost:3570/index.php/trainingServer/screencast.json

und sehen, ob das hilft.

Jordan S. Jones
quelle
Ja, das -H "Content-Type: application/json"hat bei mir nicht funktioniert.
PJ Brunet
13

Sie müssen einige zusätzliche Flags setzen, damit Curl die Daten als JSON sendet.

Befehl

$ curl -H "Content-Type: application/json" \
       -X POST \
       -d '{"JSON": "HERE"}' \
       http://localhost:3000/api/url

Flaggen

  • -H: Benutzerdefinierter Header, nächstes Argument wird voraussichtlich Header sein
  • -X: benutzerdefiniertes HTTP-Verb, nächstes Argument wird voraussichtlich Verb sein
  • -d: sendet das nächste Argument als Daten in einer HTTP-POST-Anforderung

Ressourcen

Chris Knadler
quelle
1

Sie sollten den Anführungszeichen wie folgt entkommen:

curl -i -X POST -d '{\"screencast\":{\"subject\":\"tools\"}}'  \
  http://localhost:3570/index.php/trainingServer/screencast.json

quelle
Unter Windows funktionierte dies tatsächlich für mich, aber mit doppelten Anführungszeichen, um die gesamte JSON-Zeichenfolge einzuschließen.
Meatvest
Unter Windows muss man sich doppelten Anführungszeichen entziehen, wie Josef oben vorgeschlagen hat. Er hat recht.
Bobo