Comment publier du JSON sur PHP avec curl

108

Je suis peut-être loin de la base, mais j'ai essayé tout l'après-midi d'exécuter la commande curl post dans ce tutoriel sur le framework PHP. Ce que je ne comprends pas, c'est comment PHP est censé 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 là-dedans sert juste à ne pas me faire ressembler à un idiot, mais j'ai exécuté cela à partir de 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 car 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 reçois:

Conflit HTTP / 1.1 409
Date: ven 01 mai 2009 22:03:00 GMT
Serveur: Apache / 2.2.8 (Win32) PHP / 5.2.6
X-Powered-By: PHP / 5.2.6
Encodage de transfert: fragmenté
Content-Type: texte / html; jeu de caractères = iso-8859-1

{"screencast": {"id": null, "subject": null, "body": null,
         "dataUrl": null, "dataMedium": null, "createdOn": null, "author": null}}
Peter Turner
la source
Pouvez-vous également copier-coller votre fichier .php? Êtes-vous sûr que l'URL localhost: 3570 / index.php / trainingServer / screencast.json exécute votre script? Cela ne ressemble pas à une URL PHP.
pts
@pts; Peter utilise un framework MVC, jetez un œil à index.php dans cette URL.
Alan Storm
@pts J'utilise Delphi pour PHP (d'où le: 3570) et le framework Recess MVC sans fichier .htaccess, d'où l'index.php / dans l'url.
Peter Turner
7
N'oubliez pas de l'envoyer en tant que application/json.
Gumbo
1
Il n'est pas nécessaire d'échapper aux guillemets doubles lors de leur intégration dans des simples.

Réponses:

107

L'analyse de Jordans sur la raison pour laquelle le tableau $ _POST n'est pas rempli est correcte. Cependant, vous pouvez utiliser

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

pour simplement récupérer le corps http et le gérer vous-même. Voir les flux d'entrée / sortie PHP .

Du point de vue du protocole, c'est en fait plus correct, puisque vous ne traitez pas vraiment de données de forme multipart http de toute façon. Utilisez également application / json comme type de contenu lors de la publication de votre demande.

Emil H
la source
7
Faire json_decode (file_get_contents ("php: // input"), true) fonctionnait. Merci
Peter Turner
Vraiment aidé ma situation aussi! Merci Emil H!
Steve
FANTASTIQUE. J'avais beaucoup de mal avec Zend en pensant qu'il supprimait le message. Une simple extraction qui a fonctionné pour moi. Peter Turners a également ajouté json_decode () fournissant un objet \ stdClass. Je l'ai utilisé pour les réponses ping de l'API Garmin
JI-Web
120

Normalement, le paramètre -dest interprété comme codé au format. Vous avez besoin du -Hparamètre:

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

Je crois que vous obtenez un tableau vide parce que 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 en aide.

Jordan S. Jones
la source
Oui, cela -H "Content-Type: application/json"n'a pas fonctionné pour moi.
PJ Brunet
13

Vous devez définir quelques indicateurs supplémentaires pour 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 l'en-tête
  • -X: verbe HTTP personnalisé, le prochain argument devrait être le verbe
  • -d: envoie l'argument suivant sous forme de données dans une requête HTTP POST

Ressources

Chris Knadler
la source
1

Vous devriez échapper aux guillemets comme ceci:

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

la source
Sous Windows, cela a fonctionné pour moi, mais en utilisant des guillemets doubles pour entourer toute la chaîne json.
meatvest
sur Windows, vous devez échapper les guillemets doubles comme Josef l'a suggéré ci-dessus. Il a raison.
Bobo