Zaakceptowano HTTP 202 (HTTP / 1.1)
Szukasz HTTP 202 Accepted
statusu. Zobacz RFC 2616 :
Żądanie zostało zaakceptowane do przetworzenia, ale przetwarzanie nie zostało zakończone.
Przetwarzanie HTTP 102 (WebDAV)
RFC 2518 sugeruje użycie HTTP 102 Processing
:
Kod statusu 102 (Przetwarzanie) jest odpowiedzią tymczasową używaną do poinformowania klienta, że serwer zaakceptował kompletne żądanie, ale jeszcze go nie zrealizował.
ale ma zastrzeżenie:
Serwer MUSI wysłać ostateczną odpowiedź po zakończeniu żądania.
Nie jestem pewien, jak interpretować ostatnie zdanie. Czy serwer powinien unikać wysyłania czegokolwiek podczas przetwarzania i odpowiadać dopiero po zakończeniu? A może wymusza zakończenie odpowiedzi dopiero po zakończeniu przetwarzania? Może to być przydatne, jeśli chcesz zgłosić postępy. Wyślij HTTP 102 i opróżnij bajt po bajcie (lub linia po linii).
Na przykład, dla długiego, ale liniowego procesu, możesz wysłać sto kropek, spłukujących po każdym znaku. Jeśli strona klienta (na przykład aplikacja JavaScript) wie, że powinna spodziewać się dokładnie 100 znaków, może dopasować ją do paska postępu, aby wyświetlić ją użytkownikowi.
Kolejny przykład dotyczy procesu, który składa się z kilku nieliniowych kroków. Po każdym kroku możesz opróżnić komunikat dziennika, który ostatecznie zostanie wyświetlony użytkownikowi, aby użytkownik końcowy mógł wiedzieć, jak przebiega proces.
Problemy z postępującym spłukiwaniem
Pamiętaj, że chociaż ta technika ma swoje zalety, nie polecałbym jej . Jednym z powodów jest to, że zmusza połączenie do pozostania otwartym, co może zaszkodzić dostępności usług i nie skaluje się dobrze.
Lepszym rozwiązaniem jest udzielenie odpowiedzi HTTP 202 Accepted
i umożliwienie użytkownikowi skontaktowania się z Tobą później w celu ustalenia, czy przetwarzanie zostało zakończone (na przykład poprzez wielokrotne wywoływanie danego identyfikatora URI, na przykład /process/result
odpowiadającego komunikatem HTTP 404 Not Found lub HTTP 409 Conflict, aż do zakończenia procesu kończy się, a wynik jest gotowy) lub powiadom użytkownika o zakończeniu przetwarzania, jeśli będziesz w stanie oddzwonić do klienta na przykład za pośrednictwem usługi kolejki wiadomości ( przykład ) lub WebSockets.
Praktyczny przykład
Wyobraź sobie serwis internetowy, który konwertuje filmy. Punktem wejścia jest:
POST /video/convert
który pobiera plik wideo z żądania HTTP i robi z nim trochę magii. Wyobraźmy sobie, że magia wymaga dużego procesora, więc nie można tego zrobić w czasie rzeczywistym podczas przesyłania żądania. Oznacza to, że po przesłaniu pliku serwer odpowie z HTTP 202 Accepted
treścią JSON, co oznacza: „Tak, mam twój film i pracuję nad nim; będzie gotowy gdzieś w przyszłości i będzie dostępny poprzez ID 123. ”
Klient ma możliwość zasubskrybowania kolejki komunikatów, aby otrzymywać powiadomienia o zakończeniu przetwarzania. Po zakończeniu klient może pobrać przetworzone wideo, przechodząc do:
GET /video/download/123
co prowadzi do HTTP 200
.
Co się stanie, jeśli klient zapyta o ten identyfikator URI przed otrzymaniem powiadomienia? Cóż, serwer odpowie, HTTP 404
ponieważ rzeczywiście wideo jeszcze nie istnieje. To może być obecnie przygotowane. Nigdy nie można o to poprosić. Może istnieć jakiś czas w przeszłości, a później zostanie usunięty. Liczy się tylko to, że powstałe wideo nie jest dostępne.
Co teraz, jeśli klientowi zależy nie tylko na końcowym filmie, ale także na postępie (co byłoby jeszcze ważniejsze, gdyby nie było usługi kolejki wiadomości lub podobnego mechanizmu)?
W takim przypadku możesz użyć innego punktu końcowego:
GET /video/status/123
co dałoby odpowiedź podobną do tej:
HTTP 200
{
"id": 123,
"status": "queued",
"priority": 2,
"progress-percent": 0,
"submitted-utc-time": "2016-04-19T13:59:22"
}
Wykonanie żądania w kółko pokaże postęp, dopóki:
HTTP 200
{
"id": 123,
"status": "done",
"progress-percent": 100,
"submitted-utc-time": "2016-04-19T13:59:22"
}
Ważne jest, aby wprowadzić rozróżnienie między tymi trzema rodzajami żądań:
POST /video/convert
ustawia w kolejce zadanie. Powinien zostać wywołany tylko raz: ponowne wywołanie go w kolejce spowoduje dodatkowe zadanie.
GET /video/download/123
dotyczy wyniku operacji: zasobem jest wideo. Przetwarzanie - czyli to, co wydarzyło się pod maską, aby przygotować rzeczywisty wynik przed żądaniem i niezależnie od żądania - nie ma tutaj znaczenia. Można go wywołać raz lub kilka razy.
GET /video/status/123
dotyczy przetwarzania per se . Nic nie stoi w kolejce. Nie obchodzi go powstały film. Zasób jest sama obróbka. Można go wywołać raz lub kilka razy.