Rozwijam RESTful API, w którym http://server/thingyapi/thingyblob/1234
zwraca plik (aka „blob”) powiązany z thingy # 1234 do pobrania. Może się jednak zdarzyć, że żądanie zostało wysłane w momencie, gdy plik nie istnieje na serwerze, ale z pewnością będzie dostępny w późniejszym czasie. Na serwerze jest proces wsadowy, który generuje wszystkie obiekty blob dla wszystkich rzeczy. Thingy 1234 już istnieje, a jego dane, inne niż blob, są już dostępne. Serwer nie musi jeszcze generować dziwnego bloba 1234.
Nie chcę zwracać 404; to dla rzeczy, które nie istnieją. To coś, co istnieje, ale jego obiekt blob nie został jeszcze wygenerowany. Coś jak film w YouTube, który jest „przetwarzany”. Nie sądzę, aby kody przekierowań były właściwe; nie ma „innego” adresu URL do wypróbowania.
Jaki jest prawidłowy kod stanu HTTP do zwrócenia w takim przypadku?
204
„Brak treści”? Is wskazuje, że serwer pomyślnie przetworzył żądanie i nie zwraca żadnej treści [w tej chwili].Odpowiedzi:
Proponuję
202 - Accepted
. Z dokumentacji :źródło
Taki „problem” występuje po stronie serwera: klient wysłał dobrze sformułowane żądanie, ale serwer nie może go spełnić. Więc jestem skłonny do "Błąd serwera", kod statusu 5xx.
Quoth RFC 7231 (aktualny standard HTTP, podkreślenie dodane):
Uwaga
Z dostępnych kodów najlepiej pasowałbym , że 503 „Usługa niedostępna” :
Uwaga:
Retry-After
wartość. Możesz podać jako wartość szacowany czas zakończenia następnego wykonania procesu wsadowego lub interwał wykonania procesu wsadowego.Zdefiniowanie własnego kodu statusu 5xx (na przykład 591), chociaż dozwolone , miałoby niewłaściwą semantykę:
Klienci traktowaliby Twój własny kod statusu jako 500, „wewnętrzny błąd serwera” , co nie byłoby właściwe.
źródło
307 - TEMPORARY REDIRECT
co jest dobre, jeśli chcesz zmusić stronę klienta do czekania w innym miejscu, podczas gdy zasoby są „gotowe”Myślę, że 423 - Locked można wykorzystać do tego celu:
źródło
Adres URL nie odpowiada prośbie o coś.
http://server/thingyapi/thingyblob/1234
Klient prosi o coś, co nie istnieje. Gdyby istniał, oddałbyś go im.
404.
źródło
503
jest to odpowiednia odpowiedź. Nie wspominając o innych dziwnych sugestiach.Inna opcja:
503 - Service Unavailable
.źródło
Ponieważ Twój zasób nie jest gotowy, prawdopodobnie wiesz, kiedy (w przybliżeniu) będzie dostępny i kiedy klient może ponowić żądanie. Oznacza to, że możesz chcieć użyć nagłówka Retry-After . Ten nagłówek jest prawidłowy z kodem 503 (Usługa niedostępna), co oznacza, że cała witryna jest niedostępna z powodu konserwacji i odpowiedzi 3xx (przekierowanie).
Moim zdaniem 302 (Znaleziono) z nagłówkiem Retry-After byłoby najlepszą opcją, ale nie jestem pewien, czy pole Location nagłówka odpowiedzi może być równe adresowi żądania. W każdym razie to przekierowanie cykliczne.
źródło
409 Konflikt
Wskazuje, że żądanie nie mogło zostać przetworzone z powodu konfliktu w żądaniu, takiego jak konflikt edycji w przypadku wielu aktualizacji. [Źródło Wikipedia.]
To mogłoby być właściwe.
Jeśli nie możesz spełnić żądania, zwracając dane - to się nie powiedzie. Myślę, że 202 sugeruje, że serwer ustawił żądanie w kolejce i spełni żądanie później. Ale w twoim przypadku żądanie dotyczy teraz danych i nie powiodło się. Jeśli spróbujesz później, jest to inne żądanie.
Myślę, że masz konflikt… chcesz danych… ale są one edytowane / aktualizowane. Byłoby tak również w przypadku, gdyby Thingy1234 już istniał i został pomyślnie pobrany wcześniej, ale teraz był w trakcie edycji i był niedostępny podczas edycji.
źródło
501 - Nie wdrożono
Dokładnie tak, jak to brzmi. Funkcja, która nie została jeszcze zaimplementowana, ale zakłada dostępność w przyszłości.
Oto link do podsumowania błędów 5xx .
źródło