> Manuales > Manual de NestJS

Cómo crear rutas con el método POST del HTTP. Cómo enviar datos en el cuerpo de la solicitud y cómo recibirlos desde el controlador con @Body(), en aplicaciones con el framework NestJS.

Atender a solicitudes POST con NestJS

En el día a día del desarrollo de aplicaciones y web services una de las operaciones más habituales con HTTP es el envío de datos por POST. El método POST no es más que uno de los muchos que soporta HTTP, generamente usado cuando queremos realizar una operación de inserción.

La característica más relevante de las solicitudes POST es que en ellas nos enviarán datos mediante el cuerpo de la solicitud. Esos datos definirán el elemento del recurso que se desea insertar.

Crear una ruta con Post en NestJS es tan sencillo como usar el decorador @Post, pero además tenemos que aprender a recibir los datos que se envían en la solicitud y poder operar mediante ellos para componer la respuesta. Sobre todo esto vamos a tratar en este artículo.

Cómo definir una ruta POST en un controlador en Nest

Para crear una ruta con el verbo del HTTP "post" simplemente tenemos que usar el decorador @Post. El trabajo es bien similar al que vimos en rutas anteriores realizadas con @Get.

@Post()
createProduct() {
  return 'Estamos atendiendo una solicitud de tipo Post';
}

No te olvides de importar la declaración del decorador desde '@nestjs/common'. A veces se nos puede olvidar a nosotros mencionar que debes realizar esos imports, pero nunca debes olvidarlo tú ¿vale? Si tienes las extensiones adecuadas para TypeScript en tu editor de código estos imports pueden ser automáticos.

Cómo invocar una solicitud con POST

Para poder probar este tipo de solicitudes necesitamos algo más que simplemente escribir la ruta en la barra de direcciones del navegador, ya que ese tipo de solicitudes siempre es GET.

Para hacer una solicitud POST necesitaríamos construir un formulario en HTML (configurado correctamente), o mejor un código de Javascript del cliente para crear esa solicitud Ajax por post. Sin embargo, como es poco práctico andar construyendo un formulario o código Javascript de cliente para poder probar este endpoint, la mejor opción es usar un software distinto que el propio navegador.

Algunos programas útiles son Postman o Insomnia, que esperamos que hayas usado alguna vez. Si no es así en este artículo te damos unas breves guías sobre Postman, que es la aplicación más popular para realizar este tipo de tareas. Si te interesa puedes entrar en: Cómo usar Postman para probar nuestras APIs.

En esta colección encuentras los enlaces a las herramientas más comunes para trabajar con APIs y JSON.

Una vez creada en Postman esta request, podrás ver la salida de la manera como muestra esta imagen.

Pantalla de postman al crear la request post

El resultado de esta solicitud, tal como lo tenemos ahora, es tan simple como mostrar un texto de salida, pero ahora lo complicaremos algo más.

Cómo recibir los datos que llegan por POST

Lo normal en una solicitud por POST es que el usuario nos mande información, que puede ser variable en función de las necesidades de la aplicación. En este supuesto request POST lo que se supone es que nos enviarán datos para crear un nuevo artículo. Esos datos podrían ser el nombre del artículo, su descripción y cosas similares.

Desde nuestro código en NestJS debemos acceder a esos datos, que nos llegan en el body, o cuerpo, de la solicitud. Como en otras ocasiones, usaremos un decorador para poder acceder a ellos de una manera cómoda.

El decorador que vamos a aprender ahora se llama @Body y lo usamos en el parámetro del método que resuelve esta request. Este decorador provocará que el parámetro decorado contenga un valor con todos los datos recibidos en el request POST. Los datos por tanto los podremos usar normalmente dentro del código del método, por medio del parámetro decorado.

El código se verá más o menos como sigue.

@Post()
createProduct(@Body() body) {
  return `Creo un producto ${body.name} con descripción ${body.description}`;
}

Si quieres, para depurar mejor el cuerpo de la request, puedes probar por devolver el mismo objeto body tal como lo recibes, para certificarte que estás recibiendo alguna cosa por post, o te está llegando vacío el contenido de body, que es perfectamente posible si no envias correctamente la solicitud desde Postman.

@Post()
createProduct(@Body() body) {
  return body;
}

De nuevo, ahora te referimos al artículo sobre Cómo usar Postman para que veas cómo tienes que crear el objeto JSON en Postman para que se envíe correctamente al backend.

Recibir los datos POST del body por su nombre

Hay una manera diferente de proceder, si lo deseamos, a la hora de recibir los datos que vienen por post, que es simplemente indicar el nombre del dato que vamos a recibir, dentro de la firma del método.

Para ello, en el decorador @Body() enviaremos como parámetro el nombre del atributo que vamos a recibir. De este modo estaremos recibiendo los datos de uno en uno, por lo que estaremos obligados a repetir el decorador para cada dato recibido. El código sería como este:

@Post()
createProduct(
  @Body('name') name: string, 
  @Body('description') description: string
) {
  return `Creo el producto ${name} con descripción ${description}.`;
}

Una vez enviada la solicitud, el resultado será similar al que teníamos antes. En Postman tendrás una pantalla de la request más o menos como esta:

Pantalla de postman sobre cómo queda el resultado del envío de un JSON por post

Conclusión

Hemos aprendido a configurar rutas que atienden solicitudes por el método POST dentro de una aplicación NestJS. Hemos podido obtener datos de la solicitud que se envían dentro del body, para componer una salida usando los datos recibidos.

Todo este trabajo lo tienes que coordinar con Postman, u otro software similar que te permita crear las Resquest. Este tipo de programas los vamos a usar mucho a lo largo de este manual y en general en todo lo que es el desarrollo de APIs, ya que necesitamos una forma cómoda para ejercitar estos endpoints. Si no tuviésemos algo como Postman nos daría mucho trabajo probar lo que estamos desarrollando en NestJS.

En una siguiente entrega vamos a seguir trabajando en los controladores, pero entrando más en detalle de las respuestas HTTP que enviamos y sus status.

Miguel Angel Alvarez

Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...

Manual