4

ユーザーが他のエンティティとやり取りするための URL を構造化するための正しい RESTful な方法を見つけようとしています。

たとえば、 と の 3 つのエンティティuserspostsありtagsます。

「ユーザーが投稿にいいね」、「ユーザーがタグをフォロー」、または「ユーザーがユーザーをフォロー」をどのように表現しますか。

これは私が念頭に置いていたことですが、それが正しい方法であるかどうかはわかりません:

POST /user/:id/like/post/:id(ユーザーが投稿を気に入った)

POST /user/:id/follow/user/:id(ユーザーは別のユーザーをフォローしています)

非常にセマンティックに見えますが、POST メソッドについてはよくわかりません

4

2 に答える 2

4

公正な警告: 私も REST の初心者です。

Leonard Richardson と Sam Ruby によるRESTful Web Servicesからの一般的なコメント:

  • リソース名には複数形を使用してください
  • サーバーがリソースの ID を制御する場合は、リソース名に POST を使用します。
  • クライアントがリソースの ID を制御する場合は、resource/:id に PUT を使用します。

それをあなたの状況に適用すると、次のリソースが表示されます

  • /users : ユーザーのリスト
  • /users/{id} : 特定のユーザー
  • /users/{id}/tags : この特定のユーザーが使用するタグのリスト
  • /users/{id}/posts : この特定のユーザーが気に入った投稿のリスト
  • /users/{id}/follows : この特定のユーザーがフォローしているユーザーのリスト

/users/{id}/postsユーザーが気に入った投稿に投稿を追加するには、リクエストの本文で、お気に入りの投稿のリストに追加される投稿の ID を使用してPOST します。

同様に、ユーザー 1 がユーザー 200 と 300 もフォローしていることを記録するため/users/{id}/followsに、要求本文にこれらのユーザーの ID を含めて POST します。

結局、ユーザー 1 と他の 2 人のユーザーの間の関係の ID を提供していませんが、ユーザー 200 とユーザー 300 をそれぞれ「ユーザーのフォロー」属性として持つ 2 つの新しい関係リソースを追加しています。

アプリをサポートするデータベースには、Users テーブル、Posts テーブル、Likes が含まれている可能性が高く、Likes テーブルは、ユーザーが投稿を気に入ったことを記録するときに追加されるテーブルです。また、Likes レコードの識別は、ユーザーの識別でも投稿の識別でもありませんが、独自の識別 (個別に、またはユーザーと投稿の識別の組み合わせとして) を持ちます。

ユーザーが気に入った投稿をリレーショナル モデル以外の何かに保存したとしても、おそらく「いいね」の個別の ID がなくても、各「いいね」の ID はユーザーと投稿の組み合わせになります。

于 2012-07-19T19:12:52.360 に答える
1

RESTful インターフェイスには、開始点として既知の URL が 1 つあります。そこから、応答で提供されるハイパーメディア コントロールによって、他のすべてのアクションとエンティティにアクセスする必要があります。その意味で、URL 構造はまったく重要ではなく、クライアントにとっても重要ではありません。それらは完全に不透明で (たとえば、http://bit.ly/9xhUggのように)、クライアントは引き続き機能します。

ここにいくつかの有用な読み物があります:

そうは言っても、サーバー実装の観点からは、提案したような構造を使用する方が簡単です。何かのようなもの:

GET /

<myapplication href="/">
    <users href="/users"/>
    <posts href="/posts"/>
    <tags href="/tags"/>
</myapplication>

GET /users

<users href="/users">
    <user username="johndoe" href="/users/1234"/>
    <user username="janedoe" href="/users/1235"/>
    <next href="/users?page=2"/>
    <search href="/users">
        <name type="string" cardinality="required"/>
    </search>
</users>

GET /users?page=2

<users href="/users">
    <user username="bobgeldof" href="/users/1236"/>
    <user username="biancajager" href="/users/1237"/>
    <next href="/users?page=3"/>
    <prev href="/users"/>
    <search href="/users">
        <name type="string" cardinality="required"/>
    </search>
</users>

GET /users/1236

<user username="bobgeldof" href="/users/1236">
    <posts-liked href="/users/1236/posts"/>
    <tags-followed href="/users/1236/tags"/>
    <users-followed href="/users/1236/users"/>
    <like-post href="/users/1236" method="PUT">
        <post type="URL" cardinality="required"/>
    </like-post>
    <follow-tag href="/users/1236" method="PUT">
        <tag type="URL" cardinality="required"/>
    </follow-tag>
    <follow-user href="/users/1236" method="PUT">
        <user type="URL" cardinality="required"/>
    </follow-user>
</user>

上記で重要なことは、投稿がいいね! されているか、タグまたはユーザーがフォローされている場合、投稿、タグ、またはユーザーの URI が ID ではなくパラメーターとして送信されるということです。ところで、これらの操作に PUT を使用する理由は、アクションがべき等であるためです。そうでない場合は、代わりに POST を使用します。

GET /users/1236/posts

<liked-posts href="/users/1236/posts">
    <post href="http://stackoverflow.com/questions/11566436" title="What's the RESTful way to structure an URL for user interactions with other entities?">
        <unlike href="/users/1236/posts?href=http%3A%2F%2Fstackoverflow.com%2Fquestions%2F11566436" method="DELETE"/>
    </post>
    ...
    <next href="/users/1236/posts?page=2"/>
</liked-posts>

GET /users/1236/users

<followed-users href="/users/1236/users">
    <user username="biancajager" href="/users/1237">
        <unfollow href="/users/1236/users?href=%2Fusers%2F1237" method="DELETE">
    </user>
    <user username="Jorge Pedret" href="http://stackoverflow.com/users/201092/jorge-pedret">
        <unfollow href="/users/1236/users?href=http%3A%2F%2Fstackoverflow.com%2Fusers%2F201092%2Fjorge-pedret" method="DELETE"/>
    </user>
    <next href="/users/1236/users?page=2"/>
</followed-users>

上記の (真に RESTful であることに加えて) 私が本当に気に入っているのは、ID の代わりに URL を使用しているため、他のシステムの投稿やユーザーを気に入ってフォローできることです。:)

于 2012-07-20T00:36:06.620 に答える