Códigos de status REST HTTP para validação falhada ou duplicata inválida

I'm construindo uma aplicação com uma API baseada em REST e chegaram ao ponto onde i'm especificando códigos de status para cada requisição.

Que código de status devo enviar para pedidos que falham na validação ou onde um pedido está tentando adicionar uma duplicata em minha base de dados?

I'olhei através de http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html mas nenhum deles parece estar certo.

Existe uma prática comum ao enviar códigos de status?

Solução

Para falha na validação de entrada: 400 Bad Request + a sua descrição opcional. Isto é sugerido no livro "RESTful Web Services". Para dupla submissão: 409 Conflito


**Atualização Junho 2014***

A especificação relevante costumava ser RFC2616, o que deu o uso de 400 (Bad Request) de forma bastante restrita como

O pedido não pôde ser compreendido pelo servidor devido à sintaxe malformada

Por isso poderia ter sido argumentado que era inadequado para erros semânticos. Mas não mais; desde junho de 2014 o padrão relevante RFC 7231, que substitui o anterior RFC2616, dá o uso de 400 (Bad Request) de forma mais ampla como

o servidor não pode ou não irá processar o pedido devido a algo que é percebido como sendo um erro do cliente

Comentários (11)
  • Falha na validação: 403 Proibida ("O servidor compreendeu o pedido, mas recusa-se a cumpri-lo"). Ao contrário da opinião popular, o RFC2616 não diz "403 destina-se apenas à autenticação falhada", mas "403: Eu sei o que você quer, mas não vou fazer isso". Essa condição pode ou não ser devida à autenticação.
  • Tentando adicionar um duplicado: 409 Conflito ("O pedido não pôde ser completado devido a um conflito com o estado actual do recurso.")

Você deve definitivamente dar uma explicação mais detalhada nos cabeçalhos de resposta e/ou corpo (por exemplo, com um cabeçalho personalizado - X-Status-Reason: Validation failed).

Comentários (19)

Eu recomendo código de status 422, "Entidade não processável".

11.2. 422 Entidade não processável

O código de status 422 (Unprocessable Entity) significa que o servidor entende o tipo de conteúdo da entidade requisitante (portanto um código de status 415 (Unsupported Media Type) é inadequado), e a sintaxe da entidade requisitante é correta (portanto um código de status 400 (Bad Request) é inadequado), mas não foi capaz de processar as instruções contidas. Por exemplo, esta condição de erro pode ocorrer se um corpo de requisição XML contém instruções XML bem formadas (ou seja, sintaticamente corretas), mas semanticamente errôneas.

Comentários (14)