web-dev-qa-db-fra.com

Peut-on créer des codes de statut HTTP personnalisés?

J'ai un service REST et WCF) et je veux envoyer un code d'état personnalisé en fonction de l'opération.

Exemple lorsque certaines validations échouent alors je veux envoyer HTTP 444 et quand les autorisations échouent je veux envoyer HTTP 455

La question est de savoir comment le faire valider pour les deux = SOAP et REST services Web.

Sur le client, comment agit le code d'erreur, car lorsque vous envoyez un HTTP 400/500 à partir d'un service WCF (à l'aide de SOAP), une exception est générée sur le client affichant le code d'état.

Maintenant, si j'envoie un nouveau code d'état personnalisé, comment le client gère-t-il cela?

74
Rajesh

Oui, tant que vous respectez la classe - 2xx en cas de succès, 4xx en cas d'erreur du client, etc. Vous pouvez donc renvoyer des codes d'erreur 4XX personnalisés (de préférence ceux qui ne sont pas attribués) pour les conditions d'erreur de votre propre application.

Citation de [RFC 2616] [1]:

"Les codes de statut HTTP sont extensibles. Les applications HTTP ne sont pas obligées de comprendre la signification de tous les codes de statut enregistrés, bien qu'une telle compréhension soit évidemment souhaitable. Cependant, les applications DOIVENT comprendre la classe de tout code de statut, comme indiqué par le premier chiffre, et traiter toute réponse non reconnue comme équivalente au code d'état x00 de cette classe, à l'exception du fait qu'une réponse non reconnue NE DOIT PAS être mise en cache. Par exemple, si un code d'état non reconnu de 431 est reçu par le client, il peut supposer en toute sécurité qu'il existait quelque chose qui ne va pas avec sa demande et traiter la réponse comme si elle avait reçu un code de statut 400 ".

Classe'

  • 1xx: Informational - Demande reçue, processus en cours

  • 2xx: Success - L'action a été reçue, comprise et acceptée avec succès.

  • 3xx: Redirection - Des actions supplémentaires doivent être entreprises afin de compléter la demande.

  • 4xx: Client Error - La requête contient une syntaxe incorrecte ou ne peut pas être remplie.

  • 5xx: Erreur de serveur - Le serveur n'a pas pu répondre à une requête apparemment valide [1]:

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

91
ChrisNY

Je déconseille de créer vos propres codes de statut HTTP, lorsque les codes applicables existent déjà pour les tâches que vous souhaitez effectuer dans votre exemple.

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

Le code de statut 422 [Unprocessable Entity] signifie que le serveur comprend le type de contenu de l'entité de demande (par conséquent, un code de statut 415 [Type de support non supporté] est inapproprié), et la syntaxe de l'entité de demande est correcte (ainsi, une valeur de 400 [Bad Request ] Le code d’état est inapproprié) mais n’a pas pu traiter les instructions contenues. Par exemple, cette condition d'erreur peut se produire si un corps de requête XML contient des instructions XML bien formées (c'est-à-dire syntaxiquement correctes), mais sémantiquement erronées.

On peut soutenir que "impossible à traiter" pourrait être dû à une erreur de validation.

30
Julian Reschke

Oui, vous pouvez ajouter des codes d'erreur personnalisés. Si possible, utilisez des codes existants, et si vous en déclarez de nouveaux, veillez à éviter les collisions.

Vous devez cependant savoir que certains mandataires filtrent les codes inconnus. J'ai eu des problèmes avec les utilisateurs qui se trouvaient derrière des proxys qui mappaient 5XX à 500 et 4XX à 404. Cela a rendu mes appels ajax qui vérifiaient que le code d'état échouait.

17
fmsf

Certaines applications ajoutent leurs codes de réponse personnalisés dans la plage 600-799. Vérifiez par exemple la liste des codes de réponse de KeyNote here

Codes d'erreur définis par 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).

Je n’oserais pas dire si c’est une bonne pratique, mais c’est au moins une référence intéressante.

10
Wilt