使用PUT进行“标记为收藏”操作在语义上不正确吗?

时间:2019-03-06 20:34:39

标签: rest http api-design

在我的应用程序中,我有两种类型:userfilefile可以将user标记为“收藏夹”,以便于访问。我目前在像这样“收藏” PUT时使用file方法:

PUT /user/fileList/
Body: { fileId: 'xxxx' }

然后,服务器会将给定的fileId添加到用户的记录中(单独处理授权)。

这种PUT的使用在语义上是不正确的还是其他不好的做法?有没有更好的方法来实现这种模式?在我看来(至少在语义上)是次优的解决方案。

1 个答案:

答案 0 :(得分:1)

不。例如,Github会在其API中为存储库加注星标。

https://developer.github.com/v3/activity/starring/#star-a-repository

此处PUT和POST之间的相关区别在于,当客户端知道资源应位于的URL时,客户端应使用PUT,例如/user/starred/:owner/:repo,并且客户端在不知道或不应该在何处创建资源时应使用POST,例如POST /users,该链接应返回到/users/138

的链接

引用定义HTTP 1.1的RFC 2616:

  

PUT方法请求将封闭的实体存储在提供的Request-URI下...如果Request-URI没有指向现有资源,并且该URI为   能够由发出请求的用户代理定义为新资源,原始服务器可以创建资源   带有该URI。

     

POST方法用于请求源服务器接受请求中包含的实体作为新实体   在请求行中由Request-URI标识的资源的下属。

因此,在您的特定情况下,由于客户端知道资源的去向,因此我会将fileId放在URL的某个位置(例如/user/fileList/:fileId)而不是正文中。