REST API 命令设计

REST API design for commands

我有多个服务器,我正在构建一个应用程序来控制它们、检查它们的状态等。我想创建一个允许我打开服务器的端点 on/off,但是,我不确定如何正确设计 REST API.

目前,假设我有一个 Server 资源,控制它的端点是 /api/servers/{id}/start/api/server/{id}/stop。只需发送一个空的 POST 请求即可打开和关闭服务器。

这很好用,但我不确定它是否是 API 的简洁设计。我找不到关于此主题的任何建议。

在这种情况下,您会推荐什么方法?

谢谢!

This works fine, but I'm not sure whether it is a clean design of the API. I haven't been able to find any recommendations on this topic.

很好,但可能会更好。

简短版本:与其 POST 向专门资源发送空消息,不如 POST 向您希望更改的资源发送详细消息。

长版:任何时候你想知道在 REST 中做什么,正确的起点是考虑你将如何用普通的旧网页来做。

在网络上,您会打开一个包含不同服务器列表的页面;这些服务器中的每一个都可能有某种状态指示器,并且 links 用于您可能想要进行的每个更改。接下来 link 将带您进入一个表单,该表单可能 pre-populated 包含数据。您可以更改任何必要的默认值,然后提交表单,浏览器将创建 HTTP 请求,告诉 Web 服务器重新启动服务器 #7 或其他任何内容。多田

请注意,浏览器和人类都不需要事先知道要使用哪个 URI,因为该信息包含在网页的表示中。浏览器需要知道 link 是如何工作的,以及表单是如何工作的。人类需要知道要遵循哪个 link,以及如何解释表单中的输入控件,但决定标识符是什么、什么是什么的是服务器key/value 对应该在请求正文中使用,依此类推。

鉴于此,您如何确定表单操作的目标应该是什么?一种可能的答案是考虑缓存的含义。 RFC 7234 表示成功的 POST 将 invalidate target-uri 的任何缓存表示。因此,如果您 POST 对您希望被请求更改的网页的请求,那么您将“免费”获得适当的缓存行为。

缓存失效规则不灵活 - 它们旨在支持常见情况。如果您有许多缓存页面将被请求更改,那么您需要选择其中最重要的更新页面。


将这些想法与您的案例相匹配:您的表单更改的最重要的文档可能是 /api/servers/{id},因此该文档应该是您提交表单的目标

POST /api/servers/1
Content-Type: text/plain

STOP
POST /api/servers/1
Content-Type: text/plain

START