web-dev-qa-db-fra.com

Comment publier du JSON sur PHP avec curl

Je suis peut-être bien éloigné de la base, mais j'ai essayé tout l'après-midi de courir la commande curl post dans cet évidement 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

(Le slash dedans 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 n’est tout simplement pas interprété correctement. Si c’était le cas, tout fonctionnerait très bien.

Voici ce que je récupère:

 HTTP/1.1 409 Conflit 
 Date: vendredi, 1er mai 2009 22:03:00 GMT 
 Serveur: 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, "sujet": null, "body": null, 
 "dataUrl": null, "dataMedium": null, "createdOn": null, "author": null}} 
108
Peter Turner

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

juste récupérer le corps http et le manipuler vous-même. Voir flux d'entrée/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.

105
Emil H

Normalement, le paramètre -d est interprété comme codé en forme. Vous avez besoin du -H paramètre:

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

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 pour:

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

et voir si cela aide tout.

18
Jordan S. Jones

Vous devez définir quelques indicateurs supplémentaires afin que curl envoie les données au format JSON.

commander

$ 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

13
Chris Knadler

Vous devriez échapper aux citations comme ceci:

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