Estoy creando una API RESTful que procesará una serie de interacciones del usuario, incluida la realización de pedidos con tarjetas de crédito almacenadas.
En el caso de un pedido exitoso, devuelvo un 200 OK, y en el caso de que la solicitud de pedido esté mal formada o no sea válida, devuelvo un 400 Bad Request. Pero, ¿qué debo devolver si hay algún problema durante el procesamiento real del pedido?
- El cliente envía un pedido al servidor para un recurso de usuario. Si el usuario no existe, se devuelve 404 Not Found.
- Se valida el formato y la información del pedido. Si no es válido, se devuelve 400 Bad Request.
- Se procesa el pedido. Si el pedido tiene éxito, se devuelve un 201 Created para el pedido. Si se encuentra un error inesperado, se devuelve un 500 Server Error.
El último paso es el problema: ¿qué devuelvo si el pedido no se completa por algún otro motivo? Los posibles escenarios podrían incluir:
- Producto agotado
- Se alcanzó el límite máximo de pedidos del usuario
- Error en la transacción de la tarjeta de crédito (fondos insuficientes, etc.)
Esto no parece que sea apropiado ni para 400 ni para 500. En todo caso, podría verlo como 400 si no hay un código mejor: la solicitud no era válida según las reglas comerciales. Simplemente no parece exacto.
Editar: También encontré esta discusión existente sobre el mismo tema. Todas las respuestas allí parecen apuntar al uso de códigos de estado para este tipo de infracción, con cierta discusión entre el uso de la extensión 400, 409 o 422.
fuente
Respuestas:
Debe utilizar 400 para las reglas comerciales. No devuelva 2xx si el pedido no fue aceptado. HTTP es un protocolo de aplicación, nunca lo olvides. Si devuelve 2xx, el cliente puede asumir que el pedido fue aceptado, independientemente de la información que envíe en el cuerpo.
Del libro de recetas de servicios web RESTful :
Dejaré que usted decida entre 4xx y 5xx, pero debe usar un código de estado de error.
fuente
Debe usar 4xx para un error de cliente si el cliente puede modificar la solicitud para evitar el error. Use un 5xx para un error del servidor que el cliente realmente no puede solucionar.
El producto agotado sería un error del servidor. El cliente no puede modificar la solicitud de alguna manera para evitar el error. Podría cambiar a otro producto, pero ¿no sería una nueva solicitud?
El límite máximo de pedidos del usuario alcanzado también es un error del servidor. El cliente no puede hacer nada para solucionar ese error.
La falla en la transacción de la tarjeta de crédito sería un error del cliente. El cliente podría volver a enviar la solicitud con un método de pago o número de tarjeta de crédito diferente para solucionar el error.
fuente
Tipo de error:
Código de error:
El servidor comprende el tipo de contenido de la entidad de solicitud (por lo tanto, un código de estado 415 Unsupported Media Type es inapropiado), y la sintaxis de la entidad de solicitud es correcta (por lo tanto, un código de estado 400 Bad Request es inapropiado) pero no pudo procesar el contenido instrucciones.
Por ejemplo, esta condición de error puede ocurrir si el cuerpo de una solicitud XML contiene instrucciones XML bien formadas (es decir, sintácticamente correctas), pero semánticamente erróneas.
https://httpstatuses.com/422
fuente
Sé que esta pregunta es antigua, pero hoy se me ocurrió la misma pregunta. Si mi usuario se queda sin créditos, ¿qué código de estado debería devolver mi API REST?
Tiendo a inclinarme hacia
402 Payment Required
:Según Wikipedia :
Y de hecho lo hacen :
fuente
¿Qué tal
424 Failed Dependency
? La especificación lo describe como:Pero también existe esta definición :
Puede decirle al cliente (o fingir) que tiene acciones internas que se supone que deben crear el pedido y deducir el saldo, y que una de esas acciones falló, aunque por razones perfectamente válidas, y es por eso que la solicitud falló.
Por lo que puedo ver, "acción" es un término bastante amplio y se puede usar en una variedad de situaciones, incluyendo stock insuficiente, crédito insuficiente o noche de fiesta en el almacén.
Otra opción puede ser
422 Unprocessable Entity
:Intentar solicitar un artículo que está agotado, o cuando no tienes crédito suficiente, puede considerarse un error a nivel semántico.
MozDev dice que esto indica un error del lado del cliente, específicamente: El cliente no debe repetir esta solicitud sin modificaciones.
Loopback 4 usa 422 cuando falla la validación de entrada.
Podría decirse que un stock insuficiente o una noche de fiesta en el almacén podrían considerarse estados temporales, por lo que la solicitud podría volver a intentarse más tarde. Esa situación puede ser indicada por
503 Service Unavailable
fuente
No creo que 400 se pueda utilizar para todo el escenario empresarial. Se puede utilizar para la validación básica de la entrada de datos. Más allá de eso, es posible que tengamos dificultades para ajustar otra lógica comercial en este código de error. El error manejado por esto son principalmente errores de tiempo de diseño que el desarrollador encontrará posiblemente durante la codificación del cliente.
Digamos que todos los parámetros son correctos y digamos que estamos pasando el número de cuenta de usuario a la solicitud.
Entonces, la solicitud ya no es una solicitud incorrecta, el servidor puede aceptar la solicitud. Pero ahora se niega a completar la solicitud basándose en la nueva información disponible, que es: la cuenta no tiene saldo suficiente.
Sugeriría que deberíamos usar 403 con el mensaje de error apropiado en esos escenarios.
Otro posible código de error podría ser el conflicto 409. Pero eso se usa en escenarios donde el recurso está en un estado consistente.
fuente
Yo voy con 406
Not Acceptable
.Aquí hay una lista 4xx:
fuente