Wie schreiben JSON mit curl PHP
Frage
kann ich weg Basis sein, aber ich habe den ganzen Nachmittag versucht zu laufen die curl Befehl POST in diesem Rahmen PHP tutorial Vertiefung. Was ich nicht verstehe, ist, wie ist PHP soll meine POST interpretieren, ist es immer als ein leeres Array kommt.
curl -i -X POST -d '{"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json
(Der Schrägstrich in gibt es nur, um mich wie ein Idiot aussehen nicht, aber ich ausgeführt diese aus den Fenstern mit PHP 5.2, auch versucht, auf einem Linux-Server, gleiche Version mit Linux curl)
Es ist etwas sein muss ich vermisst habe, weil es ziemlich einfach scheint, ist die Post einfach nicht richtig interpretiert werden, wenn es war, würde alles super funktioniert.
Dies ist, was ich zurück:
HTTP/1.1 409 Conflict Date: Fri, 01 May 2009 22:03:00 GMT Server: Apache/2.2.8 (Win32) PHP/5.2.6 X-Powered-By: PHP/5.2.6 Transfer-Encoding: chunked Content-Type: text/html; charset=iso-8859-1 {"screencast":{"id":null,"subject":null,"body":null, "dataUrl":null,"dataMedium":null,"createdOn":null,"author":null}}
Lösung
Jordans Analyse, warum die $ _POST-Array wird nicht aufgefüllt korrekt ist. Allerdings können Sie
$data = file_get_contents("php://input");
nur den http Körper abrufen und diese selbst behandeln. Siehe PHP Input / Output-Streams .
Aus einem Protokoll Perspektive ist dies tatsächlich mehr richtig, da Sie nicht wirklich verarbeiten http mehrteiliger Formulardaten sowieso. Verwenden Sie auch application / json als Content-Typ, wenn Ihre Anfrage veröffentlichen.
Andere Tipps
Normalerweise wird der Parameter -d
als form codiert interpretiert. Sie müssen den -H
Parameter:
curl -v -H "Content-Type: application/json" -X POST -d '{"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json
Ich glaube, Sie ein leeres Array bekommen, weil PHP die gebuchten Daten erwartet werden in einem Abfragezeichenformat (key = value & key1 = value1).
Versuchen Sie curl Anfrage Wechsel an:
curl -i -X POST -d 'json={"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json
und sehen, ob das hilft jeder.
Sie müssen ein paar zusätzlichen Flags setzen, so dass curl die Daten als JSON sendet.
Befehl
$ curl -H "Content-Type: application/json" \
-X POST \
-d '{"JSON": "HERE"}' \
http://localhost:3000/api/url
Flags
-
-H
: benutzerdefinierte Header, wird als nächstes Argument erwartet Header sein
-
-X
: benutzerdefinierte HTTP-Verb, wird als nächstes Argument erwartet Verb sein
-
-d
: sendet das nächste Argument als Daten in einer HTTP-POST-Anfrage
Ressourcen
Sie sollten die Angebote wie folgt entkommen:
curl -i -X POST -d '{\"screencast\":{\"subject\":\"tools\"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json