Comment publier du JSON en PHP avec curl
Question
Je suis peut-être bien éloigné de la base, mais j'ai essayé tout l'après-midi de lancer la curl post command dans ce tutoriel sur le framework PHP. Ce que je ne comprends pas, c'est comment PHP est supposé interpréter mon POST, il apparaît toujours comme un tableau vide.
curl -i -X POST -d '{"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json
(La barre oblique ici est juste pour que je ne ressemble pas à un idiot, mais je l'ai exécuté depuis Windows en utilisant PHP 5.2, également essayé sur un serveur Linux, même version avec Linux curl)
Il doit y avoir quelque chose qui me manque parce que cela semble assez simple, le message ne doit tout simplement pas être interprété correctement. Si tel était le cas, tout fonctionnerait très bien.
C’est ce que je récupère:
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}}
La solution
L'analyse de Jordans expliquant pourquoi le tableau $ _POST n'est pas rempli est correcte. Cependant, vous pouvez utiliser
$data = file_get_contents("php://input");
pour récupérer le corps http et le manipuler vous-même. Consultez les flux d'entrée / de sortie PHP .
Du point de vue du protocole, cela est en fait plus correct, car vous ne traitez pas vraiment de données de formulaire multipart http. Utilisez également application / json en tant que type de contenu lorsque vous publiez votre demande.
Autres conseils
Normalement, le paramètre -d
est interprété comme codé en forme. Vous avez besoin du paramètre -H
:
curl -v -H "Content-Type: application/json" -X POST -d '{"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json
Je pense que vous obtenez un tableau vide, car PHP s'attend à ce que les données publiées soient au format Querystring (clé = valeur & clé1 = valeur1).
Essayez de changer votre demande de curl en:
curl -i -X POST -d 'json={"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json
et voyez si cela vous aide.
Vous devez définir quelques indicateurs supplémentaires pour que curl envoie les données au format JSON.
commande
$ curl -H "Content-Type: application/json" \
-X POST \
-d '{"JSON": "HERE"}' \
http://localhost:3000/api/url
drapeaux
-
-H
: en-tête personnalisé, le prochain argument devrait être en-tête -
-X
: verbe HTTP personnalisé, le prochain argument devrait être verbe -
-d
: envoie le prochain argument sous forme de données dans une requête HTTP POST
ressources
Vous devriez échapper aux guillemets comme ceci:
curl -i -X POST -d '{\"screencast\":{\"subject\":\"tools\"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json