Código de status HTTP correto para entrada incorreta


169

Qual é o código de resposta HTTP ideal quando não está relatando 200 (tudo OK), mas com erro na entrada?

Como, você envia alguns dados para o servidor e isso responde que seus dados estão errados

usar 500parece mais com problema de servidor
usando 200com texto de resposta de aviso / erro é ruim (permitindo cache e tudo não está bem)
usando 204e retornando nada, talvez seja bom (mas com suporte?) o
uso 404está errado se o caminho solicitado (script) estiver disponível e no lugar apropriado


Veja minha resposta para obter detalhes stackoverflow.com/a/59527615/4127230
shiva2492 15/01

Respostas:


210

Tivemos o mesmo problema ao criar nossa API também. Estávamos procurando um código de status HTTP equivalente a um InvalidArgumentException. Depois de ler o artigo de origem abaixo, acabamos usando 422 Unprocessable Entityquais estados:

O código de status 422 (Entidade não processável) significa que o servidor entende o tipo de conteúdo da entidade solicitada (portanto, um código de status 415 (Tipo de mídia não suportado) é inapropriado) e a sintaxe da entidade solicitada está correta (portanto, 400 (Solicitação incorreta) ) código de status é inapropriado), mas não conseguiu processar as instruções contidas. 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.

fonte: https://www.bennadel.com/blog/2434-http-status-codes-for-invalid-data-400-vs-422.htm


138

Os códigos que começam com 4 (4xx) são destinados a erros do cliente. Talvez 400 (Bad Request) possa ser adequado para este caso? A definição em http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html diz:

"O pedido não pôde ser entendido pelo servidor devido à sintaxe malformada. O cliente NÃO DEVE repetir o pedido sem modificações."


13
400 Bad Requestnão é ruim, mas geralmente deve ser reservado para sintaxe malformada. O OP parece estar mais preocupado com um caso com sintaxe bem formada, mas com valores inválidos. Além disso, o 400 é um código de resposta bastante comum "ah, merda, algo não estava certo" que você pode querer diferenciar de um caso específico de entrada incorreta.
Keego 11/02

4
Observe que o texto foi atualizado na RFC 7231 e a "A solicitação não pôde ser entendida pelo servidor devido à sintaxe malformada" foi atualizada para "o servidor não pode ou não processará a solicitação devido a algo que é considerado um cliente erro (por exemplo, sintaxe de solicitação malformada, enquadramento de mensagem de solicitação inválida ou roteamento de solicitação enganoso) ".
Calimo 6/01/19

14

Além das especificações da RFC, você também pode ver isso em ação. Confira as respostas do twitter.

https://developer.twitter.com/en/docs/ads/general/guides/response-codes


19
Você pode obter mais votos positivos se retirar exemplos de seus links.
Jared Thirsk


1
Para mim, o link ( fb-developers.info/tech/fb_dev/faq/general/gen_10.html ) leva a um anúncio aleatório. Acho que o domínio foi falsificado
dmitry502 29/06

@ dmitry502 Respondido editado para remover o link falsificado. Obrigado pelo seu comentário
Francis

9

409 Conflict poderia ser uma solução aceitável.

De acordo com: https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

A solicitação não pôde ser concluída devido a um conflito com o estado atual do recurso. Esse código é permitido apenas em situações em que se espera que o usuário possa resolver o conflito e reenviar a solicitação. O corpo da resposta DEVE incluir informações suficientes para que o usuário reconheça a fonte do conflito. Idealmente, a entidade de resposta incluiria informações suficientes para que o usuário ou agente do usuário corrija o problema; no entanto, isso pode não ser possível e não é necessário.

O documento continua com um exemplo:

É provável que os conflitos ocorram em resposta a uma solicitação PUT. Por exemplo, se o controle de versão estava sendo usado e a entidade que estava com PUT incluía alterações em um recurso que entra em conflito com as feitas por uma solicitação anterior (de terceiros), o servidor pode usar a resposta 409 para indicar que não pode concluir a solicitação . Nesse caso, a entidade de resposta provavelmente conteria uma lista das diferenças entre as duas versões em um formato definido pela resposta Content-Type.


No meu caso, eu gostaria de colocar uma string, que deve ser exclusiva, em um banco de dados por meio de uma API. Antes de adicioná-lo ao banco de dados, estou verificando se ele ainda não está no banco de dados.

Se for, eu voltarei "Error: The string is already in the database", 409.

Acredito que é isso que o OP queria: um código de erro adequado para quando os dados não atendem aos critérios do servidor.


2

De acordo com o cenário abaixo,

Digamos que alguém faça uma solicitação ao seu servidor com dados no formato correto, mas que simplesmente não são dados "bons". Por exemplo, imagine que alguém postou um valor String em um ponto de extremidade da API que esperava um valor String; mas o valor da sequência continha dados que estavam na lista negra (por exemplo, impedindo as pessoas de usarem "senha" como senha). então o código de status pode ser 400 ou 422?

Até agora, eu teria retornado um "400 Bad Request", que, de acordo com o w3.org, significa:

A solicitação não pôde ser entendida pelo servidor devido à sintaxe incorreta. O cliente não deve repetir o pedido sem modificações.

Esta descrição não se encaixa bem na circunstância; mas, se você seguir a lista dos principais códigos de status HTTP definidos no protocolo HTTP / 1.1, provavelmente é sua melhor aposta.

Recentemente, no entanto, alguém da minha equipe de desenvolvimento apontou [para mim] que as APIs populares estão começando a usar extensões HTTP para ficar mais detalhadas com seus relatórios de erros. Especificamente, muitas APIs, como o Twitter e o Recurly, estão usando o código de status "422 Unprocessable Entity", conforme definido na extensão HTTP do WebDAV. O código de status HTTP 422 declara:

O código de status 422 (Entidade não processável) significa que o servidor entende o tipo de conteúdo da entidade solicitada (portanto, um código de status 415 (Tipo de mídia não suportado) é inapropriado) e a sintaxe da entidade solicitada está correta (portanto, 400 (Solicitação incorreta) ) código de status é inapropriado), mas não conseguiu processar as instruções contidas. 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.

Voltando ao nosso exemplo de senha acima, esse código de status 422 parece muito mais apropriado. O servidor entende o que você está tentando fazer; e entende os dados que você está enviando; simplesmente não permite que esses dados sejam processados.


-7

404 - Não encontrado - pode ser usado para O URI solicitado é inválido ou o recurso solicitado, como um usuário, não existe.


2
O OP já descartou essa possibilidade: " usando 404 é errado se caminho solicitado (roteiro) está disponível e em local apropriado "
Remy Lebeau
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.