Estou criando uma API RESTful que processará várias interações do usuário, incluindo fazer pedidos usando cartões de crédito armazenados.
No caso de um pedido bem-sucedido, estou retornando um 200 OK e, no caso de o pedido de pedido ser malformado ou inválido, estou retornando um 400 Bad Request. Mas o que devo devolver se houver um problema durante o processamento real do pedido?
- Cliente POSTS pedido para servidor para um recurso de usuário. Se o usuário não existir, 404 Not Found é retornado.
- O formato e as informações do pedido são validados. Se não for válido, 400 Bad Request é retornado.
- O pedido é processado. Se o pedido for bem-sucedido, um 201 Created é retornado para o pedido. Se um erro inesperado for encontrado, um 500 Server Error será retornado.
A última etapa é o problema - o que devo retornar se o pedido não for concluído por qualquer outro motivo? Os possíveis cenários podem incluir:
- Produto esgotado
- Limite máximo de pedido do usuário atingido
- Falha na transação do cartão de crédito (fundos insuficientes, etc.)
Isso não parece apropriado para um 400 ou 500. Eu poderia ver como um 400 se não houvesse um código melhor - a solicitação era inválida de acordo com as regras de negócios. Simplesmente não parece preciso.
Edit: Também encontrou esta discussão existente do mesmo tópico. Todas as respostas lá parecem apontar para o uso de códigos de status para este tipo de violação, com alguma discussão entre o uso de 400, 409 ou o ramal 422.
fonte
Respostas:
Você deve usar 400 para regras de negócios. Não devolva 2xx se a encomenda não foi aceite. HTTP é um protocolo de aplicativo, nunca se esqueça disso. Se devolver 2xx o cliente pode presumir que a encomenda foi aceite, independentemente de qualquer informação que envie no corpo.
Do RESTful Web Services Cookbook :
Vou deixar para você decidir entre 4xx e 5xx, mas você deve usar um código de status de erro.
fonte
Você deve usar 4xx para um erro do cliente se o cliente puder modificar a solicitação para contornar o erro. Use um 5xx para um erro de servidor que o cliente realmente não pode contornar.
Produto esgotado seria um erro do servidor. O cliente não pode modificar a solicitação de alguma forma para contornar o erro. Você poderia mudar para outro produto, mas isso não seria um novo pedido?
O limite máximo de pedido do usuário atingido também é um erro do servidor. Nada que o cliente possa fazer para contornar esse erro.
A falha na transação do cartão de crédito seria um erro do cliente. O cliente pode reenviar a solicitação com um método de pagamento ou número de cartão de crédito diferente para solucionar o erro.
fonte
Tipo de erro:
Erro de código:
O servidor entende o tipo de conteúdo da entidade de solicitação (portanto, um código de status 415 de tipo de mídia não suportado é inadequado) e a sintaxe da entidade de solicitação está correta (portanto, um código de status 400 Bad Request é inadequado), mas não foi capaz de processar o contido instruções.
Por exemplo, essa condição de erro pode ocorrer se um corpo de solicitação XML contiver instruções XML bem formadas (ou seja, sintaticamente corretas), mas semanticamente erradas.
https://httpstatuses.com/422
fonte
Eu sei que essa pergunta é antiga, mas eu fiz a mesma pergunta hoje. Se meu usuário ficar sem créditos, qual código de status minha API REST deve retornar?
Eu tendo a me inclinar para
402 Payment Required
:De acordo com a Wikipedia :
E de fato eles fazem :
fonte
Que tal
424 Failed Dependency
? A especificação o descreve como:Mas também existe esta definição :
Você pode dizer ao cliente (ou fingir) que tem ações internas que devem criar o pedido e deduzir o saldo, e que uma dessas ações falhou, embora por motivos perfeitamente válidos, e é por isso que a solicitação falhou.
Pelo que posso ver, "ação" é um termo bastante amplo e pode ser usado em uma variedade de situações, incluindo estoque insuficiente, crédito insuficiente ou noite de festa no armazém.
Outra opção pode ser
422 Unprocessable Entity
:Tentar solicitar um item esgotado ou com crédito insuficiente pode ser considerado um erro semântico.
MozDev diz que isso indica um erro do lado do cliente, especificamente: O cliente não deve repetir esta solicitação sem modificação.
Loopback 4 usa 422 quando a validação de entrada falha.
Indiscutivelmente, estoque insuficiente ou noite de festa no armazém podem ser considerados estados temporários, portanto, a solicitação pode ser tentada novamente mais tarde. Essa situação pode ser indicada por
503 Service Unavailable
fonte
Eu não acho que 400 pode ser usado para todo o cenário de negócios. Ele pode ser usado para validação de entrada de dados básicos. Além disso, talvez seja difícil encaixar outra lógica de negócios nesse código de erro. Os erros tratados por isso são principalmente erros de tempo de design que o desenvolvedor encontrará possivelmente durante a codificação do cliente.
Digamos que todos os parâmetros estejam corretos e que estejamos passando o número da conta do usuário para a solicitação.
Portanto, a solicitação agora não é mais uma solicitação incorreta, o servidor pode aceitar a solicitação. Mas agora se recusa a preencher o pedido com base nas novas informações disponíveis, que é - a conta não tem saldo suficiente.
Eu sugeriria que devemos usar 403 com a mensagem de erro apropriada nesses cenários.
Outro código de erro possível pode ser o conflito 409. Mas isso é usado em cenários onde o recurso está em estado consistente.
fonte
Eu vou com 406
Not Acceptable
.Aqui está uma lista 4xx:
fonte