Imagen del código de estado http 401
_Image based on Photo by Ashwini Chaudhary(Monty) on Unsplash_

El buen diseño de una REST API depende mucho de conocer los principales códigos de estado HTTP, y el saber como/cuando usarlos; revela nuestra experiencia como desarrollador.

Para ayudar a dominar los códigos de estado al crear API’s; dejo este resumen de los códigos HTTP mas usados o mas comunes:

Existen 5 familias o grupos de códigos de estados HTTP:

  1. 1XX -> Información
  2. 2XX -> Petición correcta
  3. 3XX -> Redirection
  4. 4XX -> Error de cliente
  5. 5XX -> Error de servidor.

Hay un tweet de @stevelosh. que define de manera graciosa el objetivo de cada rango o familia de codigos HTTP.

English:

HTTP Status Code HTTP Description
100 hold on
200 here you go
300 go away
400 you messed up (client)
500 I messed up (server)

Spanish:

Código de Estado HTTP Descripción del Código
100 espera
200 aquí tienes
300 vete
400 tu lo has hecho mal (cliente)
500 yo lo he hecho mal (server)

Algunos de los códigos HTTP mas usados:

En el rango 100

  • 100: Es un código muy raro en http, y se puede encontrar al usar websocket. Los websockets usan el código 100 para intercambiar cierta información de protocolo que sirve para establecer la conexión.

En el rango 200

  • 200: OK
  • 201: CREATED, devuelve una cabecera location, que es una URL de donde se puede consultar el nuevo recurso, creado.
  • 202: ACCEPTED, Encolado en caso de usar colas servicios o workers, también devuelve una cabecera location que es una URL de donde se puede consultar el recurso.
  • 204: NO CONTENT, es como si el servidor te dijera, “te entendí pero no voy a decir nada”.

En el rango 300

  • 301: MOVED PERMANENTLY, es usado para redirección a largo plazo, el navegador guarda en cache la redirección. Ejm: Cuando la pagina cambio de nombre.
  • 302: ENCONTRADO Y REDIRECCIÓN TEMPORAL, redirecciona a otro lugar. Ejm: Redirección en proceso de login.
  • 303: SEE OTHER
  • 304: NOT MODIFIED, se usa cuando el servidor web implementa un tipo de cache.
  • 307: TEMPORARY REDIRECT
  • 308: PERMANENT REDIRECT

Los códigos 307 y 308 funcionan como 302 y 301 respectivamente (Redirección temporal y permanente), pero debemos recordar que si los métodos usados en la request de la URL son POST, PUT o DELETE y los códigos a usar/retornar son 301 o 302, los métodos se se cambiaran por GET. Tener muy en cuenta esto por que podría dar errores.

  • 301 y 302, cambia el método de la request por GET.
  • 307 y 308, mantienen el método enviado en la request(POST, PUT, DELETE).

En el rango 400

Se usan cuando el error ha sido provocado por algo que hizo el cliente, Ejm: Se envió mal una petición/request, no se envió un parámetro obligatorio/requerido, o hacer request a una URL que no existe.

  • 400: BAD REQUEST.
  • 401 y 403: UNAUTHORIZED AND FORBIDDEN ERRORS
  • 404: NOT FOUND
  • 410: GONE, ya no existe o se ha ido, Nuevo Ejm: Cuando se publica un tweet polémico y decides borrarlo; y cuando alguien con el URL quiere volver a ver el tweet, podría devolver 410, porque ha sido eliminado y ya no existe.
  • 422: UNPROCESSABLE ENTITY, en caso de que lso parámetros pasados sean inválidos. Ejm: no se envía parámetro correcto u obligatorio en el request.
  • 451: UNAVAILABLE FOR LEGAL REASONS.

En el rango 500

En este rango, existen muchos códigos de estados, pero el mas importante es el 500. Se usando ha habido un error interno en el servidor, tales como una excepción, una conexión dañada o un error en la base de datos, puede darse el caso que nuestro servidor este consultando por detrás a otro servidor y este le este respondiendo a tiempo, etc.

  • 500: INTERNAL SERVER ERROR.
  • 502: BAD GATEWAY.
  • 503: SERVICE UNAVAILABLE.
  • 504: GATEWAY TIMEOUT, el servidor esta tardando mucho en responder.

Conclusiones y Recomendaciones

Debemos tener en cuenta que como desarrolladores, a pesar de saber el error exacto que podríamos usar o retornar, y aunque sea buena practica responder con el código de estado especifico; debemos tomar muy en cuenta el punto de vista de la Seguridad. Seria mejor ser vago/no especifico con el código de estado que retornemos y mostrar un código mas genérico, Ejm: error 500 o 404.

Esto con el simple motivo de salvaguardar la seguridad de la app, y evitar que hackers o personas mal intencionadas indaguen en los códigos de respuesta HTTP y facilitandoles encontrar debilidades que pueda tener nuestro sistema.

Podemos ver mas a detalle los códigos de estado HTTP en los siguientes sitios:

Referencias

Obtenido del libro Express in Action, y de un tweet de @stevelosh y de la explicación en el canal de makigas.es.