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í


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'
});

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


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!


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);


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)


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.