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}}

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.


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

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.


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


1

Vous devriez échapper aux guillemets comme ceci:

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.