2

REST インターフェイス用のパブリック API を設計中です。出てきたものの 1 つは、http 動詞、特に DELETE 動詞の使用でした。

特定のジョブを開始/停止または実行/中止するメソッドを公開したいと考えています。これら 2 つの API 設計の 2 つのフレーバーは次のとおりです。

役職

http://localhost/api/campaignrun/1

ID 1 でキャンペーンを実行する

消去

http://localhost/api/campaignrun/1

ID 1 でキャンペーンの実行を中止します

あるいは...

役職

http://localhost/api/campaignrun/1

{ action=execute}

ID 1 でキャンペーンを実行する

役職

http://localhost/api/campaignrun/1

{ action=abort }

ID 1 のキャンペーンの実行を中止します

私のお気に入りがあるとしたら、どれがより RESTful ですか?

4

5 に答える 5

3

あなたの 2 つのデザインのどちらかを選択して、 を使用する 2 番目の に投票しますPOSTが、少し変更します:PUT代わりに使用:

PUT http://localhost/api/campaignrun/1

{ action: abord }

この API は、その意図について明確に語っています: あなたはcampaignruns(複数形のままにしておくほうがよい) を持って{id} = 1ます。

このようにして、APIを http 動詞の冪等PUT性と一貫性を保つことができますPOST。あなたの場合、これは、ユーザーが上記のリクエストを何回ヒットしても、結果は同じであることを意味します。id=1 のキャンペーン実行は中止されます。

:URIで動詞を提案し、それらを使用する回答を受け入れたPOSTようです。この投稿は、REST の賛成または反対を論じる場所ではありませんが、質問はどちらの設計がより RESTfulであるかということなので、よく考えてください。API を設計するためのベスト プラクティスについて説明している、この非常に優れた 38 ページの無料の電子ブックを確認することをお勧めします。特に、非常にまれな場合を除き、動詞をベース URL から除外することを提案しています。それをチェックしてください、それは役に立ちます!

于 2013-04-17T09:41:23.680 に答える
0

DELETE を使用できる場合、それは素晴らしいことです。ただし、キャンペーンの実行を停止することで、クライアントがそのリソース (その特定の URL) に二度とアクセスしてはならないことを意味する場合にのみ、これを行う必要があります。クライアントが後でリソースと対話することが合理的に予想される場合は、POST (または、もちろんサブリソースへの PUT) を使用します。

于 2013-04-17T04:40:28.817 に答える
0

1つ目は、より「安らか」です。唯一の問題は、今後キャンペーンの実行を中止するのではなく、削除する必要がある場合です。将来、キャンペーン実行のレコード削除機能が必要になった場合は、いつでもアクションを DELETE に渡すことができます。

于 2013-04-17T03:54:30.167 に答える
0

停止したジョブを再開することはできますか? もしそうなら、POST実際にはリソースを削除していないので、使用することをお勧めします。ただし、URL を変更して、達成しようとしていることをより適切に示すことができます。

役職

http://localhost/api/campaignrun/1/start

役職

http://localhost/api/campaignrun/1/stop

したがって、アクションのタイプを示すためにリクエストボディを提供する必要はありません。

補足: 私にとってDELETEは、キャンペーンが永久に削除されるため、再開できないことを示しています。したがって、クライアントがリソースにアクセスしようとすると、404 が返されます。

于 2013-04-17T04:52:44.917 に答える
0

ここで多くの人が述べているように、リソースの DELETE は、関連するキャンペーン実行にアクセスできなくなったことを意味します (後で 404 Not Found が返されます)。これは、キャンペーン実行を中止する意図ではないと思います。

以下は、質問で言及されている代替手段に対してよりRESTに準拠しています。

役職

http://localhost/api/campaignruns

複数形の名詞 (より RESTful、コレクション -> インスタンス -> コレクション -> インスタンス...) に注意してください。

このリクエストは、キャンペーン実行を作成します。キャンペーン実行で作成された ID が 1であるとします。

役職

http://localhost/api/campaignruns/1/operations

{
    "operation": "execute"
}

役職

http://localhost/api/campaignruns/1/operations

{
    "operation": "abort"
}
  • 操作API は、次の HTTP メソッドをサポートします: GET 、POST
  • 操作API は、非同期呼び出しとして実装される場合があります (202 Accepted が返されます)。

たとえば、中止操作 ID が 2 であるとします。

POSTの直後に(非同期操作を想定して)どのように表示されるかを次に示します。

得る

http://localhost/api/campaignruns/1/operations/2

Response:

{
    "id": 2,
    "operation": "abort",
    "status": "processing"
}

完成時の外観は次のとおりです。

得る

http://localhost/api/campaignruns/1/operations/2

Response:

{
    "id": 2,
    "operation": "abort",
    "status": "completed"
}
于 2015-04-02T08:58:47.317 に答える