Podemos criar códigos de status HTTP personalizados?

94

Tenho um serviço REST e WCF e desejo enviar um código de status personalizado com base na operação.

Por exemplo, quando alguma validação falha, quero enviar HTTP 444 e quando a autorização falha, quero enviar HTTP 455

A questão é como podemos validá-lo para serviços da Web SOAP e REST.

No cliente, como o código de erro atua porque quando você envia um HTTP 400/500 de um serviço WCF (usando SOAP), uma exceção é lançada no cliente mostrando o código de status?

Agora, se eu enviar um novo código de status personalizado, como o cliente lida com isso?

Rajesh
fonte
4
É um serviço que você está expondo para o mundo ou você controla todos os clientes também?
Rup

Respostas:

111

Sim, contanto que você respeite a classe - ou seja, 2xx para sucesso, 4xx para erro do cliente, etc. Portanto, você pode retornar códigos de erro 4XX personalizados (de preferência aqueles que não foram atribuídos) para as condições de erro do seu próprio aplicativo.

Para citar [RFC 2616] [1]:

"Os códigos de status HTTP são extensíveis. Os aplicativos HTTP não precisam entender o significado de todos os códigos de status registrados, embora tal compreensão seja obviamente desejável. No entanto, os aplicativos DEVEM compreender a classe de qualquer código de status, conforme indicado pelo primeiro dígito, e tratar qualquer resposta não reconhecida como equivalente ao código de status x00 dessa classe, com a exceção de que uma resposta não reconhecida NÃO DEVE ser armazenada em cache. Por exemplo, se um código de status não reconhecido de 431 for recebido pelo cliente, ele pode assumir com segurança que houve algo errado com sua solicitação e tratar a resposta como se ela tivesse recebido um código de status 400. "

Classe'

  • 1xx: Informativo - Solicitação recebida, processo contínuo

  • 2xx: Sucesso - A ação foi recebida, compreendida e aceita com sucesso

  • 3xx: Redirecionamento - Outras ações devem ser tomadas para concluir a solicitação

  • 4xx: Erro do cliente - A solicitação contém sintaxe incorreta ou não pode ser cumprida

  • 5xx: Erro do servidor - o servidor falhou em atender a uma solicitação aparentemente válida [1]:

http://tools.ietf.org/html/rfc2616#section-6.1.1

ChrisNY
fonte
2
Não use códigos de status não registrados, exceto para teste.
Julian Reschke
1
ChrisNY: bem, se você depender de códigos de status não registrados ao usar HTTP, pode haver falha se outra pessoa usar o mesmo código para um propósito diferente. Se precisar de informações de erro mais detalhadas, você ainda pode incorporá-lo à carga útil (consulte, por exemplo, tools.ietf.org/html/draft-nottingham-http-problem-06 )
Julian Reschke
22
@ChrisNY: A maioria dos aplicativos da web são projetados para funcionar com um único cliente (seu código javascript / ajax) e um único servidor (seu servidor), portanto, usar um código de status personalizado é totalmente aceitável. Nessas situações, nem mesmo é possível que 'outra pessoa' cause 'quebra' usando o mesmo código de status.
AR
2
Essa citação não está dizendo que você pode criar seus próprios códigos, está dizendo que seu aplicativo não precisa saber o que é todo código registrado, desde que respeite a classe do código e gere um erro para um 4xx etc. Com isso à parte, o único problema que percebi é que, no futuro, um desses códigos será oficialmente atribuído e a funcionalidade do navegador / javascript pode mudar. por exemplo, o ataque 494 DDNS interrompe toda a comunicação, o navegador pode ver isso e impedir que js inicie mais comunicações com aquele ip. Altamente improvável, mas você não pode estar 100%, o Twitter parece pensar que está tudo bem para 420 Enhance Your Calm
Matt
1
A especificação diz que você pode criar seus próprios códigos e usa o código 471 como exemplo. Diz para assumir qualquer erro 4xx não reconhecido como equivalente a 400.
Jeff Lowery
32

Não recomendo a criação de seus próprios códigos de status HTTP, quando já existem códigos aplicáveis para as coisas que você deseja fazer em seu exemplo.

De https://tools.ietf.org/html/rfc4918#section-11.2 :

O código de status 422 [Unprocessable Entity] significa que o servidor entende o tipo de conteúdo da entidade de solicitação (portanto, um código de status 415 [Unsupported Media Type] é inadequado) e a sintaxe da entidade de solicitação está correta (portanto, um 400 [Bad Request ] código de status é inadequado), mas não foi capaz de 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.

Pode-se argumentar que "incapaz de processar" pode ser devido a um erro de validação.

Julian Reschke
fonte
10
A falha de autorização é 401, não 403. 403 é proibido, onde a autorização não resolveria o problema.
Neil Hickman
6
401 é sobre autenticação com falha (apesar do nome).
Julian Reschke
1
401 é "Faça login (novamente)"
CodesInChaos
20

