Come post JSON, PHP con curl

Io possa essere il modo fuori base, ma ho cercato tutto il pomeriggio per eseguire il ricciolo di comando post in questo recesso framework PHP tutorial. Quello che non capisco è come sia PHP dovrebbe interpretare il mio POST, si tratta sempre come un array vuoto.

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

(Lo slash c’è solo per rendere me non sembrare un idiota, ma ho eseguito questo da windows con PHP 5.2, provato anche su un server Linux, stessa versione con Linux curl)

Ci deve essere qualcosa che mi manca, perché sembra piuttosto semplice, il post non è essere interpretato giusto, se così fosse, tutto sarebbe grande lavoro.

Questo è quello che ottengo indietro:

HTTP/1.1 409 Conflitto 
Data: Venerdì, 01 Maggio 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,"corpo":null, 
"dataUrl":null,"dataMedium":null,"createdOn":null,"autore":null}} 
  • Si potrebbe si prega di copiare e incollare il tuo .php file? Sei sicuro che l’URL localhost:3570/indice.php/trainingServer/screencast.json viene eseguito il tuo script? Non ha l’aspetto di un PHP URL.
  • Peter è l’utilizzo di un framework MVC di qualche tipo, dare un’occhiata a index.php in tale URL.
  • Sto usando Delphi per PHP (e quindi l’ :3570) e la Nicchia framework MVC w/out .il file htaccess, quindi il index.php/ nell’url.
  • Non dimenticate di inviare come application/json.
  • Hai bisogno di evadere virgolette, dude.
  • La sua non è necessario scappare virgolette, quando incorporamento semplici.
  • Che cosa fa l’-i flag di fare?

 

5 Replies
  1. 106

    Jordans analisi del perché il $_POST-array è vuoto è corretto. Tuttavia, è possibile utilizzare

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

    solo recuperare il corpo http e gestire da soli. Vedere PHP flussi input/output.

    Da un protocollo punto di vista questo è in realtà più corretto, dal momento che non sei veramente elaborazione http form multipart dati in ogni caso. Inoltre, è possibile utilizzare application/json come tipo di contenuto quando l’invio della vostra richiesta.

    • Bella risposta. +1
    • Facendo json_decode(file_get_contents(“php://input”), true) lavorato. Grazie
    • Veramente aiutato la mia situazione, come pure! Grazie Emil H!
    • FANTASTICO. Ho avuto un sacco di problemi con Zend pensiero era di spogliare il post.. Una semplice estrazione che ha funzionato per me. Anche Pietro Tornitori aggiunta di json_decode() fornire un \stdClass object. L’ho utilizzato per Garmin API ping risposte
  2. 121

    Normalmente il parametro -d viene interpretato come forma codificata. È necessario il -H parametro:

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

    Credo che hai trovato un array vuoto perché PHP è previsto che i dati pubblicati in Querystring formato (chiave=valore&key1=valore1).

    Provare a cambiare la tua curl richiesta:

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

    e vedere se questo aiuta.

    • Sì, il -H "Content-Type: application/json" non ha funzionato per me.
  4. 13

    È necessario impostare un paio di bandiere, in modo che curl invia i dati JSON.

    comando

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

    bandiere

    • -H: intestazione personalizzata, argomento successivo è previsto per essere intestazione
    • -X: HTTP personalizzato verbo, il prossimo argomento, è previsto il verbo
    • -d: invia il prossimo argomento di dati in una richiesta HTTP POST

    risorse

  5. 1

    Si dovrebbe sfuggire le virgolette come questo:

    curl -i -X POST -d '{\"screencast\":{\"subject\":\"tools\"}}'  \
      http://localhost:3570/index.php/trainingServer/screencast.json
    • In Windows questo in realtà ha lavorato per me, ma usando le virgolette per racchiudere l’intera stringa json.
    • su windows devi fuggire virgolette, come Josef suggerito sopra. Lui è di destra.

Lascia un commento