在执行get时删除某些内容是RESTfull吗?

在执行get时删除某些内容是RESTfull吗?,rest,http,web,restful-architecture,Rest,Http,Web,Restful Architecture,答案当然是否定的,所以要理解我的意思,请让我解释一下 我们有一个服务,客户机POSTs要执行的作业,但它们在发布时不执行。相反,我们的服务使用一个ID进行响应,客户端可以使用该ID通过GET执行作业 现在,当作业被执行时,它也被删除,并且该作业不再可用 从我对RESTfull架构的理解来看,我们的实现不符合REST的思想 所以我想知道的是,如果我们没有RESTfull,我们应该如何重新设计,使我们成为RESTfull?是否只是将我们的GET更改为POST(我不相信,因为我们正在删除某项(作业))

答案当然是否定的,所以要理解我的意思,请让我解释一下

我们有一个服务,客户机
POST
s要执行的作业,但它们在发布时不执行。相反,我们的服务使用一个ID进行响应,客户端可以使用该ID通过
GET
执行
作业

现在,当作业被执行时,它也被删除,并且该作业不再可用

从我对RESTfull架构的理解来看,我们的实现不符合REST的思想

所以我想知道的是,如果我们没有RESTfull,我们应该如何重新设计,使我们成为RESTfull?是否只是将我们的
GET
更改为
POST
(我不相信,因为我们正在删除某项(作业)),同时
DELETE
似乎也很奇怪,因为我们正在执行
作业

对于
job
我的意思是,我们正在从数据库提供可能大量的数据

我们的服务使用一个ID进行响应,客户端可以使用该ID通过GET执行作业

听起来不太舒服。客户端应该
放入作业资源,也许可以将作业状态设置为
执行

PUT /jobs/1234
{
   "status": "execute"
}

200 OK
客户端稍后可以
获取作业资源以检查状态。可能稍后状态将更改为
已完成

GET /jobs/1234

200 OK
{
   "id": 1234,
   "status": "completed",
   "quizzle": "smooth"
}
如果在一段时间后,系统的某个不同部分删除了
已完成的
作业,则
获取
作业资源将导致
410消失

GET /jobs/1234

410 Gone

不,不要通过get执行作业。如果作业已执行且有人试图再次发布,则返回一个
422不可处理实体
,并说明作业已运行。如果你真的必须这样做,你可以删除第二篇文章中的工作。最好让客户机决定是否/何时删除作业

send up a job:
POST /jobs
{ .. }

execute a job:
POST /executed-jobs
==> { "jobId": 12345 }
<== { "expectedCompletionTime": "<timestamp>" }
发送作业:
职位/职位
{ .. }
执行作业:
后/执行作业
==>{“作业ID”:12345}

RESTfull是一个很好的讨论,其背后的主要概念是使用URI表示资源,使用HTTP动词表示操作。我将提出以下三种解决方案,从我认为最优先的到最少的

  • 您可以执行补丁请求,这将更改作业中的一个字段(即状态从等待更改为运行),这将在后端触发信号并启动作业。后续补丁请求可能会返回400或409响应代码
  • 您可以对/jobs/:job_id/execute/执行POST请求,它将开始执行作业。答复可以如上所述
  • 您可以为GET请求添加一个副作用—这是您的作业执行—这将在第一次调用它时将状态更改为正在执行

  • 希望这能有所帮助,这是一个很好的讨论话题:)

    2和3不安静。2在URL中使用动词(execute)。3使GET变得非幂等且不安全。感谢Eric的更正,尽管在这种情况下,完全RESTfull并不总是最简单的方法。这就是为什么我从最喜欢的答案(1)开始。我对这个解决方案的担心是你把工作和工作结果混为一谈在一个资源中。如果有一个新的要求作业运行多次,该怎么办?您需要使执行数据成为作业的内部JSON数组的一部分。这是一个有效点。我的假设是一个作业只能运行一次。如果以后创建了一个具有相同参数的作业,则它是另一个作业。@Tichodroma您的假设是正确的。我们的问题是,我们不希望将结果存储在服务器上(第二次,因为它在我们的数据库中可用,这将是资源密集型的)。因此,我们需要获取数据,一旦检索到数据,它就不应该被访问(您建议的410似乎很好)。我们应该使用PUT还是POST?我只想参考一下这个帖子:这个问题似乎与StackOverflow无关。他正在寻求重新设计方面的帮助。。。这看起来很像堆栈溢出,我认为您没有删除作业,作业的资源表示不是作业本身,而是作业执行状态。我的猜测是,您不需要删除作业的执行状态,因此使用POST是合适的。推杆也可以起作用。