Rest HTTP-GET for';背景';创造和获得就业机会

Rest HTTP-GET for';背景';创造和获得就业机会,rest,django-rest-framework,Rest,Django Rest Framework,我正在为作业调度程序设计API。有一个调度器,其中包含一组资源和数据库表。此外,还有多个“工作者”向调度程序请求“作业”。工作人员无法创建作业,只能请求它。作业必须在服务器端计算。作业也是一个动态实体,使用多个DB表和时间进行计算。没有“作业”表 一般来说,该系统与任务队列非常相似。但是没有排队。我需要一个工人请求下一个任务的方法。应为此代理计算并分配该任务 是否可以使用GET动词来检索和“锁定”特定工作人员的作业? 就资源而言,此查询不会修改任何内容。仅更新内部数据库状态。对于客户端来说,它看

我正在为作业调度程序设计API。有一个调度器,其中包含一组资源和数据库表。此外,还有多个“工作者”向调度程序请求“作业”。工作人员无法创建作业,只能请求它。作业必须在服务器端计算。作业也是一个动态实体,使用多个DB表和时间进行计算。没有“作业”表

一般来说,该系统与任务队列非常相似。但是没有排队。我需要一个工人请求下一个任务的方法。应为此代理计算并分配该任务

是否可以使用
GET
动词来检索和“锁定”特定工作人员的作业? 就资源而言,此查询不会修改任何内容。仅更新内部数据库状态。对于客户端来说,它看起来像是一个接一个地获取记录。它不知道内部修改

在纯REST风格中,我可能应该为它定义一个作业表和CRUDAPI。然后我需要创建一些辅助服务来
作业发布到该表中。然后,每个代理将使用
GET
列出作业,然后使用补丁将其锁定。由于竞争条件,该方法需要多次潜在重试。(作业可能已被其他代理锁定)。另外,如果需要根据服务器端逻辑将作业分配给特定的代理,则看起来有点复杂。在这种情况下,我需要在客户端实现一些检查逻辑,以根据不同的响应迭代作业

这种方法看起来很复杂

可以使用GET动词来检索和“锁定”特定工作人员的作业吗

也许吧?但可能不是

关于
GET
需要了解的重要一点是

区分安全和不安全方法的目的是 允许自动检索过程(spider)和缓存性能 优化(预取)可以在不担心造成伤害的情况下工作。在里面 此外,它允许用户代理对应用程序应用适当的约束 在处理潜在风险时自动使用不安全的方法 不受信任的内容

如果积极的缓存性能优化会在系统中造成混乱,那么
GET
不是您想要触发该行为的http方法

如果您是围绕资源设计客户机交互,那么您可能会有一些类似于分配给工作人员的作业列表的内容。读取该资源的当前表示形式并不需要服务器更改它,因此
GET
是完全合适的。当然,服务器可以随时出于自身原因更新该资源

修改该资源的请求不应是安全的。例如,如果客户机要发出某项作业已完成的信号,则应通过不安全的方法(POST/PUT/PATCH/DELETE/…)完成

我没有这样的资源。这是一个分布在桌子上的ephymeric资源。没有用于该作业的DB表,也没有用于更新该作业的ID列。这是另一个问题,为什么我没有这样的表,但它是当前的要求和限制

很公平,尽管主要教训仍然存在

另一种思考方式是思考失败。这个在分布式环境中,客户端无法区分丢失的请求和丢失的响应。它所知道的只是没有收到对请求的确认

当您使用
GET
时,您是在含蓄地告诉客户端重新发送请求是安全的(这个词又出现了)。不仅如此,您还隐式地告诉任何中间组件重复请求是安全的

如果对处理同一请求的多个副本没有不利影响,则
GET
可以。但是,如果处理同一请求的多个副本的成本很高,那么您可能应该使用
POST


不要求
GET
处理程序是安全的——标准只描述消息的语义;它根本不限制实现。但是,任何发生的问题都应被正确理解为服务器的责任。

这基本上归结为给出的相同答案。谢谢,这是我的答案。据我所知,这没关系。>然后你可能会有一个类似于分配给工人的工作列表的东西,这是问题的主要原因。我没有这样的资源。这是一个ephymeric资源,分布在各个表中。没有用于该作业的DB表,也没有用于更新该作业的ID列。这是另一个问题,为什么我没有这样的表格,但它是当前的要求和限制;看看更新是否有助于澄清问题。