Envíe datos POST a través de json sin procesar con cartero

107

Tengo Postman (el que no se abre en Chrome) y estoy tratando de hacer una solicitud POST usando raw json.

En la pestaña Cuerpo, tengo "sin procesar" seleccionado y "JSON (aplicación / json)" con este cuerpo:

{
    "foo": "bar"
}

Para el encabezado tengo 1, Content-Type: application/json

En el lado de PHP, solo lo estoy haciendo print_r($_POST);por ahora, y obtengo una matriz vacía.


Si uso jQuery y lo hago:

$.ajax({
    "type": "POST",
    "url": "/rest/index.php",
    "data": {
        "foo": "bar"
    }
}).done(function (d) {
    console.log(d);
});

Estoy obteniendo como esperaba:

Array
(
    [foo] => bar
)

Entonces, ¿por qué no funciona con Postman?


Capturas de pantalla del cartero:

ingrese la descripción de la imagen aquí

y encabezado:

ingrese la descripción de la imagen aquí

Dallas
fuente
Pruebe $ _REQUEST en lugar de $ _POST y var_dump () en lugar de print_r ()
Profundo
@Deep obtengo array(1) {["foo"]=> string(3) "bar"}con jQuery y todavía una matriz vacía con Postman:array(0) {}
Dallas
Entonces el cartero no envía la solicitud
Profundo
@smerny en su publicación fieldsy foono coincidirá, por lo tanto, no funcionará, no estoy seguro de si es un error tipográfico, pero asegúrese de que coincida
meda
@meda, cierto, eso fue un error tipográfico, pero si tuviera campos, aún debería tener salida en el volcado var de $ _REQUEST o $ _POST
Dallas

Respuestas:

38

A diferencia jQueryde lo que ocurre con la lectura en bruto JSON, deberá decodificarlo en PHP.

print_r(json_decode(file_get_contents("php://input"), true));

php://input es un flujo de solo lectura que le permite leer datos sin procesar del cuerpo de la solicitud.

$_POSTson variables de formulario, deberá cambiar al formbotón de radio y postmanluego usar:

foo=bar&foo2=bar2

Para publicar sin procesar jsoncon jquery:

$.ajax({
    "url": "/rest/index.php",
    'data': JSON.stringify({foo:'bar'}),
    'type': 'POST',
    'contentType': 'application/json'
});
meda
fuente
sí, las variables de publicación json vs publicación son diferentes
meda
43

Simplemente marque la opción JSON en el menú desplegable junto a binario; cuando haces clic en raw. Esto debería hacer

habilidad synon pasar json al cartero

Itachi
fuente
4
esta es una publicación bastante antigua ... pero si miras la pregunta, verás que hice exactamente eso. es posible que desee leer la pregunta, la respuesta seleccionada y los comentarios sobre la respuesta seleccionada para comprender mejor el problema y la solución.
Dallas
1
Claro, pero esto realmente identificó el problema que tenía; Había seleccionado "Texto", no aplicación / json, aunque eso ya se mencionó en la sección Encabezados. Es confuso; si elige "Texto", se muestra el "código" HTTP POST completo, incluido el JSON, que esperaba que funcionara, ya que es una llamada POST completa, no solo el json.
Ted
7

La respuesta de meda es completamente legítima, pero cuando copié el código, ¡recibí un error!

En algún lugar "php://input"hay un carácter no válido (¿quizás una de las comillas?).

Cuando escribí el "php://input"código manualmente, funcionó. ¡Me tomó un tiempo darme cuenta!

CoredusK
fuente
1
Me alegro de haber bajado un poco más y vi esto: estaba teniendo el mismo problema. ¡Buen descubrimiento!
Charlie Stanard
2
Parece que alguien lo arregló en una edición de la publicación de meda. Pero miré el historial de ediciones y encontré que la publicación original tenía 200c 200b(caracteres de ancho cero) entre la "n" y la "p" en "entrada". No estoy seguro de cómo terminó con eso, pero ahora está arreglado.
Dallas
6

Estaba enfrentando el mismo problema, el siguiente código funcionó para mí:

$params = (array) json_decode(file_get_contents('php://input'), TRUE);
print_r($params);

Neo
fuente
1

Instale la aplicación nativa Postman, la extensión de Chrome ha quedado obsoleta. (El mío se estaba abriendo en su propia ventana, pero aún se ejecutaba como aplicación de Chrome)

Jaroslav Štreit
fuente
2
Esto no responde a la pregunta.
jhpratt
@jhpratt en realidad lo hace. Tuve el mismo problema. Cuando se usó la aplicación Postman, funcionó. La pregunta es: Entonces, ¿por qué no funciona con Postman?
Jaroslav Štreit