REST のRはリソースを表します
(Representationalを表すため、これは正しくありませんが、RESTでのリソースの重要性を覚えておくことは良いトリックです)。
についてPUT /groups/api/v1/groups/{group id}/status/activate
:「アクティベート」を更新していません。「アクティブ化」はものではなく、動詞です。動詞は決して良いリソースではありません。経験則:アクション(動詞)がURLにある場合、おそらくRESTfulではありません。
代わりに何をしていますか?グループのアクティブ化を「追加」、「削除」、または「更新」するか、または必要に応じて、グループの「ステータス」リソースを操作します。個人的には、「アクティベーション」を使用します。これは、「ステータス」の概念よりも曖昧さが少ないためです。ステータスの作成は曖昧ですが、アクティベーションの作成はそうではありません。
POST /groups/{group id}/activation
アクティベーションを作成(または作成の要求)します。
PATCH /groups/{group id}/activation
既存のアクティベーションの詳細を更新します。グループにはアクティベーションが1つしかないため、どのアクティベーションリソースを参照しているかがわかります。
PUT /groups/{group id}/activation
古いアクティベーションを挿入または置換します。グループにはアクティベーションが1つしかないため、どのアクティベーションリソースを参照しているかがわかります。
DELETE /groups/{group id}/activation
キャンセルするか、アクティベーションを削除します。
このパターンは、グループの「アクティブ化」が、支払いの実行、メールの送信などの副作用を持っている場合に役立ちます。POSTとPATCHだけがこのような副作用を引き起こす可能性があります。たとえば、アクティベーションを削除して、たとえばメールでユーザーに通知する必要がある場合、DELETEは正しい選択ではありません。その場合、あなたはおそらくしたいの不活性化、リソースを作成します:POST /groups/{group_id}/deactivation
。
この標準契約により、クライアント、およびクライアントとあなたの間のすべてのプロキシとレイヤが非常に明確になり、再試行しても安全な時期とそうでない時期がわかるため、これらのガイドラインに従うことをお勧めします。クライアントが不安定なwifiのどこかにあり、そのユーザーが「非アクティブ化」をクリックすると、次のようにトリガーされますDELETE
。それが失敗した場合、クライアントは、404、200、または処理できる他の何かを取得するまで、単純に再試行できます。しかし、それがトリガーされるPOST to deactivation
と、再試行しないことがわかります。POSTはこれを意味します。
すべてのクライアントが契約を結んでいます。これにより、HTTPライブラリがバックエンドへの呼び出しを再試行し続けたという理由だけで、「グループは非アクティブ化されました」という42通の電子メールの送信を防ぐことができます。
単一の属性の更新:PATCHを使用する
PATCH /groups/{group id}
属性を更新したい場合。たとえば、「ステータス」は、設定可能なグループの属性である可能性があります。「ステータス」などの属性は、多くの場合、値のホワイトリストに限定するのに適した候補です。例では、未定義のJSONスキームを使用しています。
PATCH /groups/{group id} { "attributes": { "status": "active" } }
response: 200 OK
PATCH /groups/{group id} { "attributes": { "status": "deleted" } }
response: 406 Not Acceptable
副作用なしでリソースを置き換えるには、PUTを使用します。
PUT /groups/{group id}
グループ全体を置き換えたい場合。これは、必ずしもサーバーが実際に新しいグループを作成し、古いグループを破棄することを意味するわけではありません。たとえば、IDは同じままである可能性があります。しかし、クライアントのために、これは何PUTであることができ、クライアントは、彼は、サーバーの応答に基づいて、全く新しいアイテムを取得しなければならないと仮定:意味します。
クライアントは、PUT
リクエストの場合、常にリソース全体を送信し、新しいアイテムを作成するために必要なすべてのデータを持っている必要があります。通常、POST作成と同じデータが必要です。
PUT /groups/{group id} { "attributes": { "status": "active" } }
response: 406 Not Acceptable
PUT /groups/{group id} { "attributes": { "name": .... etc. "status": "active" } }
response: 201 Created or 200 OK, depending on whether we made a new one.
非常に重要な要件は、PUT
べき等であることPATCH
です。グループの更新(またはアクティブ化の変更)時に副作用が必要な場合は、を使用する必要があります。したがって、更新の結果、たとえばメールが送信される場合は、を使用しないでくださいPUT
。