El correcto manejo de rutas y versiones es esencial en una API para mantener la compatibilidad con clientes diversos y permitir evoluciones. Cuando desarrollamos una API, es crucial considerar cómo puede crecer y evolucionar sin causar problemas a aplicaciones que dependen de ella, como móviles o IoT.
¿Qué es un endpoint con rutas versionadas?
Las rutas versionadas permiten que la API evolucione sin afectar a los clientes actuales. Por ejemplo, podríamos tener API/v1/users para la versión 1 de nuestro endpoint de usuarios. Si decidimos actualizar la lógica para la gestión de usuarios, podemos crear una nueva ruta API/v2/users sin interferir con la versión anterior.
Ejemplo de estructura de rutas:
const express =require('express');const router = express.Router();// Definir una ruta global para la versiónapp.use('/api/v1', router);// Endpoints para v1router.get('/products',(req, res)=>{ res.send('Lista de productos para la versión 1');});// Configurar segunda versiónconst routerV2 = express.Router();app.use('/api/v2', routerV2);routerV2.get('/products',(req, res)=>{ res.send('Lista de productos para la versión 2');});
¿Cómo implementar el método POST en una API?
El método POST permite la creación de nuevas entidades. A diferencia de GET, que podemos probar en un navegador, POST requiere un software para emular el envío, como Insomnia o Postman.
¿Cómo hacer una petición POST?
Crear una petición con Insomnia o Postman.
Establecer el método como POST.
Definir el endpoint que coincida con el de nuestra API.
Enviar datos en formato JSON, por ejemplo, para crear un producto:
Es necesario un middleware para procesar las solicitudes en JSON. Express.js lo facilita con express.json():
app.use(express.json());// Middleware global para parsear JSON// Ejemplo de endpoint para recibir un POSTrouter.post('/products',(req, res)=>{const product = req.body; res.json({message:'Creación exitosa',data: product
});});
Consejos prácticos para trabajar con APIs
Mantenibilidad: Planifica desde el inicio para soportar nuevas versiones de endpoints.
Pruebas: Utiliza herramientas especializadas como Postman para verificar que los métodos funcionen correctamente.
Claridad: Documenta bien cada ruta y su versión para evitar confusiones.
Es fundamental contar con una buena base cuando se trata de diseño de APIs, no solo para evitar errores, sino para permitir su escalabilidad y adaptabilidad en el tiempo. A medida que continúes aprendiendo y construyendo, te enfrentarás a numerosas situaciones que desafiarán tu creatividad y habilidades de resolución de problemas. ¡Sigue adelante y no dejes de experimentar!
Middleware:
⠀⠀
El término middleware se refiere a un sistema de software que ofrece servicios y funciones comunes para las aplicaciones. En general, el middleware se encarga de las tareas de gestión de datos, servicios de aplicaciones, mensajería, autenticación y gestión de API.
⠀⠀⠀
Ayuda a los desarrolladores a diseñar aplicaciones con mayor eficiencia. Además, actúa como hilo conductor entre las aplicaciones, los datos y los usuarios.
Para poder hacer los request en insomnia, primero deben tocar el botón "Create" y luego "Request Collection". Luego pueden seguir todos los pasos de la clase :D
Amigos le quería recomendar esta extension de VS code, que sirve igual que Postman y esta en el mismo editor, la verdad vale la pena probarlo, además que tiene la función de mostrarte el tiempo de la respuesta y guarda el historial de todas las peticiones que haya realizado, se llama Thunder Client
 el POST se crea desde "Body", en la sección "Raw", seleccionando JSON como formato de entrada.
