Código de status "Operação inválida" em uma API REST HATEOAS


8

Em uma API do HATEOAS, são retornados links que representam possíveis transições de estado. Um cliente em conformidade deve apenas recuperar e seguir esses links, mas se um cliente não em conformidade estiver construindo URIs em vez de seguir os links fornecidos, qual seria o código / resposta de status mais apropriado a ser retornado?

  • 400 funcionaria, juntamente com algumas informações no corpo da resposta - é isso que estamos fazendo atualmente
  • 403 Acho que estaria errado, pois implica que a solicitação nunca poderia funcionar - mas, potencialmente, o link poderá estar disponível no futuro
  • 404 parece plausível - neste momento, o recurso não existe

O que as pessoas pensam? Eu sei que solicitações condicionais podem manipular solicitações com base em respostas obsoletas (resultando em, por exemplo, 412s), mas essa é uma situação um pouco diferente.

Atualizar:

OK, agora vejo que a resposta correta para esses tipos de operações inválidas seria 404. Que tal onde a sintaxe de uma solicitação está correta, ela está indo para um recurso válido, mas de alguma forma está violando uma regra de negócios. Aqui estão alguns exemplos inventados:

  1. Digamos que o cliente possa fornecer dois números que devem estar dentro de 20% um do outro, mas, caso contrário, pode ser qualquer número.
  2. Digamos que o cliente possa fornecer um número que passa por algum cálculo cujo resultado indica que o número original fornecido estava incorreto.

400 é a resposta correta para estes?


Respostas:


5

Se houver uma chance de que os links existam no futuro, 400 Bad Request e 403 Proibido estariam incorretos: suas seções relevantes na RFC 2616 têm instruções que o cliente NÃO DEVE repetir a solicitação. A diferença entre os dois é que, no caso de 400 solicitações incorretas , o servidor não entendeu o que o cliente estava tentando fazer, enquanto no 403 Proibido o servidor entendeu a solicitação, mas se recusa a atendê-la (sempre).

Se você quiser indicar ao cliente que a solicitação foi entendida, mas não a atenderá no momento da solicitação (mas não fará nenhuma reclamação sobre como manipulá-la no futuro), 404 Não encontrado seria a resposta mais apropriada enviar.

Se você deseja indicar ao cliente que a solicitação foi entendida, mas a solicitação não segue regras ou diretrizes predeterminadas (como o exemplo de um cliente que não fornece dois números dentro de 20% um do outro), você deseja usar o 409 Conflict , que destina-se a indicar ao cliente que a solicitação precisa ser corrigida para ser tratada adequadamente.

Você deve separar a não conformidade de boa fé da não conformidade de má fé. Se você está tentando proteger seu aplicativo de solicitações de um ator ruim, quase certamente eles não se importam com o código de resposta que você envia: eles continuarão construindo URLs até atingirem o que gostam.


OK, acho que isso chega ao cerne da questão. Eu me expandi um pouco para cobrir uma ampla gama de operações inválidas - presumivelmente para esses 400 é a resposta correta?
FinnNk

@FinnNk Não, 400 Solicitação incorreta é apenas quando o servidor não consegue entender o que o cliente estava tentando fazer. Se ele entendeu a solicitação, mas o conteúdo da solicitação é inválido, você deseja responder com 409 Conflitos.

2

Esses códigos seguem o padrão definido pelo HTTP rfc .

De acordo com a seção Definições do código de status :

  • 400 Solicitação incorreta

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.

  • 403 Proibido

O servidor entendeu a solicitação, mas se recusa a atendê-la. A autorização não ajudará e a solicitação NÃO DEVE ser repetida. Se o método de solicitação não foi HEAD e o servidor deseja tornar público o motivo pelo qual a solicitação não foi atendida, DEVE descrever o motivo da recusa na entidade. Se o servidor não desejar disponibilizar essas informações ao cliente, o código de status 404 (Não encontrado) poderá ser usado.

  • 404 não encontrado

O servidor não encontrou nada que corresponda ao Request-URI. Nenhuma indicação é dada sobre se a condição é temporária ou permanente. O código de status 410 (ido) DEVE ser usado se o servidor souber, através de algum mecanismo internamente configurável, que um recurso antigo está permanentemente indisponível e não possui endereço de encaminhamento. Esse código de status é comumente usado quando o servidor não deseja revelar exatamente por que a solicitação foi recusada ou quando nenhuma outra resposta é aplicável.

No seu caso, se o URI construído não levar a lugar algum , acho que seria apropriado retornar 404 .

E se o URI for válido, mas os dados transmitidos (como um json doc) estiverem quebrados , você deverá retornar 400 .

EDIT :

Respondendo ao comentário do OP: Acho que o sistema deve retornar 400 quando a sintaxe e também o significado dos dados estiverem quebrados.


Por quebra, no contexto de uma API REST, você quer dizer apenas sintaxe ou também inclui o significado dos dados? Veja a pergunta expandida para mais detalhes.
FinnNk

Ambos os casos devem retornar 400, na minha humilde opinião.
karlphillip

Aceitei sua resposta, mas você poderia mover seu comentário para o corpo da resposta? Felicidades.
FinnNk

Ao reler o rfc HTTP, a resposta adicional de Mark faz muito sentido, então mudei a resposta aceita. Devo dizer que foi uma combinação de ambas as suas respostas que aprofundou minha compreensão aqui.
FinnNk
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.