Domanda

Potrei essere lontano dalla base, ma ho provato tutto il pomeriggio a eseguire the curl post command in questo tutorial del framework PHP sull'incavo. Quello che non capisco è come PHP dovrebbe interpretare il mio POST, che 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 qui dentro è solo per 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)

Dev'esserci qualcosa che mi manca perché sembra piuttosto semplice, il post non viene interpretato nel modo giusto, se lo fosse, tutto funzionerebbe alla grande.

Questo è quello che torno indietro:

HTTP/1.1 409 Conflict
Date: Fri, 01 May 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,"body":null,
         "dataUrl":null,"dataMedium":null,"createdOn":null,"author":null}}
È stato utile?

Soluzione

L'analisi jordans del perché l'array $ _POST non è popolato è corretta. Tuttavia, puoi usare

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

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

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

Altri suggerimenti

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

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

Credo che stai ottenendo un array vuoto perché PHP si aspetta che i dati inviati siano in un formato Querystring (key = value & amp; key1 = value1).

Prova a cambiare la tua richiesta di arricciatura in:

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

e vedi se questo aiuta.

Devi impostare alcuni flag extra in modo che l'arricciatura 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, il prossimo argomento dovrebbe essere intestazione
  • -X : verbo HTTP personalizzato, il prossimo argomento dovrebbe essere verbo
  • -d : invia l'argomento successivo come dati in una richiesta POST HTTP

risorse

Dovresti sfuggire alle virgolette in questo modo:

curl -i -X POST -d '{\"screencast\":{\"subject\":\"tools\"}}'  \
  http://localhost:3570/index.php/trainingServer/screencast.json
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top