我一直在思考这一段时间,但不能把它包裹在我脑海里。 假设我通过REST公开了任务系统。任务有自己的生命周期,例如:
CREATED -> ACTIVE -> PROCESSING -> CLOSED
| | |
| |-->ESCALATED-->|
|
--> DISMISSED
现在使用 POST ,我通过提供正文有效负载中的所有信息来创建任务。
但是现在我只需要改变任务的状态并添加评论。因此,在所有理论中, PUT 是要走的路 - 它正在更新资源。但事情就是这样:
PUT: / tasks / {taskId}?action = activate 似乎合法的URI但是该动作已经有一个请求参数,可用于更改资源的状态 - PUT 有效负载怎么办?这个端点的用户是否直观地发送带有0长度消息的请求?
更新:
抱歉我的英语不好。我的意思 - 使用URI参数 PUT 请求 ONLY 更改资源状态是一个好习惯,没有BODY(Content-Lenght:0)因此URI :/ tasks / 32 / ?action = CLOSED 将“任务”状态从处理更改为已关闭。
如果这是一种不好的做法 - 什么方法被认为是更好的做法?
答案 0 :(得分:3)
不,你不能这样做并调用你的应用程序RESTful ,原因有两个:
URI是原子标识符。您不能将查询字符串参数视为方法参数或使用与主体有效负载相同的语义。它们是标识符的一部分。
PUT要求服务器用提交的表示替换给定URI的资源。您不能像使用PUT那样使用PUT进行部分更新,并且肯定您无法在部分更新中使用PUT应用查询字符串参数。
考虑到这一点,有几种选择可以做你想要的,可以被认为是最佳实践:
您可以输出整个表示,更改要更新的状态值。换句话说,您的客户将发出GET,更改文档中的值,然后使用PUT将所有内容发回。
您可以修改仅将更改应用于状态值的差异文档。请查看json-patch以获取与PATCH方法兼容的数据格式示例。
您可以向仅执行所需更改的专用端点发出POST请求,但您必须记录如何使用它。 POST提交要由目标资源处理的有效负载,因此您可以使用它执行任何操作。
答案 1 :(得分:1)
是的,这是一个基于旧RFC的选项,但它已经过时了(参见rfc7231)。老实说,考虑PUTting或POST一个空体的资源的真实用法,我觉得很不寻常,只有查询参数和值。
据我所知,基本的RESTful架构包括使用HTTP谓词,调用资源端点以及创建/更新/删除该资源。 (请参阅@PedroWerneck的评论以获得进一步澄清)。
这基本上意味着您使用HTTP动词(即PUT),调用资源(tasks / abc)并向该资源发送一些数据以便对其进行修改:
PUT /tasks/abc
title=abc&body=aabbccddeeff&status=changedToSomethingElse
是用
创建的POST /tasks
title=abc&body=aabbcc&status=created