Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Api 如何在REST中处理自定义操作?_Api_Rest - Fatal编程技术网

Api 如何在REST中处理自定义操作?

Api 如何在REST中处理自定义操作?,api,rest,Api,Rest,我的api有一个包含状态属性的作业资源。作业的状态可以是“计划”、“处理”或“完成”。作业状态由服务器端确定。当作业状态为“正在处理”且ETL过程在服务器端运行时 我希望客户端能够触发像“开始”这样的操作,将作业状态设置为“处理”,或者触发“停止”操作,将作业状态重置为“计划” 我这里的问题是,我应该如何在REST中处理这些“自定义”操作 我认为有两种可能的办法: 我可以创建两个新端点 POST/job/:id/start POST/job/:id/stop 我可以创建一个端点,该端点采用操

我的api有一个包含状态属性的作业资源。作业的状态可以是“计划”、“处理”或“完成”。作业状态由服务器端确定。当作业状态为“正在处理”且ETL过程在服务器端运行时

我希望客户端能够触发像“开始”这样的操作,将作业状态设置为“处理”,或者触发“停止”操作,将作业状态重置为“计划”

我这里的问题是,我应该如何在REST中处理这些“自定义”操作

我认为有两种可能的办法:

  • 我可以创建两个新端点
    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
?就我的解决方案而言,操作从来没有任何主体,所以是空的发布