Estoy tratando de PUBLICAR un objeto JSON usando fetch .
Por lo que puedo entender, necesito adjuntar un objeto en cadena al cuerpo de la solicitud, por ejemplo:
fetch("/echo/json/",
{
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
method: "POST",
body: JSON.stringify({a: 1, b: 2})
})
.then(function(res){ console.log(res) })
.catch(function(res){ console.log(res) })
Al usar el json echo de jsfiddle, esperaría ver el objeto que he enviado ( {a: 1, b: 2}
) de regreso, pero esto no sucede: las herramientas de Chrome no muestran el JSON como parte de la solicitud, lo que significa que no se está enviando.
javascript
json
fetch-api
Maquinilla de afeitar
fuente
fuente
{}
res.json()
Debería volver{a: 1, b: 2}
.json
propiedad que contiene los datos que desea enviar. Sin embargo, nobody
estoy siendo tratado correctamente de todos modos. Vea este violín para ver que se omite el retraso de 5 segundos. jsfiddle.net/99arsnkg Además, cuando intenta agregar encabezados adicionales, se ignoran. Este es probablemente un problema enfetch()
sí mismo.Respuestas:
Con el
async/await
soporte ES2017 , así es comoPOST
una carga útil JSON:¿No puedes usar ES2017? Ver la respuesta de @ vp_art usando promesas
Sin embargo, la pregunta es pedir un problema causado por un error de Chrome solucionado hace mucho tiempo.
La respuesta original sigue.
Este es el problema real aquí , y es un error con las herramientas de Chrome, solucionado en Chrome 46.
Ese código funciona bien: está PUBLICANDO el JSON correctamente, simplemente no se puede ver.
eso no funciona porque ese no es el formato correcto para el eco de JSfiddle .
El código correcto es:
Para los puntos finales que aceptan cargas JSON, el código original es correcto
fuente
x-www-form-urlencoded
) con datos JSON en un campo llamadojson
. Entonces los datos están doblemente codificados. Para una publicación JSON limpia, vea la respuesta de @vp_arth a continuación.res.ok
en caso de que el código de respuesta sea algún tipo de error. También sería bueno tener una.catch()
cláusula al final. Me doy cuenta de que esto es solo un fragmento de muestra, pero tenga esto en cuenta para el uso en el mundo real.Creo que su problema es solo
jsfiddle
procesar laform-urlencoded
solicitud.Pero la forma correcta de hacer una solicitud json es pasar correctamente
json
como un cuerpo:fuente
x-www-form-urlencoded
vsapplication/json
, ya sea que no coincidan o que doblen JSON en cadenas codificadas en url./echo
ruta de jsfiddle ?Desde los motores de búsqueda, terminé en este tema para publicar datos que no son de Json con fetch, así que pensé en agregar esto.
Para los que no son json , no tiene que usar datos de formulario. Simplemente puede establecer el
Content-Type
encabezadoapplication/x-www-form-urlencoded
y usar una cadena:Una forma alternativa de construir esa
body
cadena, en lugar de escribirla como hice anteriormente, es usar bibliotecas. Por ejemplo, lastringify
función dequery-string
oqs
paquetes. Entonces usar esto se vería así:fuente
Después de pasar algunas veces, realice ingeniería inversa jsFiddle, tratando de generar carga útil: hay un efecto.
Esté atento (en línea)
return response.json();
cuando la respuesta no sea una respuesta, es una promesa.jsFiddle: http://jsfiddle.net/egxt6cpz/46/ && Firefox> 39 && Chrome> 42
fuente
'x-www-form-urlencoded
lugarapplication/json
? ¿Cual es la diferencia?application/json
es la forma correcta y funciona ahora. Gracias por un buen ojofetch
( stackoverflow.com/questions/41984893/… ) en su lugarapplication/json
. Quizás sabes por qué ...Content-Type
esapplication/json
, pero su realbody
parece serx-www-form-urlencoded
- ¿No creo que esto debería funcionar? Si funciona, su servidor debe ser bastante indulgente. La respuesta de @vp_arth a continuación parece ser la correcta.He creado una envoltura delgada alrededor de fetch () con muchas mejoras si está utilizando una API REST puramente json:
Para usarlo tienes la variable
api
y 4 métodos:Y dentro de una
async
función:Ejemplo con jQuery:
fuente
Object.assign
? debería serObject.assign({}, api.headers, headers)
porque no quieres seguir agregando customheaders
en hash de commonapi.headers
. ¿Correcto?Esto está relacionado con
Content-Type
. Como habrás notado en otras discusiones y respuestas a esta pregunta, algunas personas pudieron resolverlo configurandoContent-Type: 'application/json'
. Desafortunadamente en mi caso no funcionó, mi solicitud POST todavía estaba vacía en el lado del servidor.Sin embargo, si prueba con jQuery's
$.post()
y está funcionando, la razón probablemente sea porque jQuery usa enContent-Type: 'x-www-form-urlencoded'
lugar deapplication/json
.fuente
Tuve el mismo problema: no
body
se envió un mensaje desde un cliente a un servidor.Agregar
Content-Type
encabezado lo resolvió para mí:fuente
La respuesta principal no funciona para PHP7, porque tiene una codificación incorrecta, pero podría encontrar la codificación correcta con las otras respuestas. Este código también envía cookies de autenticación, que probablemente desee cuando se trata, por ejemplo, de foros PHP:
fuente
Puede ser útil para alguien:
Estaba teniendo el problema de que los datos de formulario no se enviaban para mi solicitud
En mi caso, fue una combinación de los siguientes encabezados que también estaban causando el problema y el tipo de contenido incorrecto.
Entonces estaba enviando estos dos encabezados con la solicitud y no estaba enviando los datos de formulario cuando eliminé los encabezados que funcionaban.
Además, como otras respuestas sugieren que el encabezado Content-Type debe ser correcto.
Para mi solicitud, el encabezado correcto de Content-Type era:
En resumen, si sus datos de formulario no se adjuntan a la Solicitud, podrían ser sus encabezados. Intente llevar sus encabezados al mínimo y luego intente agregarlos uno por uno para ver si su problema está resuelto.
fuente
Creo que, no necesitamos analizar el objeto JSON en una cadena, si el servidor remoto acepta json en su solicitud, simplemente ejecute:
Tal como la solicitud de rizo
En caso de que el servicio remoto no acepte un archivo json como cuerpo, simplemente envíe un formulario de datos:
Tal como la solicitud de rizo
fuente
curl
comando está haciendo implícitamente! Si no encadena sus objetos antes de pasarlosbody
, simplemente los enviará"[object Object]"
como el cuerpo de su solicitud. Una simple prueba en Dev Tools te mostrará eso. Ábrelo e intenta esto sin salir de esta pestaña:a = new FormData(); a.append("foo","bar"); fetch("/foo/bar", { method: 'POST', body: {}, headers: { 'Content-type': 'application/json' } })
Si su carga útil JSON contiene matrices y objetos anidados, usaría
URLSearchParams
elparam()
método jQuery .Para su servidor, esto se verá como un HTML estándar que se
<form>
estáPOST
editando.fuente