Krótka, bezpośrednia odpowiedź
Ponieważ żądanie mówi o wykonaniu listy zadań (zadania są zasobem, o którym tu mówimy), to jeśli grupa zadań została przeniesiona do wykonania (to znaczy niezależnie od wyniku wykonania), byłoby rozsądne będzie status odpowiedzi 200 OK
. W przeciwnym razie, jeśli wystąpi problem, który uniemożliwiłby wykonanie grupy zadań, taki jak niepowodzenie sprawdzania poprawności obiektów zadania lub niektóre wymagane usługi nie będą dostępne, na przykład stan odpowiedzi powinien oznaczać ten błąd. W przeszłości, gdy rozpoczyna się wykonywanie zadań, ponieważ zadania do wykonania są wymienione w treści żądania, oczekiwałbym, że wyniki wykonania zostaną wyświetlone w treści odpowiedzi.
Długa, filozoficzna odpowiedź
Ten dylemat występuje, ponieważ odwracasz się od tego, do czego został zaprojektowany HTTP. Nie współdziałasz z nim w celu zarządzania zasobami, a raczej używasz go jako narzędzia do zdalnego wywoływania metod (co nie jest bardzo dziwne, ale działa słabo bez wcześniej założonego schematu).
Biorąc powyższe pod uwagę, i bez odwagi, aby zamienić tę odpowiedź w długo opiniotwórczy przewodnik, poniżej przedstawiono schemat URI zgodny z podejściem do zarządzania zasobami:
/tasks
GET
wyświetla wszystkie zadania, paginowane
POST
dodaje jedno zadanie
/tasks/task/[id]
GET
odpowiada obiektem stanu pojedynczego zadania
DELETE
anuluje / usuwa zadanie
/tasks/groups
GET
wyświetla wszystkie grupy zadań, paginowane
POST
dodaje grupę zadań
/tasks/groups/group/[id]
GET
odpowiada stanem grupy zadań
DELETE
anuluje / usuwa grupę zadań
Ta struktura mówi o zasobach, a nie o tym, co z nimi zrobić. To, co dzieje się z zasobami, dotyczy innej usługi.
Inną ważną kwestią do zrobienia jest to, że wskazane jest, aby nie blokować zbyt długo w module obsługi żądań HTTP. Interfejs HTTP, podobnie jak interfejs użytkownika, powinien być responsywny - w skali czasowej wolniejszej o kilka rzędów wielkości (ponieważ ta warstwa dotyczy IO).
Przejście w kierunku zaprojektowania interfejsu HTTP, który ściśle zarządza zasobami, jest prawdopodobnie tak trudne, jak oderwanie pracy od wątku interfejsu użytkownika po kliknięciu przycisku. Wymaga to, aby serwer HTTP komunikował się z innymi usługami w celu wykonania zadań zamiast wykonywania ich w module obsługi żądań. To nie jest płytkie wdrożenie, to zmiana kierunku.
Kilka przykładów zastosowania takiego schematu URI
Wykonywanie pojedynczego zadania i śledzenie postępu:
POST /tasks
z zadaniem do wykonania
GET /tasks/task/[id]
do momentu, gdy obiekt odpowiedzi będzie completed
miał wartość dodatnią, jednocześnie pokazując aktualny status / postęp
Wykonanie pojedynczego zadania i oczekiwanie na jego zakończenie:
POST /tasks
z zadaniem do wykonania
GET /tasks/task/[id]?awaitCompletion=true
dopóki completed
ma wartość dodatnią (prawdopodobnie ma limit czasu, dlatego należy go zapętlić)
Wykonywanie grupy zadań i śledzenie postępu:
POST /tasks/groups
z grupą zadań do wykonania
GET /tasks/groups/group/[groupId]
do momentu, gdy completed
właściwość obiektu odpowiedzi będzie miała wartość, pokazującą status pojedynczego zadania (na przykład 3 zadania ukończone z 5)
Żądanie wykonania grupy zadań i oczekiwanie na jej zakończenie:
POST /tasks/groups
z grupą zadań do wykonania
GET /tasks/groups/group/[groupId]?awaitCompletion=true
dopóki nie odpowie wynikiem oznaczającym zakończenie (prawdopodobnie ma limit czasu, dlatego należy go zapętlić)