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
我有多个服务器,我正在构建一个应用程序来控制它们、检查它们的状态等。我想创建一个允许我打开服务器的端点 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