Métodos HTTP y cómo debe responder una API
Hasta ahora ya tenemos una API funcionando que discrimina rutas, pero hay un problema importante: está respondiendo igual a cualquier tipo de petición, independientemente del método HTTP utilizado.
En esta clase vamos a ver qué son los métodos HTTP, para qué sirve cada uno y cómo hacer que nuestra API responda correctamente según el “verbo” que reciba.
El problema actual
Si ahora mismo haces una petición a tu servidor, verás que responde lo mismo si haces un:
GET /usuariosPOST /usuariosDELETE /usuarios
Esto es un problema serio porque:
- No tiene sentido semántico: No es lo mismo pedir datos que borrarlos.
- Convenciones HTTP: No estamos siguiendo el estándar que esperan otros desarrolladores.
- Inseguridad: Podríamos permitir acciones no deseadas (como borrar algo con un GET).
Regla de oro: Una API debe comportarse de forma distinta según el método usado para una misma URL.
Probar la API con clientes HTTP
Para detectar estos problemas es fundamental dejar de usar solo el navegador y empezar a usar un cliente de APIs. El navegador, por defecto, solo hace peticiones GET cuando escribes una URL.
Herramientas recomendadas:
Estas herramientas te permiten cambiar el método, añadir cabeceras, enviar cuerpos de mensaje (body) y analizar los códigos de estado de forma profesional.
Qué son los métodos HTTP
HTTP define distintos “verbos” que indican la intención de la petición. Los más importantes en el diseño de APIs REST son:
| Método | Propósito | ¿Es Idempotente? |
|---|---|---|
| GET | Recuperar información de un recurso. | Sí |
| POST | Crear un nuevo recurso en el servidor. | No |
| PUT | Actualizar un recurso existente (lo reemplaza por completo). | Sí |
| PATCH | Actualizar parcialmente un recurso. | No |
| DELETE | Eliminar un recurso específico. | Sí |
| OPTIONS | Consultar qué métodos están permitidos para una URL. | Sí |
Controlar el método en Node.js
En Node.js nativo, podemos acceder al método HTTP directamente desde la propiedad req.method.
const server = http.createServer((req, res) => {
const { method, url } = req
if (url === '/usuarios') {
if (method === 'GET') {
// Lógica para devolver usuarios
return res.end('Lista de usuarios')
}
if (method === 'POST') {
// Lógica para crear un usuario
res.statusCode = 201
return res.end('Usuario creado')
}
// Si el método no es soportado para esta ruta
res.statusCode = 405
return res.end('Method Not Allowed')
}
})
Responder con 405: Method Not Allowed
Cuando una ruta existe pero el método utilizado no está permitido (por ejemplo, intentar hacer un DELETE en la /home), la respuesta correcta es devolver un código 405. Esto le dice al cliente: “La URL está bien, pero no puedes usar ese verbo aquí”.
Códigos de estado HTTP (Status Codes)
No basta con devolver texto; los códigos de estado son el lenguaje universal de la web. Aquí tienes los más comunes que usarás en tus APIs:
- 2xx (Éxito):
200 OK: Petición correcta.201 Created: Recurso creado con éxito (típico de POST).
- 4xx (Error del cliente):
400 Bad Request: La petición está mal formada.401 Unauthorized: No tienes permiso (falta login).404 Not Found: El recurso o ruta no existe.405 Method Not Allowed: El método no está permitido.
- 5xx (Error del servidor):
500 Internal Server Error: Algo explotó en el servidor.
Recurso útil: Si te cuesta recordarlos, visita http.cat, donde explican cada código de estado con fotos de gatos. ¡Es infalible! 🐱
Conclusión
Controlar métodos y códigos de estado correctamente:
- Hace tu API más profesional y predecible.
- Facilita enormemente el trabajo a quien consume tu API (ya sea un frontend u otro backend).
- Una API que responde siempre 200 OK no es una buena API.
En la siguiente clase empezaremos ya a construir una REST API real, aplicando todas estas convenciones desde el primer minuto.