Definición
Los métodos HTTP (también llamados verbos HTTP) definen qué acción quieres realizar sobre un recurso. Piensa en ellos como los verbos en una oración: la URL te dice qué (el sustantivo/recurso), y el método te dice la acción (el verbo).
Los principales métodos HTTP se mapean hermosamente a operaciones CRUD: GET (leer), POST (crear), PUT/PATCH (actualizar), DELETE (eliminar). Cada método tiene semánticas específicas: las peticiones GET deben ser seguras (sin efectos secundarios), PUT/DELETE deben ser idempotentes (mismo resultado si se repiten), y POST puede crear nuevos recursos.
Aunque HTTP define nueve métodos, las APIs RESTful usan principalmente cinco: GET, POST, PUT, PATCH y DELETE. Otros como HEAD, OPTIONS y TRACE sirven propósitos específicos. Entender qué método usar y por qué es fundamental para diseñar APIs limpias e intuitivas.
Ejemplo
API de Blog - CRUD Completo:
GET /posts- Listar todas las publicaciones del blogGET /posts/123- Leer publicación específicaPOST /posts- Crear nueva publicaciónPUT /posts/123- Reemplazar publicación completaPATCH /posts/123- Actualizar parte de publicación (solo título)DELETE /posts/123- Eliminar publicación
Carrito de E-commerce:
GET /cart- Ver contenido del carritoPOST /cart/items- Añadir artículo al carritoPATCH /cart/items/456- Actualizar cantidadDELETE /cart/items/456- Eliminar artículoDELETE /cart- Limpiar todo el carrito
Gestión de Usuarios:
GET /users?role=admin- Listar usuarios administradoresPOST /users- Crear nueva cuenta de usuarioPUT /users/789- Actualizar perfil completo de usuarioPATCH /users/789- Cambiar solo contraseñaDELETE /users/789- Desactivar cuenta
Analogía
Control Remoto de TV: Los métodos HTTP son como botones en un control remoto:
- GET = Botón INFO (muestra información, no cambia nada)
- POST = Botón GRABAR (crea una nueva grabación)
- PUT = Botón PRESET (reemplaza configuración preset completa)
- PATCH = VOLUMEN+ (cambia un aspecto)
- DELETE = Botón BORRAR (elimina una grabación)
Sistema de Tarjeta de Biblioteca:
- GET = Navegar libros (solo mirar, no cambia inventario)
- POST = Solicitar nuevo libro (crea nuevo registro de préstamo)
- PUT = Renovar préstamo (reemplaza fecha de vencimiento antigua con nueva)
- PATCH = Extender fecha de vencimiento 2 semanas (actualización parcial)
- DELETE = Devolver libro (elimina registro de préstamo)
Ejemplo de Código
// GET - Recuperar recurso (seguro, idempotente)
GET /api/users/123 HTTP/1.1
Host: api.example.com
// POST - Crear recurso (no idempotente)
POST /api/users HTTP/1.1
Content-Type: application/json
{"name": "Alice", "email": "[email protected]"}
// PUT - Reemplazar recurso (idempotente)
PUT /api/users/123 HTTP/1.1
Content-Type: application/json
{"name": "Alice Smith", "email": "[email protected]", "role": "admin"}
// PATCH - Actualización parcial (idempotente)
PATCH /api/users/123 HTTP/1.1
Content-Type: application/json
{"email": "[email protected]"}
// DELETE - Eliminar recurso (idempotente)
DELETE /api/users/123 HTTP/1.1
// OPTIONS - Descubrir métodos permitidos
OPTIONS /api/users/123 HTTP/1.1
// Respuesta: Allow: GET, PUT, PATCH, DELETE
// HEAD - Obtener metadatos sin cuerpo
HEAD /api/users/123 HTTP/1.1
// Respuesta: solo cabeceras, sin cuerpo
Diagrama
graph TD A[Métodos HTTP] --> B[Métodos Seguros] A --> C[Métodos Inseguros] B --> D[GET] B --> E[HEAD] B --> F[OPTIONS] C --> G[Idempotentes] C --> H[No Idempotentes] G --> I[PUT] G --> J[DELETE] G --> K[PATCH*] H --> L[POST]
Mejores Prácticas
- Usar GET para leer datos (nunca modificar con GET)
- Usar POST para crear nuevos recursos
- Usar PUT para reemplazo completo, PATCH para actualizaciones parciales
- Usar DELETE para eliminar recursos
- Devolver códigos de estado apropiados (201 para POST, 204 para DELETE)
- Hacer PUT, PATCH, DELETE idempotentes
- Mantener peticiones GET seguras (sin efectos secundarios)
- Soportar OPTIONS para preflight CORS
- Usar POST para operaciones complejas que no encajan en CRUD
- Documentar qué métodos soporta cada endpoint
Errores Comunes
Usar GET para acciones que modifican datos, usar POST para todo, confundir PUT y PATCH, devolver 200 OK para DELETE en lugar de 204 No Content, no implementar idempotencia para PUT/DELETE, olvidar manejar OPTIONS para CORS, usar DELETE con cuerpo de petición (algunos servidores lo ignoran).