我想设计我的休息端点与以下情形的适当方法。
有一组。 每个组都有一个状态。 该组可以被激活或由管理员灭活。
如果我设计我的终点作为
PUT /groups/api/v1/groups/{group id}/status/activate
要么
PATCH /groups/api/v1/groups/{group id}
with request body like
{action:activate|deactivate}
我想设计我的休息端点与以下情形的适当方法。
有一组。 每个组都有一个状态。 该组可以被激活或由管理员灭活。
如果我设计我的终点作为
PUT /groups/api/v1/groups/{group id}/status/activate
要么
PATCH /groups/api/v1/groups/{group id}
with request body like
{action:activate|deactivate}
该PATCH
方法是正确的选择,在这里,你要更新现有资源-组ID。 PUT
,如果你将其全部更换的资源,才应使用。
上局部资源修改的更多信息,在可用的RFC 5789 。 具体而言, PUT
方法被描述如下:
延伸的超文本传输协议(HTTP)几个应用要求的特征做局部资源修改。 现有的HTTP PUT方法只允许一个完整的替换文件。 该提案增加了一个新的HTTP方法,补丁,修改现有的HTTP资源。
(这是不正确的,因为它代表的代表性,但它是一个不错的小技巧要记住资源的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 /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 /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
。
我会建议使用补丁,因为你的资源“组”有许多特性,但在这种情况下,你只更新激活电磁场(局部修改)
根据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请求的资源是半修补。
既然你要设计使用,你需要想想你的使用情况,以决定哪些概念是重要的,足以暴露为资源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架构风格的状况。
我一般会喜欢的东西有点简单,像activate
/ deactivate
子资源(通过链接的Link
与头rel=service
)。
POST /groups/api/v1/groups/{group id}/activate
要么
POST /groups/api/v1/groups/{group id}/deactivate
对于消费者而言,这个接口是死简单,它遵循REST原则,而不受困你失望概念化“激活”作为单独的资源。