Nasz serwis jest obecnie w 5 miastach. Jeśli ktoś spróbuje wywołać interfejs API naszej usługi z dowolnego innego miasta, chcemy zgłosić ten błąd Service not available in your area
.
Pytanie brzmi: jaki byłby odpowiedni kod http dla tego błędu?
- 503 Usługa niedostępna
- 403: zabronione
albo coś innego?
api
api-design
http
Shaharyar
źródło
źródło
Odpowiedzi:
Każdy kod błędu HTTP byłby nieodpowiedni. Z punktu widzenia HTTP nie ma żadnych błędów ani problemów, więc powinno to być coś z zakresu 200. Grzecznie informujesz niektórych użytkowników, że nie będą oni obsługiwani, wysyłając z powrotem dokument, który im to mówi. I wszystko idzie dobrze.
Użytkownik nie będzie mógł korzystać z Twojej aplikacji . To świadoma decyzja podejmowana przez logikę biznesową, a nie nieszczęście. Na poziomie HTTP wszystko jest uczciwe.
Edytować
Wygląda na to, że patrzymy tutaj na starcie starej szkoły z nową szkołą. Gdy zaprojektowano HTTP, nie było usług internetowych, nie było SOAP, JSON ani zasad REST. Jako protokół powyżej TCP był to już rozważany (zbliżony do) poziom aplikacji i zdefiniowano wiele kodów statusu wysokiego poziomu. Kiedy sieć zaczęła być wykorzystywana do bogatszych, usług wysokiego poziomu i wspólnych środków transportu „kopert”, projektanci podchwycili HTTP zamiast definiować nowszy i czystszy protokół, tylko dlatego, że HTTP był wszechobecny.
Tak więc w kontekście nowoczesnych usług internetowych HTTP jest w rzeczywistości niewiele więcej niż głupią warstwą transportową, a większość jego kodów można uznać za nieobowiązujące lub przestarzałe. Po prostu wybranie jednego, ponieważ zbliża się do stanu Twojej aplikacji i zdarza się, że znajduje się na tej liście, co kiedyś oznaczało, że coś może wydawać się nieszkodliwe, ale myślę, że wysłałoby to niewłaściwy komunikat. Nie chcesz, aby HTTP pełnił tę regulującą rolę w kontekście usług sieciowych.
źródło
5xx
błędy to błędy serwera - coś poszło nie tak na serwerze. W szczególności 503 wskazuje, że:4xx
błędy są błędami klienta - klient wysyła żądanie, którego serwer nie jest w stanie lub nie chce spełnić. W szczególności wskazuje to 403Twierdziłbym, że
503
jest to wyraźnie niepoprawne, ponieważ nie jest to tymczasowy problem - nie obsługujesz wniosków w tym obszarze, kropka. Można argumentować, że ostatecznie masz nadzieję na obsługę tego obszaru, ale celem kodu jest dołączenie nagłówka wskazującego, kiedy klient może spróbować ponownie. „Za 6 miesięcy” nie spełnia tego założenia.403
jest lepszym wyborem, ponieważ Twoja usługa po prostu zabrania żądań z niektórych lokalizacji.źródło
Żaden z nich.
Jeśli interfejs API jest dobrze zaprojektowany, adres URL zawiera nazwę miasta, np
lub
ponieważ geolokalizacja IP jest niewiarygodna, Twoi użytkownicy mogą korzystać z VPN, Twoi użytkownicy mogą chcieć wezwać kogoś innego, itp. Sugerowanie miasta na podstawie lokalizacji użytkownika jest obowiązkiem klienta API . Zwykle klient ma i tak znacznie lepsze zasoby do określania lokalizacji użytkownika (na przykład usługa lokalizacji urządzenia mobilnego).
Gdy to zrobisz, poprawna odpowiedź na
lub
staje się oczywiste: 404 nie znaleziono : Nie istnieje żaden zasób na wezwanie do przejażdżki w SomeUnsupportedCity.
źródło
To wydaje się pytaniem o okrągłym otworze / kołku. Dlaczego jedyną odpowiedzią jest kod HTTP? Kody błędów HTTP nie mogą obejmować wszystkich przypadków użycia.
Wszystkie twoje wywołania API powinny mieć dodatkowe komunikaty, które powracają - tj. Mały komunikat o błędzie JSON. Daj im 403 (bo naprawdę nie mają pozwolenia na używanie interfejsu API ze względu na lokalizację) i zwróć dodatkowy kawałek informacji, jak sugerujesz.
Jeśli tego nie zrobisz, następnym razem zapytasz, jaki kod błędu HTTP należy zwrócić, gdy użytkownik poprosił o SUV, ale dostępny jest tylko Prius.
źródło
Kilka ma sens.
403 Zabronione, z powodów, o których wspomina Eric Stein w swojej odpowiedzi . Możesz użyć różnych informacji podanych w żądaniu, aby ustalić, gdzie jest klient i kim jest klient, i na podstawie tego żądania serwer nie może lub nie chce odpowiedzieć.
Podałbym jednak również 451 Niedostępny z powodów prawnych jako możliwy status zwrotu w niektórych przypadkach. Ten status wymaga włączenia (w nagłówkach) linku do odpowiednich przepisów. Dotyczy to w szczególności przypadków, w których klient nie ma dostępu do zasobów, a nie ma bardziej ogólnego przypadku klienta w nieobsługiwanym regionie lub obszarze.
Unikałbym serii statusów 5xx - często wskazują one na problemy techniczne po stronie serwera. Wydaje się, że tak nie jest.
źródło
Jeśli ograniczenie wynika z przyczyn prawnych, wówczas odpowiedni kod błędu HTTP to HTTP 451 „Niedostępny z powodów prawnych”.
Jest to zwykle stosowane w przypadku materiałów, które zostały odwołane z powodu działań DMCA lub procesów sądowych z powodu kampanii nękających itp., Ale duch i litera definicji odpowiedzi brzmią :
Sam kod jest odniesieniem do Fahrenheita 451 autorstwa Ray Bradbury.
źródło
Ludzie często zapominają, że kody stanu HTTP są rozszerzalne.
https://tools.ietf.org/html/rfc2616#section-6.1.1
Zawsze możesz po prostu stworzyć swój własny kod statusu z zakresu 400 do użytku przez interfejs API i aplikację kliencką.
źródło
Expect token;city="Albequerque"
nagłówek. Wtedy najbardziej odpowiednią odpowiedzią byłoby 417, oczekiwanie nie powiodło się. tools.ietf.org/html/rfc2616#section-10.4.18 Zakładając oczywiście, że jest to usługa internetowa.Na początku myślałem, że 503, ponieważ opis „usługa niedostępna” wydaje się być zgodny z problemem, ale patrząc na definicje , 503 jest naprawdę specyficzne dla niedostępności serwera. Następnie myśląc więcej, mówisz klientowi, że istnieje problem z żądaniem, a nie, że występuje problem po stronie serwera.
403 jest bliżej, ponieważ mówisz użytkownikowi, że otrzymałeś wiadomość i rozumiesz ją, ale serwer nie chce jej spełnić. Może to być mylące, dlatego można dodać objaśnienie tekstowe opisujące scenariusz. Zgodnie z RFC 404 jest również ważnym substytutem tego kodu.
O ile ktoś nie wymyślił nowego kodu do tego, 403 lub 404 wydają się być najbliższe.
źródło
Powinieneś dopasować opis błędu do kodu, który podajesz:
jeśli to powiesz
Service not available in your area.
, powinieneś dać,404
ponieważ twierdzisz, że usługa nie jest dostępna .jeśli to powiesz
You are not authorized for this service in your area.
, powinieneś dać,403
ponieważ twierdzisz, że dzwoniący nie jest autoryzowany .Poszedłbym na drugi.
źródło
Dostępny jest obecnie Internet-Draft (który wygasa 31 grudnia 2018 r.), Który proponuje poprawki do HTTP 451 Niedostępne z powodów prawnych . Projekt sugeruje, że odpowiedź 451 powinna zawierać
geo-scope-block
nagłówek, który powinien „odpowiadać rozdzielonej przecinkami liście kodów krajów alfa-2 zdefiniowanych w [ISO.3166-1]”. Jednak projekt określa również, że kod 451 nie powinien być używany „przez operatora, aby odmówić dostępu do zasobu na podstawie polityki określonej przez operatora (w przeciwieństwie do żądania prawnego złożonego operatorowi”).Zakładając, że nie masz legalnego zapotrzebowania na geoblok, 451 nie jest prawidłowym kodem. Jaki jest zatem poprawny kod? Cóż, wiele innych odpowiedzi sugerowało już 403 Zabronione , ale wszystkie wydają się być oparte na opiniach, więc zobaczmy, co robią inni:
Tak więc nie ma jednego uniwersalnego rozwiązania, wystarczy wybrać takie, które najlepiej pasuje do Twojej sytuacji. Ale cokolwiek wybierzesz, wyjaśnij rzeczywisty problem w treści odpowiedzi .
Powiedziałbym, że nie byłoby nic złego w określeniu niestandardowego kodu stanu HTTP, na przykład Rubberduck już odpowiedział . Niestandardowy kod stanu z zakresu 400 może nawet być całkiem dobrym wywołaniem, ponieważ na pewno zwróci uwagę programistów, jeśli zobaczą coś w rodzaju „HTTP status 499”. „403” jest zbyt łatwe do przekazania jako „ OK, więc pomyliłem hasło, spróbujmy czegoś innego ”, a to prowadzi do zmarnowanych godzin.
źródło