Estou criando um aplicativo com uma API baseada em REST e cheguei ao ponto de especificar códigos de status para cada solicitação.
Qual código de status devo enviar para solicitações com falha na validação ou onde uma solicitação está tentando adicionar uma duplicata no meu banco de dados?
Examinei http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html, mas nenhum deles parece correto.
Existe uma prática comum ao enviar códigos de status?
http
rest
http-status-codes
alexn
fonte
fonte
Respostas:
Para falha na validação de entrada: 400 Solicitação incorreta + sua descrição opcional. Isso é sugerido no livro " RESTful Web Services ". Para envio duplo: 409 Conflito
Atualização junho de 2014
A especificação relevante costumava ser RFC2616 , que dava o uso de 400 (Bad Request) de maneira bastante restrita como
Portanto, poderia ter sido argumentado que era inapropriado para erros semânticos. Mas não mais; desde junho de 2014, a norma relevante RFC 7231 , que substitui a anterior RFC2616, fornece o uso de 400 (Bad Request) de maneira mais ampla
fonte
something perceived to be a client error
todos os exemplos dados neste parágrafo são violações do protocolo HTTP, não erros lógicos: sintaxe, enquadramento, roteamento. Portanto, considero que a especificação HTTP não permite 400 para falha na validação no nível do aplicativo.Você definitivamente deve dar uma explicação mais detalhada nos cabeçalhos de resposta e / ou no corpo (por exemplo, com um cabeçalho personalizado -
X-Status-Reason: Validation failed
).fonte
HTTP/1.0 403 Form validation errors
é o caminho mais limpo a seguir.Eu recomendo o código de status 422, "Entidade não processável" .
fonte
200,300, 400, 500 são todos muito genéricos. Se você quiser genérico, 400 está OK.
422 é usado por um número crescente de APIs e é usado até mesmo pelo Rails imediatamente.
Independentemente do código de status que você escolher para sua API, alguém discordará. Mas eu prefiro 422 porque penso em '400 + status de texto' como muito genérico. Além disso, você não está aproveitando um analisador pronto para JSON; por outro lado, um 422 com uma resposta JSON é muito explícito e muitas informações de erro podem ser transmitidas.
Falando em resposta JSON, costumo padronizar a resposta de erro do Rails para este caso, que é:
Esse formato é perfeito para validação de formulários, que considero o caso mais complexo para suporte em termos de "riqueza de relatórios de erros". Se a sua estrutura de erros for essa, provavelmente ela atenderá a todas as suas necessidades de relatório de erros.
fonte
arg1
é válido earg2
é válido, mas a combinação dos dois, com os valores específicos enviados, não é válida.200
Ugh ... (309, 400, 403, 409, 415, 422) ... muitas respostas tentando adivinhar, argumentar e padronizar qual é o melhor código de retorno para uma solicitação HTTP bem - sucedida, mas uma falha na chamada REST .
É errado misturar códigos de status HTTP e códigos de status REST.
No entanto, vi muitas implementações misturando-as e muitos desenvolvedores podem não concordar comigo.
Os códigos de retorno HTTP estão relacionados a
HTTP Request
ele próprio. Uma chamada REST é feita usando uma solicitação do Hypertext Transfer Protocol e funciona em um nível mais baixo do que o próprio método REST invocado. REST é um conceito / abordagem e sua saída é um resultado comercial / lógico , enquanto o código de resultado HTTP é um transporte .Por exemplo, retornar "404 Não encontrado" quando você chama / users / é confuso, porque pode significar:
"403 Proibido / Acesso Negado" pode significar:
E a lista pode continuar com 'Erro no servidor 500 "(um erro HTTP HTTP do Apache / Nginx ou um erro de restrição de negócios no REST) ou outros erros HTTP etc.
No código, é difícil entender qual foi o motivo da falha, uma falha HTTP (transporte) ou uma falha REST (lógica).
Se a solicitação HTTP foi fisicamente executada com sucesso, ela sempre deve retornar o código 200, independentemente dos registros encontrados ou não. Porque o recurso URI foi encontrado e foi tratado pelo servidor HTTP. Sim, pode retornar um conjunto vazio. É possível receber uma página da web vazia com 200 como resultado HTTP, certo?
Em vez disso, você pode retornar o código HTTP 200 com algumas opções:
Além disso, alguns provedores de Internet podem interceptar suas solicitações e retornar um código HTTP 404. Isso não significa que seus dados não foram encontrados, mas há algo errado no nível do transporte.
Do Wiki :
Por que não simplesmente responder com algo assim?
O Google sempre retorna 200 como código de status na API de geocodificação, mesmo que a solicitação falhe logicamente: https://developers.google.com/maps/documentation/geocoding/intro#StatusCodes
O Facebook sempre retorna 200 para solicitações HTTP bem-sucedidas, mesmo se a solicitação REST falhar: https://developers.facebook.com/docs/graph-api/using-graph-api/error-handling
É simples, os códigos de status HTTP são para solicitações HTTP. A API REST é sua, defina seus códigos de status.
fonte
BadRequest()
método .NET possui seu próprio modelo de retorno que será diferente do seu modelo de retorno regular. Isso é um pesadelo para analisar. @KevinHooke, retornar HTTP 200 para um erro de validação REST é como dizer: "Recebi sua mensagem, a resposta é não e eis o porquê". O retorno do HTTP 400 diz: "Não sei do que você está falando".Uma duplicata no banco de dados deve ser a
409 CONFLICT
.Eu recomendo usar
422 UNPROCESSABLE ENTITY
para erros de validação.Eu dou uma explicação mais longa dos códigos 4xx aqui .
fonte
O Código de Status 304 Não Modificado também daria uma resposta aceitável a uma solicitação duplicada. Isso é semelhante ao processamento de um cabeçalho do
If-None-Match
uso de uma tag de entidade.Na minha opinião, a resposta de @ Piskvor é a escolha mais óbvia para o que percebo ser a intenção da pergunta original, mas tenho uma alternativa que também é relevante.
Se você deseja tratar uma solicitação duplicada como um aviso ou notificação, e não como um erro, um código de status de resposta
304
Não Modificado e oContent-Location
cabeçalho que identifica o recurso existente também são válidos. Quando a intenção é apenas garantir a existência de um recurso, uma solicitação duplicada não seria um erro, mas uma confirmação. A solicitação não está errada, mas é simplesmente redundante, e o cliente pode se referir ao recurso existente.Em outras palavras, a solicitação é boa, mas como o recurso já existe, o servidor não precisa executar nenhum processamento adicional.
fonte
O adaptador ActiveRecord da Ember-Data espera
422 UNPROCESSABLE ENTITY
ser retornado do servidor. Portanto, se seu cliente estiver escrito em Ember.js, você deverá usar 422. Somente o DS.Errors será preenchido com erros retornados. Obviamente, você pode alterar 422 para qualquer outro código no seu adaptador.fonte