Pueden encontrar más en la documentación oficial: Enlace
es un método incorporado en express para reconocer el objeto de solicitud entrante como objeto JSON. Este método se llama como middleware en su aplicación usando el código:
Deben de tener cuidado de la estructura de su JSON. NO ES UN OBJETO DE JAVASCRIPT. Por lo tanto, no deben dejar comas al final. Ni caracteres extraños:
El método GET coloca los parámetros dentro de la URI mientras que el método POST los agrega al cuerpo.
GET se utiliza esencialmente para obtener la información. En cambio, el objetivo del método POST es actualizar los datos.
Los resultados de la consulta POST no pueden marcarse, mientras que los resultados de la consulta GET pueden marcarse porque existen en forma de URL.
En el método GET la información es visible en la URL lo que aumenta las vulnerabilidades y el riesgo de hacking. Por el contrario, el método POST no muestra variables en la URL y también se pueden utilizar múltiples técnicas de codificación, lo que lo hace resistente.
Cuando se utiliza el método GET en el formulario, sólo se aceptan caracteres ASCII en los tipos de datos. Por el contrario, el método POST no enlaza tipos de datos de formulario y permite caracteres binarios y ASCII.
El tamaño variable en el método GET es de aproximadamente 2000 caracteres. A la inversa, el método POST permite hasta 8 Mb de tamaño variable.
Los datos del método GET se pueden almacenar en [caché], mientras que los datos del método POST no.
Cuando utilizo de esta forma las versiones de Router....
Como es que puedo hacer para manejar diferentes versiones de router? por que me imagino que haciéndolo ahí no lo puedo reutilizar digamos router para api/v1
luego para users/v2/ ? /// o solo seria para trabajar versiones alternas desde el entorno de producción?
Middleware o lógica de intercambio de información entre aplicaciones, o Agente Intermedio, es un software que asiste a una aplicación para interactuar o comunicarse con otras aplicaciones, o paquetes de programas, redes, hardware o sistemas operativos.
Por alguna razón con postman me devuelve la data vacía. Funciono con otros programas. Recomiendo la extensión de VSCode que publicó otra persona abajo Thunder Client
ya lo resolvi, tenia que colocar en el postman el tipo de contenido que se iba a recibir, en mi caso el Content-Type lo tenia puesto en text y debia ser en json
Por qué versionar tu API?
La razón de versionar nuestras API es para que no haya conclicto del servicio con las distintas plataformas que puedan usarlo ( Mobile nativo, IoT, Web).
Supongamos que haces un cambio de la API para mobile, simplemente le asignas un router con la v2 y dejas lo demás con la versión v1
Para esta clase necesitaremos un API development enviroment pueden ser Insomnia o Postman.
Lo primero que debemos hacer es crear la forma en como el servidor tratará la petición de tipo POST, en este caso lo hicimos en el endpoint de products de esta manera:
const express =require('express');const router = express.Router();router.post('/',(req, res)=>{const body = req.body; res.json({message:'created',data: body
})})
Luego usamos insomnia y le enviamos los datos que queremos testear:
{"name":" New Product","price":1209}
Veremos que nos aparece el json de respuesta pero solamente con el valor de message: 'created'.
Esto es porque necesitamos aplicar un midleware nativo de express.
//index.jsapp.use(express.json())
@Luis, para manejar varias versiones uedes hacer algo como esto
Hola, desafortunadamente Encuentro este error... ¿Alguien sabe a qué se debe?
SyntaxError:Unexpected token ' inJSON at position 11 at JSON.parse(<anonymous>) at parse(/Users/leo/Documents/platziCursos/backendNodeJs/tiendaOnline/node_modules/body-parser/lib/types/json.js:89:19) at /Users/leo/Documents/platziCursos/backendNodeJs/tiendaOnline/node_modules/body-parser/lib/read.js:121:18 at invokeCallback(/Users/leo/Documents/platziCursos/backendNodeJs/tiendaOnline/node_modules/raw-body/index.js:224:16) at done(/Users/leo/Documents/platziCursos/backendNodeJs/tiendaOnline/node_modules/raw-body/index.js:213:7) at IncomingMessage.onEnd(/Users/leo/Documents/platziCursos/backendNodeJs/tiendaOnline/node_modules/raw-body/index.js:273:7) at IncomingMessage.emit(node:events:377:35) at endReadableNT(node:internal/streams/readable:1312:12) at processTicksAndRejections(node:internal/process/task_queues:83:21)
¡Gracias!
Lo hice de la siguiente manera:
Usando el fs (FileSystem), lei todos los archivos creados en el folder de routes
Iteré sobre todos los archivos creados
Importé cada archivo de rutas
Hice un split para tomar el nombre del archivo (que luego será el path de dicha cada ruta)
Con esta estrategia, cada que se agregue un nuevo archivo de rutas, automáticamente se creará la ruta sin necesidad de agregarlo manualmente