Api 如何在REST中处理自定义操作?
我的api有一个包含状态属性的作业资源。作业的状态可以是“计划”、“处理”或“完成”。作业状态由服务器端确定。当作业状态为“正在处理”且ETL过程在服务器端运行时 我希望客户端能够触发像“开始”这样的操作,将作业状态设置为“处理”,或者触发“停止”操作,将作业状态重置为“计划” 我这里的问题是,我应该如何在REST中处理这些“自定义”操作 我认为有两种可能的办法:Api 如何在REST中处理自定义操作?,api,rest,Api,Rest,我的api有一个包含状态属性的作业资源。作业的状态可以是“计划”、“处理”或“完成”。作业状态由服务器端确定。当作业状态为“正在处理”且ETL过程在服务器端运行时 我希望客户端能够触发像“开始”这样的操作,将作业状态设置为“处理”,或者触发“停止”操作,将作业状态重置为“计划” 我这里的问题是,我应该如何在REST中处理这些“自定义”操作 我认为有两种可能的办法: 我可以创建两个新端点 POST/job/:id/start POST/job/:id/stop 我可以创建一个端点,该端点采用操
- 我可以创建两个新端点
POST/job/:id/start
POST/job/:id/stop
- 我可以创建一个端点,该端点采用操作查询参数。
POST/job/:id?action=start
POST/job/:id?action=stop
另外,我不确定响应代码应该是什么?我猜是以下几种情况之一:
200(好)
,202(接受)
,204(无内容)
,但不确定哪种是最好的。例如,如果api返回200响应,那么响应主体是否应该包含具有更新状态的作业资源?或者,api应该只返回204无内容吗?REST不关心业务逻辑,只关心资源-因此最RESTful的方法是将发送的文档放入/job/:id
,其中将包含新状态
虽然从技术上讲是“正确”的解决方案(不要告诉Roy Fielding),但我更喜欢显式的“操作”,如/job/:id/start
,因为它允许我的资源返回指向这些操作的链接,告诉客户是否可以采取适当的操作(例如,获取“已停止”的作业将包含启动该作业的链接)
在HTTP状态码的基础上,当我对结果不感兴趣时,我通常返回204,尽管在您的情况下,带有更新资源的200是正确的-只有当您e。G“启动”一个已经启动但未修改的作业从客户端的角度来看是正确的,因为状态不会改变
如果启动作业对资源没有直接影响,我会选择202 Accepted,因为作业将是e。G已排队,仅在稍后更新,以便客户端知道异步操作已启动。感谢您发布这样一个详细的答案!我想和你一样,我更喜欢使用明确的“动作”。在这种情况下,客户端是否只是将一个空的主体发布到
/job/:id/start
?就我的解决方案而言,操作从来没有任何主体,所以是空的发布