Cada sesión HTTP se define por dos cosas:
- Una solicitud del cliente (navegador).
- Una respuesta del servidor.
En los frameworks, la solicitud y la respuesta suelen estar representadas por dos objetos: request y response. Estos llegan al controlador como parámetros, por lo que se les puede asignar cualquier nombre. En los ejemplos a continuación, se les llama req (request) y res (response).
Response
El método res.send() forma el cuerpo de la respuesta:
app.get('/', (req, res) => {
res.send('Hello World!');
});
Por defecto, los datos se entregan con el encabezado Content-Type: text/plain. Incluso si enviamos HTML en la respuesta, el tipo de contenido no cambiará, ya que Fastify no analiza lo que estamos enviando. Por lo tanto, deberá cambiar el tipo adicionalmente:
app.get('/', (req, res) => {
res.type('text/html');
res.send('<h1>Hello Códica!</h1>');
});
Si necesitas enviar los datos en formato JSON, no es necesario especificar el encabezado. El framework generará automáticamente el JSON y establecerá Content-Type igual a json.
app.get('/', (req, res) => {
// res.type('text/html');
res.send({ userName: 'user1' });
});
Además del cuerpo de la respuesta, podemos establecer encabezados y cambiar el código de respuesta.
app.get('/', (req, res) => {
res.header('key', 'value');
res.code(403);
res.send();
});
También podemos realizar una redirección:
app.get('/admin', (req, res) => {
res.redirect(302, '/');
});
Request
Puedes obtener los datos de la solicitud mediante propiedades. Por lo general, estas propiedades se consultan solo cuando es necesario. Veamos algunas de las propiedades más básicas:
app.get('/', (req, res) => {
req.body; // El cuerpo de la solicitud
req.headers; // Los encabezados
req.query; // Todos los parámetros de la solicitud
req.query.name; // Parámetro de la solicitud name
});
Parámetros de la solicitud
Los parámetros de la solicitud no se consideran parte de la ruta y no afectan la elección del controlador.
Esto se debe a que se utilizan para diferentes propósitos auxiliares, por ejemplo, el parámetro page indica la página de la lista que se está viendo. En tal situación, el controlador es el mismo, pero los datos son diferentes. Imagina que tenemos el siguiente código:
app.get('/users', (req, res) => {
// Devolvemos el path + query params
res.send(req.originalUrl);
});
Ahora, veamos lo que muestra en el log en respuesta a diferentes solicitudes desde el navegador:
curl -X GET "http://localhost:3000/users"
/users
curl -X GET "http://localhost:3000/users?page=3"
/users?page=3
En todos estos casos, el framework invocará el mismo controlador asociado con la ruta /users. El framework automáticamente analiza estos parámetros y proporciona un acceso conveniente a ellos a través de la propiedad del objeto query:
app.get('/users', (req, res) => {
const page = req.query.page;
});
Los parámetros de la solicitud no están vinculados al método HTTP. Pueden llegar tanto en solicitudes GET como en todas las demás:
app.post('/users', (req, res) => {
const page = req.query.page;
// ...
});
Tipo de parámetros
Desde el punto de vista de HTTP, todos los datos transmitidos a través de él son cadenas. Los parámetros no son una excepción, también son cadenas:
const state = {
users: [
{
id: 1,
name: 'user',
},
],
};
app.get('/search', (req, res) => {
const { id } = req.query;
const user = state.users.find(user => user.id === parseInt(id));
// Conversion a un tipo unico y comparacion
if (!user) {
res.code(404).send({ message: 'User not found' })
} else {
res.send(user);
}
});
En el ejemplo anterior, los datos del usuario se almacenan en el array state.users. El valor de id es un número. En el controlador, el parámetro id es una cadena, por lo que durante la comparación estricta se realiza una conversión a un solo tipo.
Trabajo independiente
- Agrega a tu proyecto Códica-fastify un controlador que procesará las solicitudes GET en la dirección /hello y mostrará un saludo. El controlador debe usar el parámetro de solicitud
namey saludar al usuario por su nombre. Por ejemplo, con la solicitudGET /hello?name=Johndebería aparecer Hello, John!. Si el parámetro de solicitudnameno se proporciona, debe generar Hello, World! - Inicia la aplicación y abre la página en el navegador. Experimenta con diferentes valores del parámetro de solicitud.
- Sube los cambios a GitHub.
Para acceder completo a curso necesitas un plan básico
El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.