短く、直接的な答え
リクエストはタスクのリストの実行について話すので(タスクはここで言うリソースです)、タスクグループが実行に移された場合(つまり、実行結果に関係なく)、それは賢明です応答ステータスがであること200 OK
。それ以外の場合、タスクオブジェクトの検証の失敗など、タスクグループの実行を妨げる問題が発生した場合、または必要なサービスが利用できない場合、応答ステータスはそのエラーを示す必要があります。それを過ぎて、タスクの実行が開始されると、実行するタスクが要求本文にリストされているのを見て、実行結果が応答本文にリストされることを期待します。
長い哲学的答え
HTTPの設計目的から逸脱しているため、このジレンマを経験しています。リソースを管理するために対話するのではなく、リモートメソッド呼び出しの手段として使用しています(これはあまり奇妙ではありませんが、事前に考えられたスキームがないとうまく機能しません)。
上記が述べられており、この答えを長々と説得力のあるガイドに変える勇気がなければ、以下はリソース管理アプローチに適合するURIスキームです:
/tasks
GET
ページ分割されたすべてのタスクをリストします
POST
単一のタスクを追加します
/tasks/task/[id]
GET
単一のタスクの状態オブジェクトで応答します
DELETE
タスクをキャンセル/削除します
/tasks/groups
GET
ページネーションされたすべてのタスクグループをリストします
POST
タスクのグループを追加します
/tasks/groups/group/[id]
GET
タスクグループの状態で応答します
DELETE
タスクグループをキャンセル/削除します
この構造は、リソースを扱うものではなく、リソースについて述べています。リソースで行われているのは、別のサービスの懸念です。
もう1つ重要な点は、HTTPリクエストハンドラーで長時間ブロックしないことをお勧めします。UIと同様に、HTTPインターフェースは応答性が高くなければなりません-タイムスケールは数桁遅いです(このレイヤーはIOを処理するため)。
リソースが厳密に管理されるHTTPインターフェイスの設計に移行することは、ボタンがクリックされたときにUIスレッドから作業を移動するのと同じくらい難しいでしょう。HTTPサーバーは、要求ハンドラーでタスクを実行するのではなく、他のサービスと通信してタスクを実行する必要があります。これは浅い実装ではなく、方向の変更です。
そのようなURIスキームがどのように使用されるかのいくつかの例
単一のタスクを実行して進行状況を追跡する:
POST /tasks
実行するタスクで
GET /tasks/task/[id]
completed
現在のステータス/進行状況を表示しながら、応答オブジェクトが正の値を持つまで
単一のタスクを実行し、その完了を待っています:
POST /tasks
実行するタスクで
GET /tasks/task/[id]?awaitCompletion=true
until completed
が正の値を持つ(タイムアウトが発生する可能性が高いため、これをループする必要がある)
タスクグループの実行と進捗の追跡:
POST /tasks/groups
実行するタスクのグループ
GET /tasks/groups/group/[groupId]
応答オブジェクトのcompleted
プロパティに値があり、個々のタスクステータス(5つのうち3つのタスクが完了したなど)を示すまで
タスクグループの実行をリクエストし、その完了を待っています:
POST /tasks/groups
実行するタスクのグループ
GET /tasks/groups/group/[groupId]?awaitCompletion=true
完了を示す結果で応答するまで(タイムアウトがある可能性が高いため、ループする必要があります)