Desarrollo de API REST en Node.js
Desarrollo de API REST en Node.js
Página 1 de 49
INTRODUCCIÓN AL MANUAL DE DESARROLLO DE UNA API REST EN [Link]
En la era digital actual, las aplicaciones web y móviles dependen en gran medida de la capacidad
de comunicarse y compartir datos de manera eficiente. Una de las formas más efectivas de lograr
de alto rendimiento.
Una API REST es un conjunto de reglas y convenciones que permiten la comunicación entre
diferentes sistemas a través de la web. Utiliza los métodos HTTP (GET, POST, PUT, DELETE)
para realizar operaciones sobre los recursos, que se representan en formato JSON o XML. Las
APIs REST son ampliamente utilizadas debido a su simplicidad, flexibilidad y capacidad para
integrarse con diversas plataformas y lenguajes de programación. Al seguir los principios REST,
se logra una arquitectura que es fácil de entender y utilizar, facilitando la interoperabilidad entre
diferentes servicios.
Para el desarrollo de esta API REST, se ha adoptado una arquitectura basada en **MVC
diferentes capas, lo que resulta en un código más limpio y mantenible. En este enfoque:
Página 2 de 49
Estructura General del Proyecto
/models: Contiene los modelos de datos, donde se definen los esquemas de las
entidades (por ejemplo, `curso_model.js` y `usuario_model.js`).
/logic: Incluye la lógica de negocio, donde se implementan las funciones que
interactúan con los modelos y realizan las operaciones necesarias (por ejemplo,
`curso_logic.js` y `usuario_logic.js`).
/validations: Contiene los esquemas de validación que aseguran que los datos de
entrada cumplan con las reglas definidas (por ejemplo, `curso_validation.js` y
`usuario_validation.js`).
/controllers: Incluye los controladores que manejan las solicitudes HTTP y responden
a los clientes (por ejemplo, `cursos_controller.js` y `usuarios_controller.js`).
/routes: Define las rutas de la API, donde se mapean las solicitudes a los controladores
correspondientes (por ejemplo, `cursos_routes.js` y `usuarios_routes.js`).
/tests: (opcional) Contiene pruebas automatizadas para verificar el correcto
funcionamiento de la API.
Este manual proporciona una guía paso a paso para el desarrollo de una API REST en [Link],
de este documento, se explorarán las mejores prácticas y se ofrecerán ejemplos claros para
con las herramientas necesarias para construir y mantener una API REST robusta y eficiente.
Página 3 de 49
Ilustración 1Estructura general del proyecto
Página 4 de 49
CAPA DE MODELOS
La capa de modelos en una aplicación que utiliza una arquitectura de API REST es responsable
de definir la estructura de los datos que se van a almacenar en la base de datos. Esta capa actúa
interacción con la base de datos, permitiendo realizar operaciones como crear, leer, actualizar y
eliminar (CRUD) registros. En el contexto de una API REST desarrollada con [Link] y Mongoose
(una biblioteca de modelado de objetos MongoDB), los modelos se definen utilizando esquemas
que especifican los campos, tipos de datos y validaciones necesarias para cada entidad.
El modelo Curso define la estructura de los datos relacionados con los cursos ofrecidos en la
título: Un campo de tipo `String` que es obligatorio y representa el título del curso.
descripción: Un campo de tipo `String` que es opcional y proporciona una descripción
del curso.
estado: Un campo de tipo `Boolean` que indica si el curso está activo o no, con un valor
predeterminado de `true`.
imagen: Un campo de tipo `String` que es opcional y puede almacenar la URL de una
imagen relacionada con el curso.
alumnos: Un campo de tipo `Number` que cuenta la cantidad de alumnos inscritos en
el curso, con un valor predeterminado de `0`.
calificación: Un campo de tipo `Number` que representa la calificación promedio del
curso, con un valor predeterminado de `0`.
Este modelo permite gestionar la información de los cursos de manera estructurada y facilita la
Página 5 de 49
Curso_model.js
const mongoose = require('mongoose');
El modelo Usuario define la estructura de los datos relacionados con los usuarios de la
Página 6 de 49
estado: Un campo de tipo `Boolean` que indica si el usuario está activo o no, con un valor
predeterminado de `true`.
imagen: Un campo de tipo `String` que es opcional y puede almacenar la URL de una
imagen de perfil del usuario.
cursos: Un campo que es un arreglo de identificadores de objetos (`ObjectId`) que
referencia a los cursos que el usuario ha inscrito. Este campo es opcional y permite
establecer una relación entre usuarios y cursos.
Este modelo permite gestionar la información de los usuarios de manera eficiente y establece
relaciones con los cursos, facilitando la administración de inscripciones y la interacción entre las
entidades de la aplicación.
usuario_model.js
const mongoose = require('mongoose');
Página 7 de 49
[Link] = [Link]('Usuario', usuarioSchema);
Página 8 de 49
CAPA DE LÓGICA DE NEGOCIO
La capa de lógica de la API REST es responsable de contener la lógica de negocio y las operaciones
que se realizan sobre los modelos de datos. Esta capa actúa como intermediaria entre la capa de
1. crearCurso(body):
Esta función crea un nuevo curso. Primero, verifica si ya existe un curso con el
mismo título. Si no existe, crea un nuevo objeto de curso y lo guarda en la base de
datos.
2. actualizarCurso(id, body):
3. desactivarCurso(id):
Esta función inactiva un curso cambiando su estado a `false`. Busca el curso por
su ID y actualiza su estado.
4. listarCursosActivos():
Devuelve una lista de todos los cursos que están activos (estado `true`). Utiliza una
consulta a la base de datos para obtener estos cursos.
5. guardarCursos(cursos):
Permite guardar una colección de cursos. Verifica si cada curso ya existe antes de
intentar guardarlo, evitando duplicados.
6. buscarCursoPorId(id):
Busca un curso por su ID. Si no se encuentra, lanza un error indicando que el curso
no fue encontrado.
Página 9 de 49
7. buscarUsuariosPorCurso(id):
Página 10 de 49
// Función asíncrona para inactivar cursos
async function desactivarCurso(id){
let curso = await [Link](id, {
$set: {
estado: false
}
}, {new: true});
return curso;
}
return resultados;
} catch (err) {
[Link]('Error al guardar la colección de cursos:', err);
throw err; // Re-lanza el error para manejarlo en la capa superior si es necesario
}
}
Página 11 de 49
if (!curso) {
throw new Error(`Curso con ID ${id} no encontrado`);
}
return curso;
} catch (err) {
[Link](`Error al buscar el curso por ID: ${[Link]}`);
throw err;
}
}
// Procesar los resultados para devolver solo los títulos de los cursos
const usuariosConCursos = [Link](usuario => {
return {
_id: usuario._id,
email: [Link],
nombre: [Link],
password: [Link],
estado: [Link],
//cursos: [Link](curso => [Link]), // Solo incluye el título de cada
curso
__v: usuario.__v
};
});
return usuariosConCursos;
} catch (err) {
[Link](`Error al buscar usuarios por curso: ${[Link]}`);
throw err;
}
}
[Link] = {
Página 12 de 49
crearCurso,
actualizarCurso,
desactivarCurso,
listarCursosActivos,
guardarCursos,
buscarCursoPorId,
buscarUsuariosPorCurso
}
1. crearUsuario(body):
2. actualizarUsuario(email, body):
3. desactivarUsuario(email):
4. listarUsuarioActivos():
Devuelve una lista de todos los usuarios activos. Utiliza `populate` para incluir
información sobre los cursos asociados a cada usuario.
5. agregarCursosAUsuario(email, cursosIds):
Permite agregar uno o varios cursos a un usuario. Filtra los cursos ya existentes
para evitar duplicados.
6. guardarColeccionUsuarios(usuarios):
7. listarCursosDeUsuario(usuarioId):
Página 13 de 49
Busca un usuario por su ID y devuelve la lista de cursos asociados a ese usuario,
utilizando `populate` para obtener detalles de los cursos.
if (usuarioExistente) {
throw new Error('El correo electrónico ya está registrado');
}
if (!usuario) {
throw new Error('Usuario no encontrado');
}
Página 14 de 49
[Link] = [Link] || [Link];
[Link] = [Link] || [Link];
[Link] = [Link] !== undefined ? [Link] : [Link];
[Link] = [Link] || [Link];
return usuario;
}
// Mapea los usuarios para devolver solo los títulos de los cursos
usuarios = [Link](usuario => {
const cursosSoloTitulos = [Link](curso => [Link]);
return {
_id: usuario._id,
email: [Link],
nombre: [Link],
password: [Link],
estado: [Link],
imagen: [Link],
cursos: cursosSoloTitulos, // Reemplaza los cursos con solo los títulos
__v: usuario.__v
};
});
Página 15 de 49
return usuarios;
}
if (!usuario) {
throw new Error('Usuario no encontrado');
}
await [Link]();
return usuario;
} catch (error) {
throw new Error(`Error al agregar cursos: ${[Link]}`);
}
}
if (!usuarioExistente) {
let nuevoUsuario = new Usuario({
email: [Link],
nombre: [Link],
password: [Link],
estado: [Link] !== undefined ? [Link] : true,
imagen: [Link] || null,
cursos: [Link] || []
Página 16 de 49
});
let usuarioGuardado = await [Link]();
[Link](usuarioGuardado);
} else {
[Link](`El correo electrónico "${[Link]}" ya está registrado.`);
}
}
return resultados;
} catch (err) {
[Link]('Error al guardar la colección de usuarios:', err);
throw err; // Re-lanza el error para manejarlo en la capa superior si es necesario
}
}
if (!usuario) {
throw new Error('Usuario no encontrado');
}
[Link] = {
agregarCursosAUsuario,
listarCursosDeUsuario,
crearUsuario,
actualizarUsuario,
desactivarUsuario,
listarUsuarioActivos,
guardarColeccionUsuarios
Página 17 de 49
}
arquitectura de la API REST. A través de estas funciones, se garantiza que la lógica de negocio se
maneje de manera eficiente y se interactúe correctamente con los modelos de datos. Esto permite
Página 18 de 49
CAPA DE VALIDACIONES DE LOS MODELOS
La capa de validaciones es responsable de definir las reglas y restricciones que deben cumplir los
datos antes de ser procesados por la aplicación. Esto ayuda a garantizar la integridad y calidad de
de datos.
definidos con la biblioteca Joi para validar los datos de entrada antes de interactuar con los
modelos de datos.
título: Debe ser un string, tener al menos 3 caracteres y un máximo de 100 caracteres.
Debe contener solo letras (mayúsculas y minúsculas), números, espacios, y los caracteres
`.`, `#` y `-`. Es un campo requerido.
descripción: Debe ser un string, con un máximo de 500 caracteres. Puede estar vacío.
Debe contener solo letras (mayúsculas y minúsculas), números, espacios, y los caracteres
`.`, `#` y `-`.
estado: Debe ser un valor booleano. Si no se proporciona, se establece como `true` por
defecto.
imagen: Debe ser una URL válida en formato `http` o `https`. Puede estar vacío. Debe
seguir el patrón de una URL válida.
Página 19 de 49
calificación: Debe ser un número entre 0 y 5. Si no se proporciona, se establece como 0
por defecto.
Página 20 de 49
Curso_validations.js
// validaciones/[Link]
const Joi = require('@hapi/joi');
descripcion: [Link]()
.max(500)
.optional()
.allow('')
.pattern(/^[A-Za-záéíóúÁÉÍÓÚñÑ0-9 .#-]{3,500}$/)
.messages({
'[Link]': 'La descripción debe ser un texto',
'[Link]': 'La descripción no debe exceder los 500 caracteres'
}),
estado: [Link]()
.default(true)
.messages({
'[Link]': 'El estado debe ser un valor booleano'
}),
imagen: [Link]()
.uri()
.optional()
.allow('')
.pattern(/^https?:\/\/[a-zA-Z0-9\-\.]+\.[a-z]{2,}([\/\w \.-]*)*\/?$/)
.messages({
'[Link]': 'La imagen debe ser una URL válida',
'[Link]': 'La imagen debe tener un formato de URL válido'
Página 21 de 49
}),
alumnos: [Link]()
.integer()
.min(0)
.default(0)
.messages({
'[Link]': 'El número de alumnos debe ser un número',
'[Link]': 'El número de alumnos debe ser un entero',
'[Link]': 'El número de alumnos no puede ser negativo'
}),
calificacion: [Link]()
.min(0)
.max(5)
.default(0)
.messages({
'[Link]': 'La calificación debe ser un número',
'[Link]': 'La calificación no puede ser menor que 0',
'[Link]': 'La calificación no puede ser mayor que 5'
})
});
[Link] = { cursoSchemaValidation };
email: Debe ser un string con formato de correo electrónico válido (al menos dos
segmentos de dominio y dominios TLD permitidos: `com`, `net`, `edu`, `co`). Es un
campo requerido.
estado: Debe ser un valor booleano. Si no se proporciona, se establece como `true` por
defecto.
imagen: Debe ser una URL válida en formato `http` o `https`. Puede estar vacío. Debe
seguir el patrón de una URL válida.
Página 22 de 49
cursos: Debe ser un array que contiene solo ObjectId válidos de MongoDB (24 caracteres
hexadecimales). Puede estar vacío.
Usuario_validation.js
email: [Link]()
.email({ minDomainSegments: 2, tlds: { allow: ['com', 'net', 'edu', 'co'] } })
.required()
.messages({
'[Link]': 'El correo electrónico debe ser un texto',
'[Link]': 'El correo electrónico no puede estar vacío',
'[Link]': 'El correo electrónico debe tener un formato válido',
'[Link]': 'El correo electrónico es un campo requerido'
}),
nombre: [Link]()
.min(3)
.max(30)
.required()
.pattern(/^[A-Za-záéíóúÁÉÍÓÚñÑ ]+$/)
.messages({
'[Link]': 'El nombre debe ser un texto',
'[Link]': 'El nombre no puede estar vacío',
'[Link]': 'El nombre debe tener al menos 3 caracteres',
'[Link]': 'El nombre no debe exceder los 30 caracteres',
'[Link]': 'El nombre solo puede contener letras y espacios',
'[Link]': 'El nombre es un campo requerido'
}),
password: [Link]()
.min(6)
.max(30)
.required()
.pattern(/^[a-zA-Z0-9!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]{6,30}$/)
.messages({
'[Link]': 'La contraseña debe ser un texto',
'[Link]': 'La contraseña no puede estar vacía',
'[Link]': 'La contraseña debe tener al menos 6 caracteres',
'[Link]': 'La contraseña no debe exceder los 30 caracteres',
Página 23 de 49
'[Link]': 'La contraseña solo puede contener letras, números y caracteres
especiales',
'[Link]': 'La contraseña es un campo requerido'
}),
estado: [Link]()
.default(true)
.messages({
'[Link]': 'El estado debe ser un valor booleano'
}),
imagen: [Link]()
.uri()
.optional()
.allow('')
.pattern(/^https?:\/\/[a-zA-Z0-9\-\.]+\.[a-z]{2,}([\/\w \.-]*)*\/?$/)
.messages({
'[Link]': 'La imagen debe ser una URL válida',
'[Link]': 'La imagen debe tener un formato de URL válido'
}),
cursos: [Link]()
.items([Link]().pattern(/^[0-9a-fA-F]{24}$/)) // Validación de un array de ObjectId (24
caracteres hexadecimales)
.optional()
.messages({
'[Link]': 'Cursos debe ser un array',
'[Link]': 'Cada curso debe ser un ID de MongoDB válido (24 caracteres
hexadecimales)'
}),
});
[Link] = { usuarioSchemaValidation };
La capa de validaciones es fundamental para garantizar la calidad de los datos en la API REST. Al
definir reglas claras y específicas para cada campo, se evitan errores y se mantiene la integridad
interactuar con los modelos de datos, lo que permite una gestión eficiente y segura de los recursos
de la aplicación.
Página 24 de 49
Página 25 de 49
CAPA DE CONTROLADORES
La capa de controladores en una API REST es responsable de recibir las solicitudes del cliente,
interactuar con la lógica de negocio, realizar las validaciones necesarias y devolver las respuestas
adecuadas. Los controladores actúan como intermediarios entre la capa de presentación (como
las rutas) y la lógica de negocio (funciones definidas en la capa de lógica). Esta separación de
1. Controladores:
Reciben las solicitudes HTTP y extraen los datos necesarios del cuerpo de la solicitud
Llaman a las funciones de la capa de lógica para realizar operaciones específicas (como
2. Lógica:
Se encarga de interactuar con la base de datos a través de los modelos y aplicar la lógica
3. Validaciones:
Se utilizan para validar los datos de entrada antes de que sean procesados por la lógica.
Aseguran que los datos cumplan con las reglas definidas (por ejemplo, formatos, tipos
Página 26 de 49
4. Modelos:
Definen la estructura de los datos y las interacciones con la base de datos (como
Son utilizados por la lógica para realizar operaciones sobre los datos.
Ejemplo de Controladores
A continuación, se describen las funciones de los controladores para los cursos y usuarios,
1. listarCursosActivos:
Devuelve un código de estado 204 si no hay cursos activos, o 200 con la lista de cursos
si los hay.
2. crearCurso:
3. actualizarCurso:
Página 27 de 49
Devuelve un código de estado 404 si el curso no se encuentra, o 200 con el curso
actualizado.
4. desactivarCurso:
desactivado.
5. guardarColeccionCursos:
guardarlos.
6. obtenerCursoPorId:
7. obtenerUsuariosPorCurso:
curso.
usuarios.
Página 28 de 49
Cursos_controller.js
if ([Link] === 0) {
return [Link](204).send(); // 204 No Content
}
[Link](cursosActivos);
} catch (err) {
[Link](500).json({ error: 'Error interno del servidor' });
}
};
if (error) {
return [Link](400).json({ error: [Link][0].message });
}
try {
const nuevoCurso = await [Link](value);
[Link](201).json(nuevoCurso);
} catch (err) {
if ([Link] === 'El curso con este título ya existe') {
return [Link](409).json({ error: [Link] });
Página 29 de 49
}
[Link](500).json({ error: 'Error interno del servidor' });
}
};
if (error) {
return [Link](400).json({ error: [Link][0].message });
}
try {
const cursoActualizado = await [Link](id, value);
if (!cursoActualizado) {
return [Link](404).json({ error: 'Curso no encontrado' });
}
[Link](cursoActualizado);
} catch (err) {
[Link](500).json({ error: 'Error interno del servidor' });
}
};
try {
const cursoDesactivado = await [Link](id);
if (!cursoDesactivado) {
return [Link](404).json({ error: 'Curso no encontrado' });
Página 30 de 49
}
[Link](cursoDesactivado);
} catch (err) {
[Link](500).json({ error: 'Error interno del servidor' });
}
};
if (error) {
return [Link](400).json({ error: `Error en curso "${[Link]}":
${[Link][0].message}` });
}
}
try {
// Guardar la colección de cursos
const resultados = await [Link](cursos);
[Link](201).json({ message: 'Cursos guardados exitosamente', cursos: resultados });
} catch (err) {
[Link](500).json({ error: 'Error interno del servidor al guardar cursos', details:
[Link] });
}
};
try {
Página 31 de 49
const curso = await [Link](id);
if (!curso) {
return [Link](404).json({ error: `Curso con ID ${id} no encontrado` });
}
[Link](curso);
} catch (err) {
[Link](500).json({ error: `Error interno del servidor al buscar el curso: ${[Link]}`
});
}
};
try {
const usuarios = await [Link](id);
[Link](usuarios);
} catch (err) {
[Link](500).json({ error: `Error interno del servidor al buscar los usuarios del curso:
${[Link]}` });
}
};
Página 32 de 49
Controladores de Usuarios (`usuarios_controller.js`)
1. listarUsuarioActivos:
Devuelve un código de estado 204 si no hay usuarios activos, o 200 con la lista de
usuarios.
2. crearUsuario:
3. actualizarUsuario:
actualizado.
4. desactivarUsuario:
desactivado.
5. agregarCursosAUsuario:
`[Link](email, cursos)`.
6. listarCursosDeUsuario:
un usuario.
Página 33 de 49
Devuelve un código de estado 204 si no hay cursos, o 200 con la lista de cursos.
7. guardarColeccionUsuarios:
if (error) {
return [Link](400).json({ error: [Link][0].message });
}
try {
const nuevoUsuario = await [Link](value);
[Link](201).json({ usuario: nuevoUsuario }); // 201 Created
} catch (err) {
if ([Link] === 'El correo electrónico ya está registrado') {
return [Link](409).json({ error: [Link] }); // 409 Conflict
}
[Link](500).json({ error: 'Error interno del servidor' });
}
};
Página 34 de 49
// Controlador para actualizar un usuario
const actualizarUsuario = async (req, res) => {
const { email } = [Link];
const { error, value } = [Link]([Link]);
if (error) {
return [Link](400).json({ error: [Link][0].message });
}
try {
const usuarioActualizado = await [Link](email, value);
if (!usuarioActualizado) {
return [Link](404).json({ error: 'Usuario no encontrado' });
}
[Link]({ usuario: usuarioActualizado });
} catch (err) {
[Link](500).json({ error: 'Error interno del servidor' });
}
};
try {
const usuarioDesactivado = await [Link](email);
if (!usuarioDesactivado) {
return [Link](404).json({ error: 'Usuario no encontrado' });
}
[Link]({ usuario: usuarioDesactivado });
} catch (err) {
[Link](500).json({ error: 'Error interno del servidor' });
}
};
Página 35 de 49
try {
const usuarioActualizado = await [Link](email, cursos);
try {
const cursos = await [Link](usuarioId);
if ([Link] === 0) {
return [Link](204).send(); // No Content
}
[Link](cursos);
} catch (err) {
[Link](500).json({ error: 'Error interno del servidor' });
}
};
if (error) {
return [Link](400).json({ error: [Link][0].message });
}
Página 36 de 49
// Agregar el correo al Set y el usuario al array de usuarios válidos
[Link]([Link]);
[Link](usuario);
}
try {
const resultados = await [Link](usuariosValidos); // Llama a la
función lógica
[Link](201).json(resultados); // Responde con los usuarios guardados
} catch (err) {
[Link](500).json({ error: 'Error interno del servidor al guardar la colección de usuarios'
});
}
};
La capa de controladores es esencial para manejar las interacciones entre el cliente y la lógica de
negocio. Al recibir solicitudes, validar datos y devolver respuestas, los controladores garantizan
que la API funcione de manera eficiente y segura. La colaboración entre controladores, lógica,
validaciones y modelos permite una arquitectura bien estructurada y mantenible para la API
REST.
Página 37 de 49
CAPA DE RUTAS
La capa de rutas en una API REST es fundamental para definir cómo se manejan las solicitudes
HTTP y cómo se mapean a las funciones de los controladores. Esta capa actúa como el punto de
entrada para las solicitudes del cliente y se encarga de dirigir esas solicitudes a los controladores
correspondientes, donde se lleva a cabo la lógica de negocio. Usando [Link], la capa de rutas
se organiza de manera que cada ruta se asocie con un método HTTP específico y una función de
controlador.
`usuarios_routes.js`.
Método: `GET`
Ruta: `/`
Controlador: `[Link]`
Descripción: Devuelve una lista de todos los cursos que están activos.
Método: `GET`
Ruta: `/:id`
Página 38 de 49
Controlador: `[Link]`
Método: `GET`
Ruta: `/:id/usuarios`
Controlador: `[Link]`
4. Crear un curso:
Método: `POST`
Ruta: `/`
Controlador: `[Link]`
Método: `POST`
Ruta: `/coleccion`
Controlador: `[Link]`
6. Actualizar curso:
Método: `PUT`
Ruta: `/:id`
Controlador: `[Link]`
Página 39 de 49
Descripción: Actualiza los detalles de un curso específico según su ID.
7. Eliminar curso:
Método: `DELETE`
Ruta: `/:id`
Controlador: `[Link]`
Método: `GET`
Ruta: `/`
Controlador: `[Link]`
Descripción: Devuelve una lista de todos los usuarios que están activos.
Método: `GET`
Ruta: `/:usuarioId/cursos`
Controlador: `[Link]`
Método: `POST`
Ruta: `/`
Página 40 de 49
Controlador: `[Link]`
Método: `POST`
Ruta: `/:email/cursos`
Controlador: `[Link]`
Método: `POST`
Ruta: `/coleccion`
Controlador: `[Link]`
6. Actualizar un usuario:
Método: `PUT`
Ruta: `/:email`
Controlador: `[Link]`
electrónico.
7. Eliminar usuario:
Método: `DELETE`
Ruta: `/:email`
Página 41 de 49
Controlador: `[Link]`
Cursos_routes.js
const express = require('express');
const cursoController = require('../controllers/cursos_controller'); // Importa el controlador
const router = [Link](); // Define el enrutador
//Crear un curso
[Link]('/', [Link]);
//Actualizar curso
[Link]('/:id', [Link]);
// Eliminar Curso
[Link]('/:id', [Link]);
[Link] = router;
usuarios_routes.js
Página 42 de 49
//Listar cursos del usuario
[Link]('/:usuarioId/cursos', [Link]);
// Actualizar un usuario
[Link]('/:email', [Link]);
// Eliminar usuario
[Link]('/:email', [Link]);
[Link] = router;
Para que estas rutas funcionen, deben ser integradas en la aplicación Express. Esto se hace
siguiente manera:
Página 43 de 49
// Iniciar el servidor
const PORT = [Link] || 3000;
[Link](PORT, () => {
[Link](`Servidor corriendo en [Link]
});
La capa de rutas es esencial para definir cómo se manejan las solicitudes HTTP en la API REST.
Al organizar las rutas de manera lógica y clara, se facilita la interacción entre el cliente y el
servidor. Las rutas mapean las solicitudes a los controladores correspondientes, que a su vez
interactúan con la lógica de negocio y las validaciones para procesar los datos y devolver
respuestas adecuadas. Esta estructura modular permite un desarrollo más limpio y mantenible.
Página 44 de 49
PRUEBAS DE LOS END POINTS
Probar los endpoints de una API REST es una parte crucial del desarrollo, ya que asegura que la
lógica de negocio y las interacciones con la base de datos funcionen correctamente. **Postman**
es una herramienta popular para realizar pruebas de APIs, ya que permite enviar solicitudes
HTTP y ver las respuestas de manera intuitiva. A continuación, se explican los pasos para probar
1. Configuración Inicial
Descargar e instalar Postman: Si aún no lo tienes, descarga Postman desde [su sitio
oficial]([Link]
Iniciar Postman: Abre la aplicación Postman.
Página 45 de 49
- Método: `GET`
- URL: `[Link]
- Descripción: Obtiene una lista de todos los cursos activos.
Pasos:
Crear un Curso
- Método: `POST`
- URL: `[Link]
- Descripción: Crea un nuevo curso.
Pasos:
{
"titulo": "Curso de Programación",
"descripcion": "Aprende a programar desde cero.",
"estado": true,
"imagen": "[Link]
"alumnos": 0,
"calificacion": 5
}
- Método: `GET`
Página 46 de 49
- URL: `[Link] (reemplaza `:id` con el ID del
curso)
- Descripción: Obtiene los detalles de un curso específico.
Pasos:
1. Selecciona el método `GET`.
2. Ingresa la URL con el ID del curso.
3. Haz clic en **Send**.
4. Verifica la respuesta.
Actualizar un Curso
- Método: `PUT`
- URL: `[Link] (reemplaza `:id` con el ID del
curso)
- Descripción: Actualiza los detalles de un curso.
Pasos:
1. Selecciona el método `PUT`.
2. Ingresa la URL con el ID del curso.
3. Ve a la pestaña Body y selecciona raw y luego JSON.
4. Ingresa el JSON con los nuevos datos del curso.
5. Haz clic en Send.
6. Verifica la respuesta.
Desactivar un Curso
- Método: `DELETE`
- URL: `[Link] (reemplaza `:id` con el ID del
curso)
- Descripción: Desactiva un curso específico.
Pasos:
1. Selecciona el método `DELETE`.
2. Ingresa la URL con el ID del curso.
3. Haz clic en Send.
4. Verifica la respuesta.
Página 47 de 49
Listar Usuarios Activos
- Método: `GET`
- URL: `[Link]
- Descripción: Obtiene una lista de todos los usuarios activos.
Pasos:
1. Selecciona el método `GET`.
2. Ingresa la URL.
3. Haz clic en Send.
4. Verifica la respuesta.
Crear un Usuario
- Método: `POST`
- URL: `[Link]
- Descripción: Crea un nuevo usuario.
Pasos:
1. Selecciona el método `POST`.
2. Ingresa la URL.
3. Ve a la pestaña Body y selecciona raw y luego JSON.
4. Ingresa el siguiente JSON en el cuerpo de la solicitud:
{
"email": "usuario@[Link]",
"nombre": "Juan Pérez",
"password": "contraseña123",
"imagen": "[Link]
}
Actualizar un Usuario
- Método: `PUT`
- URL: `[Link] (reemplaza `:email` con el
correo del usuario)
Página 48 de 49
- Descripción: Actualiza los detalles de un usuario.
Pasos:
1. Selecciona el método `PUT`.
2. Ingresa la URL con el correo del usuario.
3. Ve a la pestaña Body y selecciona raw y luego JSON.
4. Ingresa el JSON con los nuevos datos del usuario.
5. Haz clic en Send.
6. Verifica la respuesta.
Desactivar un Usuario
- Método: `DELETE`
- URL: `[Link] (reemplaza `:email` con el
correo del usuario)
- Descripción: Desactiva un usuario específico.
Pasos:
1. Selecciona el método `DELETE`.
2. Ingresa la URL con el correo del usuario.
3. Haz clic en **Send**.
4. Verifica la respuesta.
4. Verificar Respuestas
Postman es una herramienta poderosa para probar y documentar APIs. Al seguir estos pasos,
puedes asegurarte de que los endpoints de tu API REST para cursos y usuarios funcionen
correctamente. Realiza pruebas exhaustivas para detectar errores y asegurarte de que la lógica de
Página 49 de 49