REST:应如何“更新”资源?

时间:2019-03-28 02:44:24

标签: rest api httpverbs

我正在创建一个RESTful API,可以在其中添加,修改和删除“条目”。每个条目在创建时都会自动分配一个到期日期,并且会自动删除,除非在该日期之前更新。续订条目时,只是给它一个较晚的失效日期(服务器无法让用户选择失效日期)。

我的问题是,公开“更新”功能的RESTful方法是什么?

我想到的几种可能性(尽管似乎没有一种是正确的):

  1. DELETE /api/entries/:id/expiration-date
  2. PATCH /api/entries/:id(在(JSON)正文中带有"expirationDate": null
  3. PATCH /api/entries/:id,没有任何内容
  4. PUT /api/entries/:id(本质上要求重新提交条目)

注意:目前,该API的唯一预期使用者将是我自己的客户端应用程序,但将来我可能会选择将其公开。

3 个答案:

答案 0 :(得分:0)

我会用

PUT /api/entries/id/renew

带有到期日期的正文(或没有到期日期以使用默认值)。原因是有效期实际上与对象本身无关;它是与系统如何管理对象相关的元数据。

答案 1 :(得分:0)

就个人而言,我将使用一个简单的POST请求来通知服务器对其进行续订。这不是RESTful的,但它似乎是解决此问题的最简单方法。

这是一个RESTful答案。

REST只是关于在资源之间来回提交状态。在这种特殊情况下,将它直接与资源状态联系起来有点困难。

有限的描述我能想到的最好的事情是,只要有人“看到”该资源,它就可能保持活动状态。

这可以转换回lastSeen: "date-time"属性。

我怀疑更新的行为具有特定的业务原因,并且可能有更好的方法将业务原因转换为类似REST的状态或属性。

修改

再三考虑,我将使用lastRenewed属性并使用日期时间值。这样可以将其与“过期超时”断开连接,将信息与资源相关联,并且避免了用户只需要立即将其替换为服务器而将值设置为null的问题。

答案 2 :(得分:0)

  

我的问题是,公开“更新”功能的RESTful方法是什么?

您将如何在网站上提供此功能?

您大概会首先通过GET请求查看条目的网页,该网页会将页面的当前表示形式加载到本地缓存中。ou

当服务器判断该条目符合更新条件时,该网页将包含某种超媒体功能,以允许客户端触发更新协议。在这种情况下,您可能不希望该功能具有安全的语义,因此它将是使用POST方法的一种形式。当用户提交表单时,浏览器将创建一个具有正确的元数据的HTTP请求,并将表单数据按照HTML处理规则的描述复制到请求主体中;服务器会将请求提交到form.action中指定的URL。

URL的拼写对用户重要吗?并非如此,用户只是提交表单,URL只是不透明的数据。间接地,这很重要,因为定义了缓存无效语义的方式-如果我们打算更新应该 evict 先前缓存的网页表示形式,那么发布请求应该具有页面本身的URL

类似地,无需在页面上放置Web表单-您可以使用其他缓存规则来链接到其他位置管理的表单。

以机器可读的方式执行此操作,您将获得一个REST API。

PUTPATCH的基本工作方式相同, 除外,即请求正文是页面本身的描述。下载HTML,进行编辑,然后完整地放入新文档或计算补丁文档并发送。

PUT和PATCH在贫血领域非常有效-例如文档存储;当您需要对变更进行反向工程以确定意图时,直接使用制图表达更具挑战性。