Unser Service ist derzeit in 5 Städten verfügbar. Wenn jemand versucht, unsere Service-API aus einer anderen Stadt aufzurufen, möchten wir diesen Fehler auslösen Service not available in your area
.
Die Frage ist, was ist der passende http-Code für diesen Fehler?
- 503 Dienst nicht verfügbar
- 403 Verboten
oder etwas anderes?
api
api-design
http
Shaharyar
quelle
quelle
Antworten:
Jeder HTTP-Fehlercode wäre unangemessen. Aus HTTP-Sicht gibt es keinerlei Fehler oder Probleme, daher sollte es sich um einen Wert im Bereich von 200 handeln. Sie informieren einige Ihrer Benutzer höflich darüber, dass sie nicht bedient werden, indem Sie ein Dokument zurücksenden, das sie darüber informiert. Und das geht alles gut.
Der Benutzer kann Ihre Anwendung nicht verwenden . Das ist eine bewusste Entscheidung, die von Ihrer Geschäftslogik getroffen wurde, kein Missgeschick. Auf der HTTP-Ebene ist alles Honky Dory.
Bearbeiten
Es sieht so aus, als ob wir hier einen Konflikt zwischen alter und neuer Schule sehen. Bei der Entwicklung von HTTP gab es keine Webdienste, kein SOAP, kein JSON und keine REST-Prinzipien. Als Protokoll über TCP wurde dies bereits als (nahe) Anwendungsebene angesehen und viele übergeordnete Statuscodes wurden definiert. Als das Web für umfassendere Dienste auf hoher Ebene genutzt wurde und ein gemeinsames Mittel zum Transportieren von "Umschlägen" erforderlich war, nutzten die Designer HTTP, anstatt ein neueres und saubereres Protokoll zu definieren, nur weil HTTP allgegenwärtig war.
In einem modernen Webservice-Kontext ist HTTP in der Tat kaum mehr als eine blöde Transportschicht, und die meisten seiner Codes gelten möglicherweise als nicht anwendbar oder veraltet. Wählen Sie einfach eine aus, da sie Ihrem Anwendungsstatus sehr nahe kommt und sich zufällig in dieser Liste befindet, die früher bedeutete, dass etwas harmlos erscheinen könnte, aber ich denke, es würde eine falsche Nachricht senden. Sie möchten nicht, dass HTTP diese regulierende Rolle in einem Webdienstkontext spielt.
quelle
5xx
Fehler sind Serverfehler - auf dem Server ist ein Fehler aufgetreten. Insbesondere zeigt ein 503 an, dass:4xx
Fehler sind Clientfehler - Der Client sendet eine Anforderung, die der Server nicht erfüllen kann oder will. Insbesondere ein 403 zeigt das anIch würde behaupten, dass dies
503
eindeutig falsch ist, da es sich nicht um ein vorübergehendes Problem handelt. Sie unterstützen Anfragen in diesem Bereich (Zeitraum) nicht. Es könnte argumentiert werden, dass Sie möglicherweise hoffen, den Bereich zu unterstützen, der Code soll jedoch einen Header enthalten, der angibt, wann der Client es erneut versuchen kann. "In 6 Monaten" hält sich nicht an die Absicht.403
ist eine bessere Wahl, da Ihr Dienst nur Anfragen von bestimmten Gebietsschemas verbietet.quelle
Weder von denen.
Wenn Ihre API gut gestaltet ist, enthält die URL den Namen der Stadt, z
oder
Da die IP-Geolokalisierung unzuverlässig ist, verwenden Ihre Benutzer möglicherweise VPNs, möchten Ihre Benutzer möglicherweise eine Mitfahrgelegenheit für eine andere Person gratulieren usw. Es liegt in der Verantwortung des API-Clients , eine Stadt basierend auf dem Standort des Benutzers vorzuschlagen . Normalerweise verfügt der Client ohnehin über viel bessere Ressourcen zum Bestimmen des Standorts des Benutzers (z. B. den Standortdienst eines Mobilgeräts).
Sobald Sie das getan haben, die richtige Antwort auf
oder
wird offensichtlich: 404 Not Found : Es ist keine Ressource vorhanden, um eine Fahrt bei SomeUnsupportedCity anzukündigen.
quelle
Dies scheint eine runde Loch / quadratische Pflock-Frage zu sein. Warum muss Ihre einzige Antwort ein HTTP-Code sein? HTTP-Fehlercodes können möglicherweise nicht alle Anwendungsfälle abdecken.
Alle Ihre API-Aufrufe sollten zusätzliche Nachrichten enthalten, die zurückkommen - dh eine kleine JSON-Fehlermeldung. Geben Sie ihnen eine 403 (weil sie in Anbetracht des Speicherorts nicht die Berechtigung haben, die API zu verwenden) und geben Sie eine zusätzliche Information zurück, wie Sie vorschlagen.
Wenn Sie dies nicht tun, werden Sie beim nächsten Mal gefragt, welcher HTTP-Fehlercode zurückgegeben werden soll, wenn der Benutzer nach einem SUV gefragt hat, aber nur ein Prius verfügbar ist.
quelle
Ein paar machen Sinn.
403 Verboten aus den Gründen, die Eric Stein in seiner Antwort erwähnt . Sie können verschiedene Informationen verwenden, die von der Anforderung bereitgestellt werden, um zu bestimmen, wo sich der Client befindet und wer der Client ist. Auf der Grundlage dieser Anforderung kann oder will der Server keine Antwort geben.
Ich würde jedoch auch 451 Aus rechtlichen Gründen nicht verfügbar als möglichen Rückgabestatus für einige Fälle anführen. Dieser Status setzt voraus, dass Sie (in den Überschriften) einen Link zu den einschlägigen Rechtsvorschriften einfügen. Dies gilt insbesondere für Fälle, in denen es für den Kunden nicht legal ist, auf Ihre Ressourcen zuzugreifen, und in denen in einer nicht unterstützten Region oder Region kein allgemeinerer Fall für den Kunden vorliegt.
Ich würde die 5xx-Reihe von Status vermeiden - diese weisen häufig auf serverseitige technische Probleme hin. Dies scheint hier nicht der Fall zu sein.
quelle
Wenn die Einschränkung aus rechtlichen Gründen besteht, lautet der entsprechende HTTP-Fehlercode HTTP 451 (aus rechtlichen Gründen nicht verfügbar).
Dies wird in der Regel für Material verwendet, das aufgrund von DMCA-Maßnahmen oder Klagen aufgrund von Belästigungskampagnen oder Ähnlichem widerrufen wurde. Der Sinn und der Buchstabe der Antwortdefinition lauten jedoch :
Der Code selbst ist ein Verweis auf Fahrenheit 451 von Ray Bradbury.
quelle
Die Leute vergessen oft, dass HTTP-Statuscodes erweiterbar sind.
https://tools.ietf.org/html/rfc2616#section-6.1.1
Sie können jederzeit einen eigenen Statuscode im Bereich 400 erstellen, der von Ihrer API und Client-Anwendung verwendet wird.
quelle
Expect token;city="Albequerque"
Header enthält. Dann wäre die geeignetste Antwort 417, Erwartung gescheitert. tools.ietf.org/html/rfc2616#section-10.4.18 Vorausgesetzt natürlich, dass dies für einen Webdienst ist.Zuerst dachte ich, 503, weil die Beschreibung "Dienst nicht verfügbar" mit dem Problem in Einklang zu stehen scheint, aber in Bezug auf die Definitionen ist 503 wirklich spezifisch für die Nichtverfügbarkeit von Servern. Wenn Sie mehr darüber nachdenken, teilen Sie dem Client mit, dass ein Problem mit der Anforderung vorliegt und nicht, dass ein serverseitiges Problem vorliegt.
403 ist näher, weil Sie dem Benutzer mitteilen, dass Sie die Nachricht erhalten und verstanden haben, der Server jedoch nicht bereit ist, sie zu befriedigen. Dies kann verwirrend sein, so dass eine Texterklärung hinzugefügt werden kann, um das Szenario zu beschreiben. Gemäß RFC ist 404 auch ein gültiger Ersatz für diesen Code.
403 oder 404 scheinen die nächsten zu sein, es sei denn, jemand hat sich einen neuen Code dafür ausgedacht.
quelle
Sie sollten die Beschreibung des Fehlers mit dem von Ihnen angegebenen Code abgleichen:
wenn du sagst
Service not available in your area.
dann solltest du ein geben404
weil du behauptest das der service nicht verfügbar ist .wenn du das sagst
You are not authorized for this service in your area.
dann solltest du a geben403
weil du behauptest das der anrufer nicht autorisiert ist .Ich würde für die Sekunde gehen.
quelle
Es gibt einen aktuellen Internet-Entwurf (der am 31. Dezember 2018 abläuft), der Änderungen des Status " HTTP 451 aus rechtlichen Gründen nicht verfügbar" vorschlägt . Der Entwurf schlägt vor, dass eine 451-Antwort einen
geo-scope-block
Header enthalten sollte, der "der durch Kommas getrennten Liste der in [ISO.3166-1] definierten Alpha-2-Ländercodes entspricht". Im Entwurf ist jedoch auch festgelegt, dass der Code 451 nicht verwendet werden sollte, "um einem Betreiber den Zugriff auf eine Ressource auf der Grundlage einer vom Betreiber festgelegten Richtlinie zu verweigern (im Gegensatz zu einer gesetzlichen Anforderung an den Betreiber)".Vorausgesetzt, Sie haben keine rechtliche Anforderung für den Geoblock, ist 451 nicht der richtige Code. Was ist dann der richtige Code? Nun, zahlreiche andere Antworten haben bereits 403 Forbidden vorgeschlagen , aber sie scheinen alle "meinungsbasiert" zu sein. Schauen wir uns also an, was andere tun:
Es gibt also keine universelle Lösung. Sie müssen nur eine auswählen, die Ihrer Situation am besten entspricht. Aber je nachdem, was Sie wählen, müssen Sie das eigentliche Problem im Antworttext erklären .
Ich würde sagen, es wäre nichts Falsches, nur einen benutzerdefinierten HTTP-Statuscode anzugeben, wie RubberDuck bereits geantwortet hat . Ein benutzerdefinierter Statuscode im 400er-Bereich könnte sogar ein ziemlich guter Anruf sein, da dies definitiv die Aufmerksamkeit der Entwickler auf sich zieht, wenn sie so etwas wie "HTTP-Status 499" sehen. Ein "403" ist zu einfach als " OK, also habe ich mein Passwort falsch eingegeben, lasst uns stattdessen etwas anderes versuchen " zu übergeben, und das führt zu verschwendeten Stunden.
quelle