(質問のタイトルを許してください。この質問を要約するのは難しいです。)
Facebookで、あなたのlikeもの。Twitterでは、皆さんfollow。GitHub では、follow人、starリポジトリ、要点も同様です。
これらのケースはすべて非常に似ています。これらの接続は軽量であり、実際には「リソース」自体ではありません。たとえば、これら 3 つの API のいずれも、そのような接続の公開 ID を公開していません。
ここで疑問が生じます:これらの接続を作成/クエリ/削除するための API を公開する "最良の" (REST に関して) 方法は何ですか?
Facebookは [ 1 ]:
GET /:id/likesオブジェクトの好み (より正確には、そのオブジェクトが好きなユーザー) を照会するPOST /:id/likes何かを気に入る (認証されたユーザーの代わりに。req body は必要ありません)DELETE /:id/likes(認証されたユーザーに代わって) 何かと違う
クエリと作成は理にかなっていますが、リソース (そのオブジェクトが好きなユーザーの配列) をDELETE実際に削除していないため、少し「RESTful」ではありません。/:id/likes
この不一致は、別のケース [ 2 ]で示されます。
GET /me/likes/:id何かが好きかどうかを問い合わせる
したがって、接続を照会することは、リソースを作成または削除することとはまったく異なるリソースを照会することです。
GitHub/me/likes/:idは、ユーザーをフォローし、リポジトリにスターを付けるスタイルに傾いています[ 3 ]:
(GitHub の/userは、Facebook の のように、認証されたユーザーを表すことに注意してください/me。)
GET /user/starred/:owner/:repoリポジトリにスターが付いているかどうかを照会するため (204 または 404 を返し、どちらの方法でも本文はありません)PUT /user/starred/:owner/:repoレポにスターを付けるため (リクエストに本文は必要ありません)DELETE /user/starred/:owner/:repoレポのスターを外すため
これははるかに一貫性がありますが、残念ながら、これにより個々の「星」がグループから分離されます。
GET /repos/:owner/:repo/stargazersレポにスターを付けたユーザーを照会する
興味深いことに、GitHubは要旨の星付けに別のスタイルを使用しています[ 4 ]:
GET /gists/:id/star要点にスターが付いているかどうかを照会するためPUT /gists/:id/star要点にスターを付けるDELETE /gists/:id/star要旨のスターを外すため
これにより、ユーザー リソースではなく、Facebook などの要点リソースで主演アクションが保持されます。
GitHub はgists のスターゲイザーを公開していませんが、おそらく次のようになります。
GET /gists/:id/stargazers要点にスターを付けたユーザーを照会する
「スターゲイザー」は確かに「スター」とは異なるリソース/名前ですが、名前は類似しており、明らかに関連しており、両方とも同じリソースにあります。
これについて私が考えることができる唯一の欠点は、リソースに名前を付けることです。のようなものは機能しますが、またはstarのようなアクションはよりトリッキーです。followlike
(Twitter API はほとんど RESTful ではないため、例として含める必要はありません。)
適切なリソースではないものを作成/クエリ/削除するための完全なRESTful APIは明らかにありませんが、私が見ていない他の長所/短所、または考慮すべき他のスタイルはありますか?
ありがとう!