REST API error retorno buenas prácticas [cerrado]


Estoy buscando orientación sobre buenas prácticas cuando se trata de devolver errores de una API REST. Estoy trabajando en una nueva API para que pueda tomar cualquier dirección en este momento. Mi tipo de contenido es XML en este momento, pero planeo admitir JSON en el futuro.

Ahora estoy agregando algunos casos de error, como por ejemplo un cliente intenta agregar un nuevo recurso pero ha excedido su cuota de almacenamiento. Ya estoy manejando ciertos casos de error con códigos de estado HTTP (401 para autenticación, 403 para autorización y 404 para URIS de solicitud simple y mala). Revisé los benditos códigos de error HTTP, pero ninguno de los 400-417 parece correcto para reportar errores específicos de la aplicación. Así que al principio tuve la tentación de devolver mi error de aplicación con 200 OK y una carga útil XML específica (es decir. ¡Pague más y obtendrá el almacenamiento que necesita!) pero me detuve a pensar en ello y parece jabonoso (/encogerme de hombros con horror). Además, se siente como si estuviera dividiendo las respuestas de error en distintos casos, ya que algunos son impulsados por código de estado http y otros están impulsados por el contenido.

Entonces, ¿cuáles son las recomendaciones de la industria? Buenas prácticas (¡explique por qué!) y también, desde un cliente pov, ¿qué tipo de manejo de errores en la API REST hace la vida más fácil para el código del cliente?

Author: Michael Freidgeim, 2009-06-03

12 answers

Así que al principio tuve la tentación de devolver mi error de aplicación con 200 OK y una carga XML específica (es decir. ¡Pague más y obtendrá el almacenamiento que necesita!) pero me detuve a pensar en ello y parece jabonoso (/encogerme de hombros con horror).

No devolvería un 200 a menos que realmente no hubiera nada malo con la solicitud. Desde RFC2616, 200 significa "la solicitud ha tenido éxito."

Si se ha excedido la cuota de almacenamiento del cliente (por cualquier razón), devolvería un 403 (Prohibido):

El servidor entendió la solicitud, pero se niega a cumplirla. La autorización no ayudará y la solicitud NO debe repetirse. Si el método de solicitud no era HEAD y el servidor desea hacer público por qué la solicitud no se ha cumplido, debe describir el motivo de la denegación en la entidad. Si el servidor no desea que esta información esté disponible para el cliente, se puede usar el código de estado 404 (No encontrado) en su lugar.

Esto dice el cliente que la solicitud estaba bien, pero que falló (algo que un 200 no hace). Esto también le da la oportunidad de explicar el problema (y su solución) en el cuerpo de respuesta.

¿Qué otras condiciones de error específicas tienes en mente?

 197
Author: Rich Apodaca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-03 04:08:13

Un gran recurso para elegir el código de error HTTP correcto para su API: http://www.codetinkerer.com/2015/12/04/choosing-an-http-status-code.html

Un extracto del artículo:

Por dónde empezar:

introduzca la descripción de la imagen aquí

2XX / 3XX:

introduzca la descripción de la imagen aquí

4XX:

introduzca la descripción de la imagen aquí

5XX:

introduzca la descripción de la imagen aquí

 473
Author: Omar Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-17 19:50:28

La opción principal es si desea tratar el código de estado HTTP como parte de su API REST o no.

Ambas formas funcionan bien. Estoy de acuerdo en que, estrictamente hablando, una de las ideas de REST es que debe utilizar el código de estado HTTP como parte de su API (devolver 200 o 201 para una operación exitosa y un 4xx o 5xx dependiendo de varios casos de error.) However, there are no REST police. Puedes hacer lo que quieras. He visto APIs no REST mucho más atroces que se llaman " RESTful."

En este punto (agosto, 2015) recomiendo que use el código de estado HTTP como parte de su API. Ahora es mucho más fácil ver el código devuelto al usar frameworks de lo que era en el pasado. En particular, ahora es más fácil ver el caso de devolución no 200 y el cuerpo de respuestas no 200 de lo que era en el pasado.

El código de estado HTTP es parte de su api

  1. Tendrá que elegir cuidadosamente los códigos 4xx que se ajusten a sus condiciones de error. Usted puede incluir un mensaje rest, xml o texto plano como carga útil que incluye un subcódigo y un comentario descriptivo.

  2. Los clientes necesitarán usar un marco de software que les permita obtener el código de estado a nivel HTTP. Por lo general, puede hacerlo, no siempre es sencillo.

  3. Los clientes tendrán que distinguir entre los códigos de estado HTTP que indican un error de comunicación y sus propios códigos de estado que indican un nivel de aplicación cuestión.

El código de estado HTTP NO forma parte de tu api

  1. El código de estado HTTP siempre será 200 si su aplicación recibió la solicitud y luego respondió (tanto en casos de éxito como de error)

  2. TODAS sus respuestas deben incluir información de "sobre" o "encabezado". Normalmente algo como:

    envelope_ver: 1.0
    status:  # use any codes you like. Reserve a code for success. 
    msg: "ok" # A human string that reflects the code. Useful for debugging.
    data: ...  # The data of the response, if any.
  3. Este método puede ser más fácil para los clientes, ya que el estado de la respuesta siempre está en el mismo lugar (sin sub-códigos necesario), sin límites en los códigos, sin necesidad de obtener el código de estado de nivel HTTP.

