Come pubblicare JSON su PHP con curl


108

Potrei essere fuori base, ma ho provato tutto il pomeriggio a eseguire il comando curl post in questo tutorial sul framework PHP. Quello che non capisco è come PHP dovrebbe interpretare il mio POST, si presenta sempre come un array vuoto.

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

(La barra lì dentro è solo per non farmi sembrare un idiota, ma l'ho eseguito da Windows usando PHP 5.2, provato anche su un server Linux, stessa versione con Linux curl)

Deve esserci qualcosa che mi manca perché sembra piuttosto semplice, il post non può essere interpretato correttamente, se lo fosse, tutto funzionerebbe alla grande.

Questo è quello che ricevo:

HTTP / 1.1 409 Conflitto
Data: venerdì 1 maggio 2009 22:03:00 GMT
Server: Apache / 2.2.8 (Win32) PHP / 5.2.6
X-Powered-By: PHP / 5.2.6
Codifica di trasferimento: a blocchi
Tipo di contenuto: testo / html; charset = iso-8859-1

{ "Screencast": { "id": null, "oggetto": null, "corpo": null,
         "DataURL": null, "dataMedium": null, "createdOn": null, "autore": null}}

Puoi copiare e incollare anche il tuo file .php? Sei sicuro che l'URL localhost: 3570 / index.php / trainingServer / screencast.json esegua lo script? Non sembra un URL PHP.
pts

@pts; Peter sta usando un framework MVC di qualche tipo, dai un'occhiata a index.php in quell'URL.
Alan Storm

@pts Sto usando Delphi per PHP (da cui il: 3570) e il framework Recess MVC senza file .htaccess, da qui index.php / nell'url.
Peter Turner

7
Non dimenticare di inviarlo come application/json.
Gumbo

1
Non è necessario sfuggire alle virgolette doppie quando vengono incorporate in quelle semplici.

Risposte:


107

L'analisi di Jordan del motivo per cui l'array $ _POST non viene popolato è corretta. Tuttavia, puoi usare

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

per recuperare solo il corpo http e gestirlo da soli. Vedere Flussi di input / output PHP .

Dal punto di vista del protocollo questo è effettivamente più corretto, dal momento che non stai comunque elaborando i dati del modulo multipart http. Inoltre, usa application / json come tipo di contenuto quando pubblichi la tua richiesta.


7
L'esecuzione di json_decode (file_get_contents ("php: // input"), true) ha funzionato. Grazie
Peter Turner

Ha davvero aiutato anche la mia situazione! Grazie Emil H!
Steve

FANTASTICO. Avevo molti problemi con Zend pensando che stesse rimuovendo il palo .. Una semplice estrazione che ha funzionato per me. Inoltre Peter Turners ha aggiunto json_decode () fornendo un oggetto \ stdClass. L'ho usato per le risposte ping dell'API Garmin
JI-Web

120

Normalmente il parametro -dviene interpretato come codificato in forma. Hai bisogno del -Hparametro:

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

18

Credo che tu stia ottenendo un array vuoto perché PHP si aspetta che i dati pubblicati siano in un formato Querystring (chiave = valore e chiave1 = valore1).

Prova a modificare la tua richiesta di ricciolo in:

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

e vedi se questo aiuta.


Sì, -H "Content-Type: application/json"non ha funzionato per me.
PJ Brunet

13

È necessario impostare alcuni flag aggiuntivi in ​​modo che curl invii i dati come JSON.

comando

$ curl -H "Content-Type: application/json" \
       -X POST \
       -d '{"JSON": "HERE"}' \
       http://localhost:3000/api/url

bandiere

  • -H: intestazione personalizzata, l'argomento successivo dovrebbe essere l'intestazione
  • -X: verbo HTTP personalizzato, il prossimo argomento dovrebbe essere verbo
  • -d: invia l'argomento successivo come dati in una richiesta HTTP POST

risorse


1

Dovresti sfuggire alle virgolette in questo modo:

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

Su Windows questo ha effettivamente funzionato per me, ma utilizzando le virgolette doppie per racchiudere l'intera stringa json.
Meatvest

su Windows devi evitare le virgolette doppie come suggerito sopra da Josef. Ha ragione lui.
Bobo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.