Cómo publicar JSON en PHP con curl

108

Puede que esté fuera de lugar, pero he estado intentando toda la tarde ejecutar el comando curl post en este tutorial de marco PHP de recreo. Lo que no entiendo es cómo se supone que PHP debe interpretar mi POST, siempre aparece como una matriz vacía.

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

(La barra inclinada es solo para que no parezca un idiota, pero ejecuté esto desde Windows usando PHP 5.2, también probé en un servidor Linux, la misma versión con Linux curl)

Debe haber algo que me falta porque parece bastante sencillo, la publicación simplemente no se interpreta correctamente, si lo fuera, todo funcionaría muy bien.

Esto es lo que recibo:

Conflicto HTTP / 1.1 409
Fecha: viernes, 01 de mayo de 2009 22:03:00 GMT
Servidor: Apache / 2.2.8 (Win32) PHP / 5.2.6
Desarrollado por X: PHP / 5.2.6
Codificación de transferencia: fragmentado
Tipo de contenido: texto / html; juego de caracteres = iso-8859-1

{"screencast": {"id": null, "subject": null, "body": null,
         "dataUrl": nulo, "dataMedium": nulo, "createdOn": nulo, "autor": nulo}}
Peter Turner
fuente
¿Podrías copiar y pegar tu archivo .php también? ¿Está seguro de que la URL localhost: 3570 / index.php / trainingServer / screencast.json ejecuta su script? No parece una URL de PHP.
pts
@pts; Peter está usando un marco MVC de algún tipo, eche un vistazo a index.php en esa URL.
Alan Storm
@pts Estoy usando Delphi para PHP (de ahí el: 3570) y el marco Recess MVC sin archivo .htaccess, de ahí el index.php / en la url.
Peter Turner
7
No olvide enviarlo como application/json.
Gumbo
1
No es necesario escapar de las comillas dobles al insertarlas en las simples.

Respuestas:

107

El análisis de Jordans de por qué la matriz $ _POST no está poblada es correcto. Sin embargo, puede utilizar

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

para recuperar el cuerpo http y manejarlo usted mismo. Consulte Flujos de entrada / salida de PHP .

Desde la perspectiva del protocolo, esto es en realidad más correcto, ya que de todos modos no está procesando datos de formularios http multiparte. Además, use application / json como tipo de contenido al publicar su solicitud.

Emil H
fuente
7
Hacer json_decode (file_get_contents ("php: // input"), true) funcionó. Gracias
Peter Turner
¡Realmente ayudó a mi situación también! ¡Gracias Emil H!
Steve
FANTÁSTICO. Estaba teniendo muchos problemas con Zend pensando que estaba quitando la publicación. Una extracción simple que funcionó para mí. También la adición de Peter Turner de json_decode () proporcionando un objeto \ stdClass. Lo usé para las respuestas de ping de la API de Garmin
JI-Web
120

Normalmente, el parámetro -dse interpreta como codificado en forma. Necesitas el -Hparámetro:

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

Creo que está obteniendo una matriz vacía porque PHP espera que los datos publicados estén en formato Querystring (clave = valor y clave1 = valor1).

Intente cambiar su solicitud de curl a:

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

y vea si eso ayuda a alguno.

Jordan S. Jones
fuente
Sí, -H "Content-Type: application/json"no funcionó para mí.
PJ Brunet
13

Debe configurar algunas banderas adicionales para que curl envíe los datos como JSON.

mando

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

banderas

  • -H: encabezado personalizado, se espera que el siguiente argumento sea el encabezado
  • -X: verbo HTTP personalizado, se espera que el siguiente argumento sea un verbo
  • -d: envía el siguiente argumento como datos en una solicitud HTTP POST

recursos

Chris Knadler
fuente
1

Deberías escapar de las comillas de esta manera:

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

fuente
En Windows, esto realmente funcionó para mí, pero usando comillas dobles para encerrar toda la cadena json.
Meatvest
en Windows, debe escapar de las comillas dobles como sugirió Josef anteriormente. El esta en lo correcto.
Bobo