Aquí hay un post con una idea similar: http://yuiblog.com/blog/2008/10/15/datatable-260-part-one /

Cuestiones principales:

  1. Asegúrese de incluir números de versión para que pueda cambiar más adelante la semántica de la api si es necesario.

  2. Documento...

 81
Author: Larry K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-21 11:01:06

Recuerde que hay más códigos de estado que los definidos en los RFC HTTP/1.1, el registro IANA está en http://www.iana.org/assignments/http-status-codes . Para el caso que mencionaste el código de estado 507 suena bien.

 40
Author: Julian Reschke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-01 07:00:15

Como otros han señalado, tener una entidad de respuesta en un código de error es perfectamente permisible.

Recuerde que los errores 5xx son del lado del servidor, también conocido como el cliente no puede cambiar nada a su solicitud para hacer que la solicitud pase. Si se excede la cuota del cliente, eso definitivamente no es un error del servidor, por lo que se debe evitar 5xx.

 22
Author: SerialSeb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-04 13:54:39

Sé que esto es extremadamente tarde para la fiesta, pero ahora, en el año 2013, tenemos algunos tipos de medios para cubrir el manejo de errores de una manera distribuida (RESTful) común. Véase " vnd.error", application / vnd.error + json ( https://github.com/blongden/vnd.error) y "Detalles del problema para las API HTTP", aplicación / problema + json ( https://tools.ietf.org/html/draft-nottingham-http-problem-05).

 19
Author: Jørn Wildt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-18 09:49:52

Hay dos tipos de errores. Errores de aplicación y errores HTTP. Los errores HTTP son solo para que su controlador AJAX sepa que las cosas salieron bien y no deben usarse para nada más.

5xx Error del servidor

500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
505 HTTP Version Not Supported
506 Variant Also Negotiates (RFC 2295 )
507 Insufficient Storage (WebDAV) (RFC 4918 )
509 Bandwidth Limit Exceeded (Apache bw/limited extension)
510 Not Extended (RFC 2774 )

2xx Éxito

200 OK
201 Created
202 Accepted
203 Non-Authoritative Information (since HTTP/1.1)
204 No Content
205 Reset Content
206 Partial Content
207 Multi-Status (WebDAV)

Sin embargo, cómo diseñar los errores de su aplicación depende realmente de usted. Stack Overflow, por ejemplo, envía un objeto con response, data y message propiedades. Creo que la respuesta contiene true o false para indicar si la operación fue exitosa (generalmente para operaciones de escritura). Los datos contienen la carga útil (generalmente para operaciones de lectura) y el mensaje contiene cualquier metadata adicional o mensajes útiles (como mensajes de error cuando response es false).

 17
Author: aleemb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-03 09:21:14

De acuerdo. La filosofía básica de REST es utilizar la infraestructura web. Los códigos de estado HTTP son el marco de mensajería que permite a las partes comunicarse entre sí sin aumentar la carga útil HTTP. Son códigos universales ya establecidos que transmiten el estado de la respuesta, y por lo tanto, para ser verdaderamente RESTful, las aplicaciones deben usar este marco para comunicar el estado de la respuesta.

Enviar una respuesta de error en un sobre HTTP 200 es engañoso, y obliga a cliente (consumidor api) para analizar el mensaje, muy probablemente de una manera no estándar o propietaria. Esto tampoco es eficiente: obligará a sus clientes a analizar la carga útil HTTP cada vez para comprender el estado de respuesta" real". Esto aumenta el procesamiento, agrega latencia y crea un entorno para que el cliente cometa errores.

 9
Author: Kingz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-21 17:38:01

Modelado de su api en las 'mejores prácticas' existentes podría ser el camino a seguir. Por ejemplo, así es como Twitter maneja los códigos de error https://developer.twitter.com/en/docs/basics/response-codes

 6
Author: Gokul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-08 04:08:51

Por favor, apégate a la semántica del protocolo. Use 2xx para respuestas exitosas y 4xx, 5xx para respuestas de error, ya sean excepciones de su negocio u otras. Si el uso de 2xx para cualquier respuesta hubiera sido el caso de uso previsto en el protocolo, no tendrían otros códigos de estado en primer lugar.

 4
Author: rahil008,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-14 06:42:33

No olvide los errores 5xx también para los errores de aplicación.

En este caso, ¿qué pasa con 409 (Conflicto)? Esto supone que el usuario puede solucionar el problema eliminando los recursos almacenados.

De lo contrario 507 (no completamente estándar) también puede funcionar. No usaría 200 a menos que uses 200 para errores en general.

 3
Author: Kathy Van Stone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-03 15:38:00

Si se excede la cuota de cliente es un error de servidor, evite 5xx en esta instancia.

 -1
Author: fixed annuity,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-06 00:02:45