REST API PATCH或PUTREST API PATCH或PUT(REST API PATC

2019-05-12 12:51发布

我想设计我的休息端点与以下情形的适当方法。

有一组。 每个组都有一个状态。 该组可以被激活或由管理员灭活。

如果我设计我的终点作为

PUT /groups/api/v1/groups/{group id}/status/activate

要么

PATCH /groups/api/v1/groups/{group id}

with request body like 
{action:activate|deactivate}

Answer 1:

PATCH方法是正确的选择,在这里,你要更新现有资源-组ID。 PUT ,如果你将其全部更换的资源,才应使用。

上局部资源修改的更多信息,在可用的RFC 5789 。 具体而言, PUT方法被描述如下:

延伸的超文本传输​​协议(HTTP)几个应用要求的特征做局部资源修改。 现有的HTTP PUT方法只允许一个完整的替换文件。 该提案增加了一个新的HTTP方法,补丁,修改现有的HTTP资源。



Answer 2:

在休息R代表资源

(这是不正确的,因为它代表的代表性,但它是一个不错的小技巧要记住资源的REST的重要性)。

关于PUT /groups/api/v1/groups/{group id}/status/activate :你没有更新的“激活”。 一个“激活”是不是一个东西,它是一个动词。 动词是从来没有很好的资源。 经验法则: 如果动作,动词,是在URL,它可能不是RESTful的

你在做什么呢? 无论你是“添加”,“删除”或“更新”上一组激活 ,或者如果你喜欢:操作上集团“地位” -resource。 就个人而言,因为它们比概念“身份”更加明确我会使用“激活”:创建一个状态是不明确的,创建一个激活不是。

  • POST /groups/{group id}/activation创建(或请求的创建)的激活。
  • PATCH /groups/{group id}/activation更新现有激活的一些细节。 由于组只有一个激活,我们知道什么是激活资源,我们指的是。
  • PUT /groups/{group id}/activation插入有或替换旧的活化。 由于组只有一个激活,我们知道什么是激活资源,我们指的是。
  • DELETE /groups/{group id}/activation将取消或删除的激活。

当一组的“活化”具有副作用,如付款制成,被发送的邮件等这种模式是有用的。 只有POST和补丁程序可能有这样的副作用。 当如激活的缺失需要,比如说,在邮件通知用户,删除是不是正确的选择; 在这种情况下,你可能需要创建一个停用资源POST /groups/{group_id}/deactivation

正是遵循这些指导方针是个好主意,因为这个标准合同使你的客户说得很清楚,所有的客户端和你们之间的代理和层,当它是安全的重试,当没有。 比方说,客户是某处片状无线网络,其用户点击“去活”,这将触发DELETE :如果失败,客户端可以简单地重试,直到它得到一个404,200或其他任何东西,它可以处理。 但是,如果它触发POST to deactivation它知道不重试:后暗示这一点。
任何客户端现在有一个合同,其中,跟随时,将防止发出了42封电子邮件以后“你的小组已停用”,只是因为它的HTTP库保持重试调用后端。

更新单个属性:使用PATCH

PATCH /groups/{group id}

如果要更新的属性。 例如,“状态”可能是对可以设定组的属性。 的属性,如“状态”往往是一个很好的候选人,以限制值的白名单。 例如使用一些不确定的JSON-方案:

PATCH /groups/{group id} { "attributes": { "status": "active" } }
response: 200 OK

PATCH /groups/{group id} { "attributes": { "status": "deleted" } }
response: 406 Not Acceptable

更换资源,无副作用使用PUT。

PUT /groups/{group id}

如果您想更换整个集团。 这并不一定意味着服务器实际上创建了一个新的群体,并引发老一分出来,例如IDS可能保持不变。 但对于客户来说,这是什么PUT 可能意味着:客户应承担他得到了一个全新的项目,基于服务器的响应。

客户应在的情况下, PUT请求时,始终发送整个资源,让所有来创建一个新项目时需要的数据:通常是相同的数据作为后创建需要。

PUT /groups/{group id} { "attributes": { "status": "active" } }
response: 406 Not Acceptable

PUT /groups/{group id} { "attributes": { "name": .... etc. "status": "active" } }
response: 201 Created or 200 OK, depending on whether we made a new one.

一个非常重要的要求是, PUT是幂等的:如果你需要的副作用更新时,一个集团(或更改激活),你应该使用PATCH 。 所以,当在例如,更新结果发出邮件,不要使用PUT



Answer 3:

我会建议使用补丁,因为你的资源“组”有许多特性,但在这种情况下,你只更新激活电磁场(局部修改)

根据RFC5789( https://tools.ietf.org/html/rfc5789 )

现有的HTTP PUT方法只允许一个完整的替换文件。 该提案增加了一个新的HTTP方法,补丁,修改现有的HTTP资源。

此外,在更多的细节,

在PUT和PATCH请求之间的差别反映在道路服务器处理封装的实体修改的资源
由Request-URI标识。 在PUT请求,封闭实体被认为是存储在所述资源的经修改版本
源服务器和客户端请求的存储版本
更换。 补丁,但是,封闭的实体包含描述当前的资源如何驻留在一组指令
原始服务器应进行修改,以产生一个新的版本。 补丁方法影响由Request-URI标识的资源,它
也有可能对其他资源的副作用; 即,新资源
可被创建,或现有的改性,通过的应用
补丁。

PATCH是既不安全也不幂等由[RFC2616],第9.1节所定义的。

客户需要选择何时使用PATCH而不是PUT。 对于
例如,如果该补丁文件大小比的大小大
这将在PUT使用的新资源数据,那么可以考虑
有必要使用PUT而不是补丁。 要发布一个比较更是难上加难,因为使用POST工作在各种不同的方式,并能
包括PUT和PATCH般的操作,如果服务器选择。 如果
不修改由请求 - URI可预测的方式确定的资源进行操作,POST,应考虑的,而不是PATCH
或PUT。

对于PATCH响应代码是

204响应码被使用,因为反应不携带消息体(其与200码的响应将具有)。 注意,其他的成功代码可以被使用。

也指thttp://restcookbook.com/HTTP%20Methods/patch/

警告:一个API实现PATCH必须修补原子。 它必须是不可能的,当由GET请求的资源是半修补。



Answer 4:

既然你要设计使用,你需要想想你的使用情况,以决定哪些概念是重要的,足以暴露为资源REST架构风格的API。 如果你决定公开一组作为子资源的状态,你可以给它下面的URI和执行GET和PUT方法的支持:

/groups/api/groups/{group id}/status

这种方法在补丁修改的缺点是,你将不能够更改一组多个属性原子和事务。 如果事务性变化是重要的,然后使用补丁。

如果你决定揭露地位,作为一个组的子资源,应该是在人群的代表性的链接。 例如,如果该试剂得到组123和接受XML响应主体可包含:

<group id="123">
  <status>Active</status>
  <link rel="/linkrels/groups/status" uri="/groups/api/groups/123/status"/>
  ...
</group>

需要一个超链接来满足超媒体作为应用状态的引擎 REST架构风格的状况。



Answer 5:

我一般会喜欢的东西有点简单,像activate / deactivate子资源(通过链接的Link与头rel=service )。

POST /groups/api/v1/groups/{group id}/activate

要么

POST /groups/api/v1/groups/{group id}/deactivate

对于消费者而言,这个接口是死简单,它遵循REST原则,而不受困你失望概念化“激活”作为单独的资源。



文章来源: REST API PATCH or PUT