(質問のタイトルを許してください。この質問を要約するのは難しいです。)
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
のようなアクションはよりトリッキーです。follow
like
(Twitter API はほとんど RESTful ではないため、例として含める必要はありません。)
適切なリソースではないものを作成/クエリ/削除するための完全なRESTful APIは明らかにありませんが、私が見ていない他の長所/短所、または考慮すべき他のスタイルはありますか?
ありがとう!