构建用户与其他实体交互的URL的RESTful方法是什么?

时间:2012-07-19 17:44:39

标签: http rest restful-url restful-architecture

我正在试图找出用于构建用户与其他实体交互的URL的正确RESTful方法是什么?

例如,我有三个实体:userspoststags

您如何表示“用户喜欢发布”,“用户关注标记”或“用户关注用户”。

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

POST /user/:id/like/post/:id(用户喜欢发帖)

POST /user/:id/follow/user/:id(用户关注其他用户)

看起来非常语义,但我不确定POST方法

2 个答案:

答案 0 :(得分:4)

公平警告:我也是REST的新手。

Leonard Richardson和Sam Ruby从RESTful Web Services采取的一般性评论:

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

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

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

要向用户喜欢的帖子添加帖子,我会向/users/{id}/posts发送帖子,其中包含要添加到请求正文中的常用帖子列表中的帖子的标识。

与用户1现在也跟随用户200和300的记录类似,我会使用请求正文中这些用户的标识POST到/users/{id}/follows

毕竟你没有提供用户1和其他两个用户之间关系的标识,但是你要添加两个新的关系资源,它们分别将用户200和用户300作为“跟随用户”属性。

支持你的应用程序的数据库很可能有一个Users表,一个Posts表和一个Likes,其中Likes表是你记录用户喜欢帖子时添加的表。而喜欢记录的识别将不是用户的身份证明,也不是邮政的身份证明,但它将有自己的身份证明(单独或作为用户和邮政标识的组合)。

即使您将用户喜欢的帖子存储在关系模型以外的其他内容中,甚至可能没有针对“喜欢”的单独标识,每个喜欢的标识仍然是用户和帖子的组合。

答案 1 :(得分: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。 BTW我使用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>

我真正喜欢上述内容(除了它是真正的REST)之外,因为您使用的是URL而不是ID,您可以喜欢并关注其他系统中的帖子和用户。 :)