Sim, você pode adicionar códigos de erro personalizados. Se possível, use códigos já existentes e, se estiver declarando novos, tome cuidado para evitar colisões.

Você deve estar ciente de que alguns proxies filtram códigos desconhecidos . Tive problemas com usuários que estavam atrás de proxies que mapeavam 5XX para 500 e 4XX para 404. Isso fez com que minhas chamadas ajax falhassem na verificação do código de status.

fmsf
fonte
sim, proxies são uma merda. Não sei o nome da implementação do proxy, mas ele interpretou um código de status personalizado nosso por conta própria e não enviou a resposta ao cliente.
asgs de
16

Alguns aplicativos adicionam seus códigos de resposta personalizados no intervalo 600-799. Verifique por exemplo a lista de códigos de resposta do KeyNote aqui

Códigos de erro definidos do Keynote (600-799)

600: CONNECTION ERROR - This indicates a general connection error
601: INCOMPLETE ERROR - This indicates sever sends an incomplete page/object (as indicated by Content-Length header)
602: UNEXPECTED CLOSE ERROR - This indicates socket connection has been closed unexpectedly
603: REFUSED ERROR - This indicates a request to connect to the server is refused
604: TIMEOUT ERROR - This indicates there is no activity in socket connection in 3 minutes
605: REDIRECT ERROR - This indicates an error in redirect HTTP header
606: SSL ERROR - This indicates a general error in SSL
607: HEADER ERROR - This indicates a malformed HTTP header
608: EMPTY RESPONSE ERROR - This indicates server doesn't send any response after a request is sent
609: UNKNOWN HOST ERROR - This indicates socket receives an unknown host error from DNS
610: NO ROUTE TO HOST ERROR - This indicates a no route to host error was received while attempting to open a socket
611: SOCKET ERROR - This indicates a general socket error
612: FRAME LOOP ERROR - This indicates a page has a frame loop (frame A includes Frame B that includes Frame A)
613: REDIRECT LOOP ERROR - This indicates a page has a redirect loop (page A redirects to page B that redirects to page A)
614: CONNECTION RESET ERROR - This indicates socket receive a reset signal from the server
615: SOCKET PROTOCOL ERROR - This indicates an error in socket protocol
616: SOCKET BIND ERROR - This indicates an error in binding the socket
617: CONNECTION ERROR - This indicates a general socket connection error
618: CHUNK ERROR - This indicates an error in chunked encoding
619: SSL TIMEOUT - This indicates a timeout during SSL handshake (2 minutes)
620: SSL END OF INPUT - This indicates an end-of-file is received during SSL handshake
621: SSL HANDSHAKE ERROR - This indicates a general error during SSL handshake
622: SSL CERTIFICATE ERROR - This indicates an error in SSL certificate verification
623: SSL AUTHENTICATION ERROR - This indicates an authentication error during SSL handshake
624: SSL BAD MAC ERROR - This indicates a bad MAC during SSL handshake
625: SSL CIPHER ERROR - This indicates a cipher error during SSL handshake
701: ERROR TEXT FOUND - This code is returned if any error text (such as, "Service Unavailable") are found in the main page (frame HTML contents included). Note that the error text must be defined in advance of the test. Error text means if the text is found, this session should be considered a failure.
702: REQUIRED TEXT NOT FOUND - This code is returned If not all required texts are found in the main page. Note that required text must be defined in advance of the test. Required text means if the text is not found, this session should be considered a failure.
703: HTML BODY EMPTY - This code is returned if the HTML body of the page is empty (only if error text or required text has been defined).

Se isso é uma boa prática, não ousaria dizer, mas é pelo menos uma referência interessante.

Wilt
fonte
1
Esses valores são ilegais, pois a especificação HTTP não permite nada fora de 100 ... 599.
Julian Reschke
18
@JulianReschke Eu até mencionei que "não me atrevo a dizer se é uma boa prática". Eu apenas adiciono uma referência ao que outros aplicativos fazem. Votar em minha resposta porque o Keynote usa códigos de status ilegais parece injustificado. Estou apenas alimentando a discussão.
Wilt
-14

Não, você só pode usar o código de requisitos de documentação rfc, consulte os detalhes em RFC1945

Aimeast
fonte
4
Você pode usar qualquer código de status definido em iana.org/assignments/http-status-codes .
Julian Reschke
@Julian, isso significa que Rajesh pode usar os "427-499 Não atribuídos" para seus propósitos?
IrishChieftain
OK, então :-) Você pode usar qualquer código de status atribuído dessa lista. Ou você pode escrever uma especificação para um novo código de status e registrá-lo.
Julian Reschke
5
Você pode, tecnicamente, usar o que quiser para você. Só não espere que funcione bem com mais ninguém. Conforme solicitado no OP - se Rajesh controlar todos os clientes, ele pode fazê-los entender "1337 - Todas as suas bases são nos pertencem" se assim o desejarem. ;)
Cornelius de
1
Você vinculou a códigos de status HTTP / 1.0, que não são usados ​​desde o início dos anos 90.
Andsens