Obtener el cuerpo de un POST HTTP en Express.js

Introducción

En este breve artículo repasaremos cómo extraer información de un cuerpo POST en Express.js. El protocolo HTTP proporciona varias formas de pasar información de un cliente a un servidor, siendo los cuerpos POST el método más flexible y más utilizado para enviar datos a través de HTTP.

Otra forma, que se suele utilizar para diferentes casos de uso, es transmitir información utilizando cadenas de consulta o parámetros de URL. Para más información, echa un vistazo a cómo obtener cadenas de consulta y parámetros en Express.js.

Para este artículo asumo que tienes algo de experiencia con Node.js y la creación de servidores simples de Express.js.

Envío de datos POST en HTTP

Los datos pueden ser enviados a través de una llamada HTTP POST por muchas razones, siendo algunas de las más comunes a través de un HTML <form> o una petición API. Los datos pueden adoptar diferentes formas, siendo las más comunes:

  • application/x-www-form-urlencoded: Los datos en esta codificación están formateados como una cadena de consulta que verías en una URL, con paris clave-valor separados por & caracteres. Por ejemplo: foo=bar&abc=123&stack=abuse. Esta es la codificación por defecto.
  • multipart/form-data: Esta codificación se suele utilizar para el envío de archivos. En definitiva, cada key-value se envía en la misma petición, pero diferentes «partes», que están separadas por «fronteras» e incluyen más metadatos.
  • text/plain: Estos datos se envían simplemente como texto plano no estructurado, y normalmente no se utilizan.

Una petición HTTP POST sin procesar con la codificación application/x-www-form-urlencoded podría tener este aspecto:

POST /signup HTTP/1.1Host: example.comContent-Type: application/x-www-form-urlencodedContent-Length: 53username=scott&password=secret&website=stackabuse.com

Extrayendo datos POST

Antes de que podamos empezar a acceder a los datos POST de inmediato, necesitamos configurar adecuadamente nuestra app Express. Esta configuración debe hacerse ya que no todos los servidores de aplicaciones web necesitan el análisis del cuerpo, y el análisis del cuerpo que se habilita depende de su aplicación.

Para configurar esto, vamos a utilizar el paquete body-parser, que puede manejar muchas formas de datos. Este paquete es un middleware que intercepta el cuerpo en bruto y lo analiza en una forma que el código de tu aplicación puede utilizar fácilmente.

// index.jsconst express = require('express');const bodyParser = require('body-parser');const app = express();app.use(bodyParser.urlencoded({ extended: true }));app.post('/post-test', (req, res) => { console.log('Got body:', req.body); res.sendStatus(200);});app.listen(8080, () => console.log(`Started server at http://localhost:8080!`));

Nota cómo llamamos a app.use(...) antes de definir nuestra ruta. El orden aquí es importante. Esto asegurará que el body-parser se ejecute antes que nuestra ruta, lo que asegura que nuestra ruta pueda entonces acceder al cuerpo HTTP POST analizado.

Para probar esto, primero iniciaremos la aplicación Express y luego usaremos la utilidad curl en una ventana de consola diferente:

$ curl -d "username=scott&password=secret&website=stackabuse.com" -X POST http://localhost:8080/post-testOK
$ node index.jsStarted server at http://localhost:8080!Got body: { username: 'scott', password: 'secret', website: 'stackabuse.com' }

Aquí puedes ver que los datos de la cadena de consulta fueron analizados en un objeto JavaScript al que podemos acceder fácilmente.

Another important thing to note is our use of the extended option when calling bodyParser.urlencoded. Using the extended option tells body-parser to use the qs library to parse the URL-encoded data. This allows for things like objects and arrays to be encoded into the URL-encoded format.

And while urlencoded is one of the most commonly used parsers that body-parser provides, you can also use the following:

  • .json(): Parses JSON-formatted text for bodies with a Content-Type of application/json.
  • .raw(): Parses HTTP body in to a Buffer for specified custom Content-Types, although the default accepted Content-Type is application/octet-stream.
  • .text(): Analiza los cuerpos HTTP con un Content-Type de text/plain, que lo devuelve como una cadena sin formato.
  • Cada uno de estos analizadores también admite el inflado automático de los datos codificados con gzip o deflate, por lo que la compresión puede seguir utilizándose de forma transparente sin ningún trabajo adicional por parte del código de tu aplicación.

    Lo mejor del modelo de middleware y de la forma en que este paquete analiza los datos es que no estás atado a usar sólo un analizador. Puedes habilitar uno o más analizadores para tu aplicación para asegurarte de que todos los tipos de datos se procesan correctamente:

// index.jsconst express = require('express');const bodyParser = require('body-parser');const app = express();app.use(bodyParser.urlencoded({ extended: true }));app.use(bodyParser.json());app.use(bodyParser.raw());// ...

Así que ahora si enviáramos una petición HTTP POST con JSON como cuerpo, se analizará en un objeto JSON normal en la propiedad req.body:

POST /post-test HTTP/1.1Host: localhost:8080Content-Type: application/jsonContent-Length: 69'{"username":"scott","password":"secret","website":"stackabuse.com"}'
$ node index.jsStarted server at http://localhost:8080!Got body: { username: 'scott', password: 'secret', website: 'stackabuse.com' }

Conclusión

La forma más común de enviar diversas y grandes cantidades de datos a través de HTTP es utilizar el método POST. Antes de que podamos acceder fácilmente a estos datos en el lado del servidor en Express, necesitamos utilizar algún middleware, como el paquete body-parser, para analizar los datos en un formato al que podamos acceder fácilmente. Una vez analizados los datos de la petición HTTP sin procesar, se puede acceder a ellos a través de la propiedad body del objeto req.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.