RESTのRはリソースを表します
(Representational の略であるため、これは正しくありませんが、REST におけるリソースの重要性を覚えておくには良い方法です)。
About 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-create が必要とするデータと同じデータです。
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
。