4

我试图弄清楚为用户与其他实体交互构建 URL 的正确 RESTful 方式是什么?

例如,我有三个实体userspoststags

您如何表示“用户喜欢帖子”、“用户关注标签”或“用户关注用户”。

这是我的想法,但我不确定这是否是正确的方法:

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的一些一般性评论:

  • 使用复数作为您的资源名称
  • 如果服务器控制资源的身份,则对资源名称使用 POST
  • 如果客户端控制资源的身份,则使用 PUT 到资源/:id

将其应用于您的情况,我可以看到以下资源

  • /users : 用户列表
  • /users/{id} : 特定用户
  • /users/{id}/tags : 此特定用户使用的标签列表
  • /users/{id}/posts : 此特定用户喜欢的帖子列表
  • /users/{id}/follows :此特定用户关注的用户列表

要将帖子添加到用户喜欢的帖子中,我会 POST 到/users/{id}/posts要添加到请求正文中喜欢的帖子列表中的帖子的标识。

与记录用户 1 现在也关注用户 200 和 300 类似,我将/users/{id}/follows在请求正文中使用这些用户的标识进行 POST。

毕竟,您没有提供用户 1 和其他两个用户之间的关系标识,而是添加了两个新的关系资源,分别具有用户 200 和用户 300 作为其“关注用户”属性。

支持您的应用程序的数据库很可能有一个 Users 表、一个 Posts 表和一个 Likes,其中当您记录用户喜欢 Post 时,Likes 表是被添加到的表。并且点赞记录的标识不会是用户的标识,也不是帖子的标识,而是有自己的标识(单独或作为用户和帖子标识的组合)。

即使您将用户喜欢的帖子存储在关系模型之外的其他东西中,甚至可能没有单独的点赞标识,每个点赞的标识仍然是用户和帖子的组合。

于 2012-07-19T19:12:52.360 回答
1

RESTful 接口有一个众所周知的 URL 作为起点。响应中提供的超媒体控件应从那里访问所有其他操作和实体。从这个意义上说,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 之外)是因为您使用的是 URL 而不是 ID,所以您可以喜欢和关注其他系统中的帖子和用户。:)

于 2012-07-20T00:36:06.620 回答