Los códigos de estado
Las cinco familias, los códigos concretos que se preguntan una y otra vez, y la cabecera que acompaña a cada uno para que la respuesta sea útil.
Las cinco familias
Toda respuesta HTTP lleva un código de tres cifras. El primer dígito basta para saber qué ha pasado y, sobre todo, de quién es el problema si lo hay.
| Familia | Nombre | Qué dice |
|---|---|---|
| 1xx | Informativos | Se ha recibido la petición y el intercambio continúa |
| 2xx | Éxito | La petición se ha recibido, entendido y aceptado |
| 3xx | Redirecciones | Hace falta una acción más, normalmente ir a otra dirección |
| 4xx | Error del cliente | La petición está mal: sintaxis, permisos o recurso inexistente |
| 5xx | Error del servidor | La petición era correcta pero el servidor no ha podido atenderla |
La frontera que hay que tener clarísima está entre el 4 y el 5: en la familia 4xx la culpa es de quien pregunta, y en la 5xx de quien contesta.
Códigos de estado HTTP
1xx · informativo
- 100 Continue
- 101 Switching Protocols
2xx · éxito
- 200 OK
- 201 Created
- 204 No Content
3xx · redirección
- 301 permanente
- 302 temporal
- 304 no modificado
4xx · error del cliente
- 400
- 401 no autenticado
- 403 prohibido
- 404
- 405
- 429
5xx · error del servidor
- 500
- 502
- 503 no disponible
- 504 tiempo agotado
Para el examen
1xx y 2xx: informativo y éxito
3xx: redirección
4xx: error del cliente
5xx: error del servidor
Informativos y éxito: 1xx y 2xx
Los 1xx son provisionales: no cierran el intercambio. El 100 Continue le dice al cliente que puede seguir enviando el cuerpo, y el 101 Switching Protocols confirma un cambio de protocolo sobre la misma conexión, que es como arranca una conexión WebSocket.
| Código | Nombre | Cuándo se devuelve |
|---|---|---|
| 200 | OK | El caso normal: la petición ha ido bien y la respuesta lleva el resultado |
| 201 | Created | Se ha creado un recurso nuevo. Acompaña a un POST o a un PUT, y su dirección viaja en Location |
| 202 | Accepted | La petición se ha aceptado para procesarla más tarde, así que todavía no hay resultado que prometer. Típico de procesos por lotes |
| 204 | No Content | Todo ha ido bien y no hay nada que devolver. Habitual tras un DELETE |
| 206 | Partial Content | Se devuelve solo el fragmento pedido con la cabecera Range |
Los códigos 204 y 206 se añaden aquí porque entran a examen con frecuencia. La confusión típica es entre 200 y 201: si la petición ha creado algo nuevo, lo correcto es 201 y no 200.
Para el examen
200: correcto
201: creado; el que responde a una creación
204: correcto, sin contenido
Las redirecciones: 3xx
Salvo el 304, todos los 3xx llevan la cabecera Location con la nueva dirección, y el navegador la sigue sin preguntar. Lo que distingue a unos de otros es si el cambio es definitivo y si se conserva el método original.
| Código | Nombre | Qué implica |
|---|---|---|
| 301 | Moved Permanently | El recurso ha cambiado de dirección para siempre. El navegador y los buscadores actualizan el enlace |
| 302 | Found | El cambio es temporal: la próxima vez hay que volver a pedirlo en la dirección original |
| 303 | See Other | El resultado hay que recogerlo en otra dirección, siempre con GET |
| 304 | Not Modified | La copia guardada sigue valiendo. No lleva cuerpo ni Location |
| 307 | Temporary Redirect | Como el 302, pero obliga a conservar el método y el cuerpo originales |
| 308 | Permanent Redirect | Como el 301, pero obliga a conservar el método y el cuerpo originales |
301 permanente y 302 temporal. Y el 304 es el intruso de la familia: no redirige a ninguna parte, es la respuesta a una petición condicional.
Para el examen
301 y 302: permanente y temporal
304: no modificado; ni siquiera lleva cuerpo
307 y 308: conservan el método original
Errores del cliente: 4xx
Es la familia más numerosa y la que más cae. Casi todos sus códigos tienen una cabecera asociada que convierte el error en algo accionable.
| Código | Nombre | Qué ha ocurrido |
|---|---|---|
| 400 | Bad Request | La petición está mal formada y el servidor ni siquiera puede interpretarla |
| 401 | Unauthorized | Falta autenticarse. El servidor no sabe quién es. Acompaña siempre a WWW-Authenticate |
| 403 | Forbidden | Sabe quién es y no le deja. Autenticarse otra vez no arregla nada |
| 404 | Not Found | El recurso no existe en esa dirección |
| 405 | Method Not Allowed | El recurso existe pero no admite ese método. La respuesta enumera los válidos en la cabecera Allow |
| 413 | Content Too Large | El cuerpo enviado supera lo que el servidor acepta |
El par 401 y 403 es la pregunta clásica y se resuelve con dos frases: el 401 dice «no sé quién eres», y el 403 dice «sé quién eres y aun así no puedes». Un ejemplo del 405 en esta plataforma: la dirección de un intento admite GET, pero si alguien intenta un POST contra ella el servidor responde 405 y devuelve Allow con los métodos que sí valen.
Para el examen
401: no te has autenticado
403: te conozco y aun así no puedes
404 y 405: no existe y método no permitido
429: demasiadas peticiones
Errores del servidor: 5xx
Aquí la petición era correcta y el fallo está del otro lado. Distinguirlos importa porque cada uno apunta a una pieza distinta de la infraestructura.
| Código | Nombre | Dónde está el fallo |
|---|---|---|
| 500 | Internal Server Error | Error genérico de la aplicación: algo ha reventado y no hay más detalle |
| 502 | Bad Gateway | El servidor actuaba de pasarela y quien está detrás le ha respondido algo inválido |
| 503 | Service Unavailable | El servicio no está disponible ahora mismo: sobrecarga o mantenimiento. Puede indicar cuándo volver con Retry-After |
| 504 | Gateway Timeout | La pasarela ha esperado al servidor de detrás y este no ha contestado a tiempo |
502, 503 y 504 hablan de intermediarios y de disponibilidad, no del código de la aplicación. El que señala a la aplicación es el 500.
Para el examen
500: error genérico
502: pasarela incorrecta
503: servicio no disponible: saturación o mantenimiento
504: tiempo agotado en la pasarela