Código de resposta REST para dados inválidos

272

Qual código de resposta deve ser passado para o cliente nos seguintes cenários?

  1. Dados inválidos transmitidos durante o registro do usuário, como formato de email errado
  2. O nome de usuário / email já existe

Eu escolhi 403. Eu também achei a seguir que acho que pode ser usado.

Wikipedia:

Falha na pré-condição 412: o servidor não atende a uma das pré-condições que o solicitante colocou na solicitação

Sugira código se devo usar outro que não seja 403.

Amit Patel
fonte
Também estou resolvendo esse problema. O capítulo 7. A validação da especificação JAX-RS (2017) fornece conselhos sobre códigos de status especificamente para violações de restrições. download.oracle.com/otn-pub/jcp/jaxrs-2_1-final-spec/...
burntsugar

Respostas:

298

400 é a melhor escolha nos dois casos. Se você deseja esclarecer melhor o erro, pode alterar a frase de razão ou incluir um corpo para explicar o erro.

412 - A falha na pré-condição é usada para solicitações condicionais ao usar data da última modificação e ETags.

403 - Proibido é usado quando o servidor deseja impedir o acesso a um recurso.

A única outra opção possível é 422 - Entidade não processável.

Darrel Miller
fonte
10
Embora freqüentemente seja usado nesse contexto, 403 não se limita ao controle de acesso, uma vez que rfc2616-10.4.4 diz: "O servidor entendeu a solicitação, mas está se recusando a atendê-la. [...] se o servidor desejar fazer público por que o pedido não foi atendido, DEVE descrever o motivo da recusa na entidade. " O motivo pode ser dados inválidos. No entanto, 422 é mais aplicável aqui.
Yannick Loiseau 25/05
7
Não vamos nos envolver em críticas textuais. Veja, por exemplo, trac.tools.ietf.org/wg/httpbis/trac/ticket/294, que tenta esclarecer que 403 é e sempre foi sobre autorização.
Fumanchu 25/05
2
@fumanchu Boa captura. Um link para uma solicitação de mudança que está a apenas 7 horas de idade :-)
Darrel Miller
1
@fumanchu Significa que 403 deve ser devolvido caso o usuário não tenha permissão para acessar o recurso solicitado. Mas acho que 401 não autorizado é mais apropriado para acessar recursos nos quais o usuário não tem permissão.
Amit Patel
1
401 Não autorizado solicitará que um navegador da Web mostre ao usuário o prompt padrão de nome de usuário / senha HTTP. Se você não estiver usando esse tipo de autenticação para o seu serviço, ou se o usuário já tiver autenticação HTTP, o 401 não será apropriado.
Greg Ball
92

Eu recomendaria 422. Não faz parte das principais especificações HTTP, mas é definido por um padrão público (WebDAV) e deve ser tratado pelos navegadores da mesma forma que qualquer outro código de status 4xx.

De RFC 4918 :

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 é inadequado), 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.

Mike Deck
fonte
20
Observe que o texto citado declara que 422 é aplicável quando a entidade solicitante é sintaticamente bem formada, mas semanticamente errônea. Se a entidade solicitada estiver ilegível, 400 será a resposta apropriada.
precisa
87

Se a solicitação não puder ser analisada corretamente (incluindo a entidade / organismo da solicitação), a resposta apropriada será 400 Solicitação incorreta [ 1 ].

A RFC 4918 declara que 422 Entidade Não Processável é aplicável quando a entidade solicitada é sintaticamente bem formada, mas semanticamente errônea. Portanto, se a entidade solicitada estiver ilegível (como um formato de email incorreto), use 400; mas se simplesmente não fizer sentido (como @example.com) use 422.

Se o problema é que, conforme indicado na pergunta, o nome de usuário / email já existe, você pode usar o 409 Conflict [ 2 ] com uma descrição do conflito e uma dica sobre como corrigi-lo (neste caso, "escolha um nome de usuário / email diferente "). No entanto, na especificação escrita, 403 Proibido [ 3 ] também pode ser usado neste caso, apesar dos argumentos sobre a Autorização HTTP.

412 Falha na pré-condição [ 4 ] é usado quando um cabeçalho de solicitação de pré-condição (por exemplo If-Match) fornecido pelo cliente é avaliado como falso. Ou seja, o cliente solicitou algo e forneceu pré-condições, sabendo muito bem que essas pré-condições podem falhar. 412 nunca deve ser lançado no cliente do nada e não deve estar relacionado à entidade solicitante propriamente dita .

Matty K
fonte
1
Devo observar as RFCs HTTP / 1.1 atualizadas: 400 solicitações incorretas, 409 conflitos, 403 proibidas etc. vivem em tools.ietf.org/html/rfc7231 ; 412 Condição prévia falhada é em tools.ietf.org/html/rfc7232#section-4.2
Matty K
41

É divertido retornar 418 I'm a teapotàs solicitações que são obviamente criadas ou mal-intencionadas e "não podem acontecer", como falha na verificação do CSRF ou falta de propriedades da solicitação.

2.3.2 418 Eu sou um bule de chá

Qualquer tentativa de preparar café com um bule de chá deve resultar no código de erro "418 sou um bule de chá". O órgão da entidade resultante pode ser curto e robusto.

Para mantê-lo razoavelmente sério, restrinja o uso de códigos de erro engraçados aos pontos de extremidade RESTful que não são diretamente expostos ao usuário.

doug65536
fonte
11
Implementá-lo de tal forma que suas declarações de API 418 I'm a teapotpara todas as solicitações provenientes de seu chefe :)
vikarjramun
2
@vikarjramun eu construí um REST fictício e tornei um prudente offline. (pré-lançamento) agora nossos alunos estão pesquisando, tentando criar solicitações de dados válidas, mas é tudo bule. Eu sou o "chefe" - mas está funcionando também.
precisa saber é o seguinte
2
Este RFC é burro. Você pode fazer café em um bule de chá, desde que o derrame através de um coador de chá na xícara. Assim como usar chá de folhas soltas. Você também pode fazer chá em uma cafeteira sem problemas.
gburton
2
@ Burburton Isso requer intervenção de um ser humano, no entanto. Na rede, você definitivamente precisa de um dispositivo capaz de fazer café. Obviamente, um café e um bule de chá não devem responder com um 418.
Jasper