5

(質問のタイトルを許してください。この質問を要約するのは難しいです。)

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は明らかにありませんが、私が見ていない他の長所/短所、または考慮すべき他のスタイルはありますか?

ありがとう!

4

2 に答える 2

1

/me/likes/:idスタイルについて私が気に入った点の 1 つは、いいねが個別のアドレス指定可能なリソースのように感じられることです

GitHub のリポジトリAPI は、リポジトリへの「スター」接続を作成/クエリ/削除するためにこれをうまく使用しますが、特定のリポジトリのすべての「スター」接続を取得するには矛盾があります。

オブジェクト ID だけに頼るのではなく、(認証された) ユーザーの ID も使用してください。例えば:

  • GET /:owner/:repo/stargazersこのレポにスターを付けたすべてのユーザーを照会するには

  • GET /:owner/:repo/stargazers/:id:idユーザーがレポにスターを付けているかどうかを照会します-これは、指定することで認証されたユーザーにすることができますme!

  • PUT /:owner/:repo/stargazers/meリポジトリにスターを付ける -- これは、認証されたユーザーに対してのみ機能します

  • DELETE /:owner/:repo/stargazers/meレポのスターを外す -- 同上

これで、すべてのリソース/アクションがまとめられ、アクションに一貫性があり、名前付けが簡単になりました。

編集:このアプローチのもう 1 つの利点は、他のユーザーがオブジェクトを好き/フォロー/星付けしているかどうかを簡単かつ効率的にクエリできることです。

編集:しかし、欠点は、リソースが技術的に正しくないことです。ユーザーGET .../stargazersのリストを返しますが、ユーザーではGET .../stargazers/:idなく接続を返します。しかたがない?

me[hereとしての受け渡しをサポートするために再度編集しました:id。]

于 2012-12-01T09:02:34.260 に答える
0

おもう

DELETE /:id/likes to like something (認証されたユーザーに代わって)

like には、いいねされたオブジェクトの ID とユーザー ID の複合キーがあるため、認証されたログインが既にあなたが誰であるかを示しており、他のユーザーの ID を削除する権限さえ持っていない場合、ID を指定することは冗長です。とにかく好き。

これを明示的に指定する (Aseem Kishore によって提案されているように) のように

削除 /:id/likes/me

・・・もう少し分かりやすいかも。

于 2013-12-04T13:13:35.703 に答える