Können wir benutzerdefinierte HTTP-Statuscodes erstellen?

90

Ich habe einen REST- und WCF-Dienst und möchte einen benutzerdefinierten Statuscode basierend auf der Operation senden.

Beispiel: Wenn eine Validierung fehlschlägt, möchte ich HTTP 444 senden, und wenn die Autorisierung fehlschlägt, möchte ich HTTP 455 senden

Die Frage ist, wie wir es für SOAP- und REST-Webdienste validieren lassen.

Wie verhält sich der Fehlercode auf dem Client, denn wenn Sie einen HTTP 400/500 von einem WCF-Dienst (mithilfe von SOAP) senden, wird auf dem Client eine Ausnahme ausgelöst, die den Statuscode anzeigt.

Wenn ich nun einen neuen benutzerdefinierten Statuscode sende, wie geht der Client damit um?

Rajesh
quelle
3
Ist dies ein Service, den Sie der Welt aussetzen, oder kontrollieren Sie auch alle Kunden?
Rup

Antworten:

107

Ja, solange Sie die Klasse respektieren - dh 2xx für den Erfolg, 4xx für den Clientfehler usw. Sie können also benutzerdefinierte 4XX-Fehlercodes (vorzugsweise solche, die nicht zugewiesen sind) für die Fehlerbedingungen Ihrer eigenen Anwendung zurückgeben.

Um aus [RFC 2616] [1] zu zitieren:

"HTTP-Statuscodes sind erweiterbar. HTTP-Anwendungen müssen nicht die Bedeutung aller registrierten Statuscodes verstehen, obwohl ein solches Verständnis offensichtlich wünschenswert ist. Anwendungen MÜSSEN jedoch die Klasse eines Statuscodes verstehen, wie durch die erste Ziffer angegeben, und behandeln Jede nicht erkannte Antwort entspricht dem x00-Statuscode dieser Klasse, mit der Ausnahme, dass eine nicht erkannte Antwort NICHT zwischengespeichert werden darf. Wenn der Client beispielsweise einen nicht erkannten Statuscode von 431 empfängt, kann er davon ausgehen, dass dies der Fall ist etwas stimmt nicht mit seiner Anfrage überein und behandelt die Antwort so, als hätte sie einen 400-Statuscode erhalten. "

Klasse'

  • 1xx: Information - Anfrage erhalten, Prozess wird fortgesetzt

  • 2xx: Erfolg - Die Aktion wurde erfolgreich empfangen, verstanden und akzeptiert

  • 3xx: Umleitung - Es müssen weitere Maßnahmen ergriffen werden, um die Anforderung abzuschließen

  • 4xx: Client-Fehler - Die Anforderung enthält eine falsche Syntax oder kann nicht erfüllt werden

  • 5xx: Serverfehler - Der Server konnte eine scheinbar gültige Anforderung nicht erfüllen [1]:

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

ChrisNY
quelle
2
Verwenden Sie keine nicht registrierten Statuscodes, außer zum Testen.
Julian Reschke
1
ChrisNY: Nun, wenn Sie sich bei der Verwendung von HTTP auf nicht registrierte Statuscodes verlassen, kann es zu einem Bruch kommen, wenn jemand anderes denselben Code für einen anderen Zweck verwendet. Wenn Sie detailliertere Fehlerinformationen benötigen, können Sie diese dennoch in die Nutzdaten einbetten (siehe z. B. tools.ietf.org/html/draft-nottingham-http-problem-06 )
Julian Reschke
19
@ChrisNY: Die meisten Webanwendungen funktionieren mit einem einzelnen Client (Ihrem Javascript / Ajax-Code) und einem einzelnen Server (Ihrem Server). Die Verwendung eines benutzerdefinierten Statuscodes ist daher völlig in Ordnung. In diesen Situationen ist es nicht einmal möglich, dass "jemand anderes" mit demselben Statuscode einen "Bruch" verursacht.
AR
2
Dieses Zitat besagt nicht, dass Sie Ihre eigenen Codes erstellen können, sondern dass Ihre App nicht wissen muss, was jeder registrierte Code ist, solange sie die Codeklasse respektiert und einen Fehler für einen 4xx usw. auslöst. Das einzige Problem, das ich sehen konnte, ist, dass in Zukunft einer dieser Codes offiziell zugewiesen wird und sich die Browser- / Javascript-Funktionalität möglicherweise ändert. Beispiel: 494 DDNS-Angriffe stoppen die gesamte Kommunikation. Der Browser erkennt dies möglicherweise und verhindert, dass js weitere Kommunikationen zu dieser IP-Adresse initiiert. Sehr unwahrscheinlich, aber Sie können nicht 100% sein, Twitter scheint zu denken, dass es in Ordnung ist, 420 Enhance Your Calm
Matt
1
Die Spezifikation besagt, dass Sie Ihre eigenen Codes erstellen können, und verwendet den Code 471 als Beispiel. Es heißt, dass jeder nicht erkannte 4xx-Fehler 400 entspricht.
Jeff Lowery
32

