Estou tentando descobrir qual o código de status correto para retornar em diferentes cenários com uma API "semelhante a REST" na qual estou trabalhando. Digamos que eu tenha um ponto final que permita compras POST no formato JSON. Se parece com isso:
{
"account_number": 45645511,
"upc": "00490000486",
"price": 1.00,
"tax": 0.08
}
O que devo retornar se o cliente me enviar "sales_tax" (em vez do esperado "imposto"). Atualmente, estou retornando um 400. Mas comecei a me questionar sobre isso. Eu realmente deveria estar retornando um 422? Quero dizer, é JSON (que é suportado) e é válido JSON, apenas não contém todos os campos obrigatórios.
rest
http-status-codes
David S
fonte
fonte
Respostas:
400 Solicitação incorreta agora parece ser o melhor código de status HTTP / 1.1 para o seu caso de uso.
No momento da sua pergunta (e da minha resposta original), a RFC 7231 não era uma coisa; Nesse ponto, opus-me
400 Bad Request
porque a RFC 2616 disse (com ênfase minha):e a solicitação que você descreve é JSON sintaticamente válido, envolto em HTTP sintaticamente válido e, portanto, o servidor não tem problemas com a sintaxe da solicitação.
No entanto, como apontado por Lee Saferite nos comentários , a RFC 7231, que obsoleta a RFC 2616, não inclui essa restrição :
No entanto, antes dessa reformulação (ou se você quiser discutir sobre o RFC 7231 ser apenas um padrão proposto no momento),
422 Unprocessable Entity
não parece um código de status HTTP incorreto para o seu caso de uso, porque, como diz a introdução ao RFC 4918:E a descrição do
422
diz:(Observe a referência à sintaxe; suspeito 7231 parcialmente obsoleto 4918 também)
Isso soa exatamente como a sua situação, mas, para o caso de haver alguma dúvida, continua dizendo:
(Substitua "XML" por "JSON" e acho que podemos concordar que essa é a sua situação)
Agora, alguns argumentarão que o RFC 4918 é sobre "Extensões HTTP para criação e versão distribuída na Web (WebDAV)" e que você (presumivelmente) não está fazendo nada que envolva o WebDAV, portanto, não deve usar nada disso.
Dada a escolha entre usar um código de erro no padrão original que explicitamente não cobre a situação, e um de uma extensão que descreve exatamente a situação, eu escolheria o último.
Além disso, a Seção 21.4 da RFC 4918 refere-se ao Registro de Código de Status HTTP (IANA Hypertext Transfer Protocol) , onde 422 podem ser encontrados.
Proponho que seja totalmente razoável que um cliente ou servidor HTTP use qualquer código de status desse registro, desde que o faça corretamente.
Mas a partir do HTTP / 1.1, o RFC 7231 tem tração, então use
400 Bad Request
!fonte
400 Solicitação incorreta é o código de status HTTP adequado para o seu caso de uso. O código é definido pelo HTTP / 0.9-1.1 RFC.
http://tools.ietf.org/html/rfc2616#section-10.4.1
422 Entidade não processável é definida pelo RFC 4918 - WebDav. Observe que há uma pequena diferença em comparação com 400, veja o texto citado abaixo.
Para manter a interface uniforme, você deve usar 422 apenas em um caso de respostas XML e também deve suportar todos os códigos de status definidos pela extensão Webdav, não apenas 422.
http://tools.ietf.org/html/rfc4918#page-78
Veja também a publicação de Mark Nottingham sobre códigos de status:
Como pensar sobre códigos de status HTTP
fonte
The following status codes are added to those defined in HTTP/1.1 [RFC2616].
Para refletir o status a partir de 2015:
Comportamentalmente, os códigos de resposta 400 e 422 serão tratados da mesma forma por clientes e intermediários, portanto, na verdade, não é diferença concreta que você use.
No entanto, eu esperaria ver 400 atualmente usados mais amplamente e, além disso, os esclarecimentos fornecidos pelas especificações HTTPbis o tornam o mais apropriado dos dois códigos de status:
Por contexto, HTTPbis é uma revisão da especificação HTTP / 1.1 que tenta esclarecer áreas que são pouco claras ou inconsistentes. Quando atingir o status aprovado, substituirá o RFC2616.
fonte
Estudo de caso: API do GitHub
https://developer.github.com/v3/#client-errors
Talvez copiar de APIs conhecidas seja uma boa idéia:
fonte
Não há resposta correta, pois depende de qual é a definição de "sintaxe" para sua solicitação. O mais importante é que você:
Antes que todo mundo pule em cima de mim por dizer que não há resposta certa ou errada aqui, deixe-me explicar um pouco sobre como cheguei à conclusão.
Neste exemplo específico, a pergunta do OP é sobre uma solicitação JSON que contém uma chave diferente do esperado. Agora, o nome da chave recebido é muito semelhante, do ponto de vista da linguagem natural, à chave esperada, mas é estritamente diferente e, portanto, não é (geralmente) reconhecido por uma máquina como equivalente.
Como eu disse acima, o fator decisivo é o que se entende por sintaxe . Se a solicitação foi enviada com um Tipo de Conteúdo de
application/json
, sim, a solicitação é sintaticamente válida porque é uma sintaxe JSON válida, mas não é semanticamente válida, pois não corresponde ao esperado. (assumindo uma definição estrita do que torna a solicitação em questão semanticamente válida ou não).Se, por outro lado, a solicitação foi enviada com um Tipo de Conteúdo personalizado mais específico como
application/vnd.mycorp.mydatatype+json
esse, talvez, especifique exatamente quais campos são esperados, então eu diria que a solicitação pode ser facilmente sintaticamente inválida, daí a resposta 400.No caso em questão, como a chave estava errada, não o valor , ocorreu um erro de sintaxe se houvesse uma especificação para o que são chaves válidas. Se não houvesse especificação para chaves válidas ou o erro estivesse com um valor , seria um erro semântico .
fonte
https://www.keycdn.com/support/422-unprocessable-entity/
fonte
Seu caso:
HTTP 400
é o código de status correto para o seu caso da perspectiva REST, pois é sintaticamente incorreto para enviar emsales_tax
vez detax
, embora seja um JSON válido. Isso normalmente é imposto pela maioria das estruturas do lado do servidor ao mapear o JSON para objetos. No entanto, existem algumas implementações REST que ignoram novaskey
no objeto JSON. Nesse caso, umacontent-type
especificação personalizada para aceitar apenas campos válidos pode ser aplicada pelo lado do servidor.Cenário ideal para 422:
Em um mundo ideal, 422 é preferível e geralmente aceitável para enviar como resposta se o servidor entender o tipo de conteúdo da entidade solicitante e a sintaxe da entidade solicitante estiver correta, mas não puder processar os dados porque são semanticamente errôneos.
Situações de 400 a mais de 422:
Lembre-se, o código de resposta 422 é um código de status HTTP estendido (WebDAV). Ainda existem alguns clientes HTTP / bibliotecas de front-end que não estão preparados para lidar com 422. Para eles, é tão simples quanto "HTTP 422 está errado, porque não é HTTP" . Da perspectiva do serviço, 400 não é muito específico.
Na arquitetura corporativa, os serviços são implantados principalmente em camadas de serviço como SOA, IDM etc. Eles geralmente atendem a vários clientes, desde um cliente nativo muito antigo até os clientes HTTP mais recentes. Se um dos clientes não manipular o HTTP 422, as opções são pedir ao cliente para atualizar ou alterar seu código de resposta para HTTP 400 para todos. Na minha experiência, isso é muito raro atualmente, mas ainda é uma possibilidade. Portanto, sempre é necessário um estudo cuidadoso da sua arquitetura antes de decidir sobre os códigos de resposta HTTP.
Para lidar com situações como essas, as camadas de serviço normalmente usam
versioning
ouconfiguration
sinalizam a configuração para que clientes estritos de conformidade com HTTP enviem 400 e 422 para o restante deles. Dessa forma, eles fornecem suporte de compatibilidade com versões anteriores para os consumidores existentes, mas ao mesmo tempo fornecem a capacidade para os novos clientes consumirem o HTTP 422.A atualização mais recente do RFC7321 diz:
Isso confirma que os servidores podem enviar HTTP 400 por solicitação inválida. 400 não se refere mais apenas a erros de sintaxe ; no entanto, 422 ainda é uma resposta genuína, desde que os clientes possam lidar com isso.
fonte
Em primeiro lugar, esta é uma pergunta muito boa.
400 Solicitação incorreta - Quando uma informação crítica está ausente da solicitação
por exemplo, o cabeçalho da autorização ou o cabeçalho do tipo de conteúdo. O que é absolutamente exigido pelo servidor para entender a solicitação. Isso pode diferir de servidor para servidor.
422 Entidade não processável - quando o corpo da solicitação não pode ser analisado.
Isso é menos grave que 400. A solicitação chegou ao servidor. O servidor reconheceu que a solicitação acertou na estrutura básica. Mas as informações no corpo da solicitação não podem ser analisadas ou entendidas.
por exemplo
Content-Type: application/xml
quando o corpo da solicitação é JSON.Aqui está um artigo que lista os códigos de status e seu uso nas APIs REST. https://metamug.com/article/status-codes-for-rest-api.php
fonte
Você realmente deve retornar "200 OK" e, no corpo da resposta, incluir uma mensagem sobre o que aconteceu com os dados publicados. Cabe ao seu aplicativo entender a mensagem.
O problema é que os códigos de status HTTP são exatamente isso - códigos de status HTTP. E isso deve ter significado apenas na camada de transporte, não na camada de aplicação. A camada do aplicativo realmente nunca deve saber que o HTTP está sendo usado. Se você alternou sua camada de transporte de HTTP para Homing Pigeons, isso não deve afetar sua camada de aplicativo de forma alguma.
Deixe-me dar um exemplo não virtual. Digamos que você se apaixone por uma garota e ela te ama de volta, mas sua família se muda para um país completamente diferente. Ela fornece seu novo endereço de correio tradicional. Naturalmente, você decide enviar-lhe uma carta de amor. Então você escreve sua carta, coloca-a em um envelope, escreve o endereço dela no envelope, coloca um carimbo nele e envia. Agora vamos considerar esses cenários
Resumindo: retornar "200 OK" não significa que o aplicativo do servidor tenha boas notícias para você. Significa apenas que tem algumas novidades.
PS: O código de status 422 tem um significado apenas no contexto do WebDAV. Se você não estiver trabalhando com o WebDAV, 422 terá exatamente o mesmo significado padrão que qualquer outro código não padrão = que não é nenhum.
fonte