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:
- 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.
- 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?
fonte
Respostas:
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.
fonte
Esses códigos seguem o padrão definido pelo HTTP rfc .
De acordo com a seção Definições do código de status :
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.
fonte