Ich empfehle , keine eigenen HTTP-Statuscodes zu erstellen, wenn für die Dinge, die Sie in Ihrem Beispiel tun möchten, bereits zutreffende Codes vorhanden sind .

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

Der Statuscode 422 [Nicht verarbeitbare Entität] bedeutet, dass der Server den Inhaltstyp der Anforderungsentität versteht (daher ist ein 415-Statuscode [Nicht unterstützter Medientyp] unangemessen) und die Syntax der Anforderungsentität korrekt ist (daher 400 [Bad Request) ] Statuscode ist unangemessen) konnte die enthaltenen Anweisungen jedoch nicht verarbeiten. Diese Fehlerbedingung kann beispielsweise auftreten, wenn ein XML-Anforderungshauptteil wohlgeformte (dh syntaktisch korrekte), aber semantisch fehlerhafte XML-Anweisungen enthält.

Es kann argumentiert werden, dass "nicht verarbeitbar" auf einen Validierungsfehler zurückzuführen sein könnte.

Julian Reschke
quelle
10
Der Autorisierungsfehler ist 401, nicht 403. 403 ist verboten, wenn die Autorisierung das Problem nicht beheben würde.
Neil Hickman
6
401 handelt von fehlgeschlagener Authentifizierung (trotz des Namens).
Julian Reschke
1
401 ist "Bitte
melden
19

Ja, Sie können benutzerdefinierte Fehlercodes hinzufügen. Verwenden Sie nach Möglichkeit bereits vorhandene Codes, und vermeiden Sie Kollisionen, wenn Sie neue deklarieren.

Sie sollten sich jedoch bewusst sein, dass einige Proxys unbekannte Codes filtern . Ich hatte Probleme mit Benutzern, die hinter Proxys standen, die 5XX bis 500 und 4XX bis 404 zugeordnet haben. Dies führte dazu, dass meine Ajax-Aufrufe das Überprüfen des Statuscodes fehlschlugen.

fmsf
quelle
Ja, Proxies saugen. Ich kenne den Namen der Proxy-Implementierung nicht, aber er hat einen benutzerdefinierten Statuscode von uns selbst interpretiert und die Antwort nicht an den Client gesendet.
Asgs
15

Einige Anwendungen fügen ihre benutzerdefinierten Antwortcodes im Bereich von 600 bis 799 hinzu. Überprüfen Sie hier beispielsweise die Antwortcodeliste von KeyNote

Definierte Keynote-Fehlercodes (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).

Ob dies eine gute Praxis ist, würde ich nicht sagen, aber es ist zumindest eine interessante Referenz.

Verwelken
quelle
1
Diese Werte sind insofern unzulässig, als die HTTP-Spezifikation nichts außerhalb von 100 ... 599 zulässt.
Julian Reschke
15
@ JulianReschke Ich erwähnte sogar, dass ich "nicht wage zu sagen, ob es eine gute Praxis ist". Ich füge lediglich einen Verweis darauf hinzu, was andere Anwendungen tun. Die Ablehnung meiner Antwort, da Keynote illegale Statuscodes verwendet, scheint ungerechtfertigt. Ich füttere nur die Diskussion.
Wilt
-12

Nein, Sie können nur den RFC-Dokumentationsanforderungscode verwenden, siehe Details in RFC1945

Aimeast
quelle
4
Sie können einen beliebigen Statuscode verwenden, der in iana.org/assignments/http-status-codes definiert ist .
Julian Reschke
@Julian, bedeutet das, dass Rajesh die "427-499 Unassigned" für seine Zwecke verwenden kann?
IrishChieftain
OK dann :-) Sie können jeden zugewiesenen Statuscode aus dieser Liste verwenden. Oder Sie schreiben eine Spezifikation für einen neuen Statuscode und lassen ihn registrieren.
Julian Reschke
5
Sie können technisch alles verwenden, was Sie möchten. Erwarten Sie nur nicht, dass es mit anderen gut spielt. Wie im OP gefragt - wenn Rajesh alle Kunden kontrolliert, kann er sie verstehen lassen "1337 - Alle Ihre Basis gehört uns", wenn es ihnen gefällt. ;)
Cornelius
1
Sie haben eine Verknüpfung zu HTTP / 1.0-Statuscodes hergestellt, die seit Anfang der 90er Jahre nicht mehr verwendet wurden.
andsens