Tengo un servidor JavaScript simple para procesar un comando POST. Pero los datos de mi publicación aparecen rodeados de llaves y comillas. Estoy usando curl para enviar esto:
curl --data {title:'Odessey',author:'Homer'} localhost:4444/test/add
Pero mi servidor obtiene los datos publicados así:
{ "{title:'Odessey',author:'Homer'}": '' }
Cuando lo devuelvo al cliente, aparece con espacios eliminados y comillas convertidas:
{"{title:'Odessey',author:'Homer'}":""}
Curiosamente, si pongo comillas alrededor de la cadena en curl, obtengo exactamente lo mismo:
curl --data "{title:'Odessey',author:'Homer'}" localhost:4444/test/add
Estoy ejecutando esto en Windows 10. El problema no parece estar relacionado con curl, porque escribí otro servidor (más torpe) sin usar express, y este problema no apareció. Además, probé las otras opciones de curl para enviar datos, como --data.ascii y --data.raw , pero ninguna me ayudó. Entonces el problema debe estar en el servidor express.
Además, registro el tipo de contenido de la solicitud antes de procesar los DATOS POST. De forma predeterminada, imprime application/x-www-form-urlencoded . Por sugerencia de otros usuarios, cambié el encabezado Content-Type en la instrucción curl diciendo curl -H Content-Type:application/json , pero eso no ayudó. La declaración de registro confirma que recibió este encabezado, pero luego no puede leer los datos en absoluto, registrando req.body: {} .
Aquí está mi código de servidor:
const express = require('express'); const app = express(); // taking this block out doesn't help. Without it, I don't get any data. app.use( express.urlencoded({ extended: true }) ); // Changing this to express.text() doesn't help. Nor does removing it. app.use(express.json()); app.post('/test/add', (req, res) => { let hdr = "Content-Type"; console.log(hdr, req.header(hdr)); console.log("req.body:", req.body); res.send(req.body); }) var server = app.listen(4444, function() { var urlStr = "http://" + host + ':' + port; console.log ("Example app listeneing at", urlStr); })Nota: he actualizado esto ligeramente desde que lo publiqué por primera vez.
Debería poder hacer esto agregando el siguiente encabezado: -H 'Content-Type: application/json' . Lo recibe como un parámetro GET (algo así como localhost:4444/test/add?{title:'Odessey',author:'Homer'} ).
Mario Martín Moreno tuvo una sugerencia muy útil para agregar una opción -H a mi comando curl. Esto era correcto, pero la forma no era del todo correcta. @dandavis tenía razón en que solo las comillas dobles eran válidas para las claves. Y @tevemader tenía razón en que estaba usando un archivo de encabezado de forma incorrecta. Pero el detalle crucial fue que necesitaba escapar de mis caracteres de cita con una barra invertida. Así que la línea de rizo completa se veía así:
curl --data {\"title\":\"Odessey\",\"author\":\"Homer\"} -H Content-Type:application/json localhost:4444/test/add
Advertencias: las comillas simples no funcionan incluso solo con los valores, e incluso con la barra invertida para escapar de ellos. Y todavía no sé por qué necesitaba hacer esto aquí, pero no con mi servidor anterior que no usaba express. Pero al menos sé cómo usar curl para enviar mis datos. Gracias a todos los que respondieron con sugerencias útiles.