Como postar JSON para PHP com a onda
Pergunta
Eu posso ser maneira fora da base, mas eu tenho tentado toda a tarde para executar o enrolar posto de comando neste recesso framework PHP tutorial. O que eu não entendo é como é PHP suposto interpretar meu post, ele sempre aparece como uma matriz vazia.
curl -i -X POST -d '{"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json
(A barra lá é só para me fazer não parecer um idiota, mas eu executado este a partir do Windows usando PHP 5.2, também tentou em um servidor Linux, mesma versão com Linux curl)
Deve haver algo que eu estou ausente porque parece bastante simples, o post não é apenas ser interpretada direito, se fosse, tudo seria um grande trabalho.
Isto é o que eu voltar:
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}}
Solução
análise Jordans de por que o $ _POST-matriz não é preenchida está correto. No entanto, você pode usar
$data = file_get_contents("php://input");
apenas para recuperar o corpo http e lidar com isso sozinho. Consulte PHP entrada / saída córregos .
De uma perspectiva protocolo este é realmente mais correto, desde que você não está realmente processando http multipart dados do formulário de qualquer maneira. Além disso, a aplicação de uso / json como do tipo de conteúdo ao postar o seu pedido.
Outras dicas
Normalmente a -d
parâmetro é interpretado como forma codificada. Você precisa do parâmetro -H
:
curl -v -H "Content-Type: application/json" -X POST -d '{"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json
Eu acredito que você está recebendo um array vazio porque o PHP está esperando os dados postados para estar em um formato QueryString (key = value & key1 = value1).
Tente alterar o seu pedido curl para:
curl -i -X POST -d 'json={"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json
e ver se isso ajuda qualquer.
Você precisa definir algumas bandeiras extras para que onda envia os dados como JSON.
comando
$ curl -H "Content-Type: application/json" \
-X POST \
-d '{"JSON": "HERE"}' \
http://localhost:3000/api/url
bandeiras
-
-H
: cabeçalho personalizado, próximo argumento é esperado para estar de cabeçalho -
-X
: personalizado HTTP verbo, próximo argumento é esperado para ser verbo -
-d
: envia o próximo argumento como dados em uma solicitação HTTP POST
recursos
Você deve escapar as aspas como este:
curl -i -X POST -d '{\"screencast\":{\"subject\":\"tools\"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json