我应该使用哪个 HTTP 动词来声明和锁定作业队列中的项目?

Which HTTP Verb should I use to claim and lock an item in a job queue?

我计划使用 HTTP REST 接口连接到作业控制服务。

一个关键操作是请求计算作业。

稍后,当调用者处理完作业时,它将通过另一个 REST 调用发回结果。

我倾向于对每个操作使用 PUT,因为没有创建新记录;两种情况都在更新。

这样合适吗?第一个 PUT return 一个带有作业数据的大 JSON 负载还是只是 return 一个 HTTP 状态?我是否应该改用 POST,即使我没有创建记录,只是更新它?

我会在第一个操作中使用 GET,但 GET 不应该更改服务上的任何对象,我正在锁定它,这是一个更改。在 GET 请求中锁定记录是否可接受?

Which HTTP Verb should I use to claim and lock an item in a job queue?

关键思想:REST API 是一个外观 - 您的 application/service 假装是一个 HTTP 兼容的文档存储。所有发生的有趣事情都是由修改文档引发的副作用。参见 Jim Webber, 2011

考虑到这一点...

POST 没问题。 It's okay to use POST.

PUT/PATCH 适合远程创作;客户端获取您的资源表示,对其本地副本进行编辑,然后向您发送表示的副本 (PUT) 或描述更改的补丁文档 (PATCH)。服务器然后可以将这些编辑应用到它的副本,也可以不应用。

因此,对于您的具体示例,我希望客户端 GET 您的资源的表示,将该表示中的信息从解锁更改为锁定,然后将更改后的表示放回您的服务器.您的服务器应该更新您的表示副本以匹配。

它可能会让您想起声明式风格 - 客户端告诉服务器表示应该是什么样子,然后由服务器决定如何做。

为完整性而包含,不推荐:

HTTP method registry also includes a method LOCK, with a corresponding UNLOCK. The semantics for these method tokens are defined by the WebDAV规范。如果您对 LOCK 的含义与 WebDAV 的含义相匹配,那么使用它可能是一个答案。请注意,该规范包括

之类的注释

Any resource that supports the LOCK method MUST, at minimum, support the XML request and response formats defined herein.

除非您已经处于 space 人们期望能够使用通用 WebDAV 客户端与您的 API 进行交互的状态,否则这可能不太合适。

HTTP 方法注册表是 extendable。因此,您可以定义自己的方法标记的语义,然后推动将其作为标准采用。