【发布时间】:2014-12-03 16:31:58
【问题描述】:
我正在创建一个 Web 客户端,其目的是通过向它们添加记录并从中删除记录来修改一组数据库表。它必须以原子方式进行,因此删除和插入都必须通过单个 HTTP 请求完成。显然,这是某种写操作,但我很难确定哪种方法合适。
POST 一开始似乎是对的,除了RFC 2616 specifies POST 请求必须描述指定资源的“新下属”。这不是我在这里所做的。
PUT 可用于对现有事物进行更改,因此这似乎是正确的,除了 RFC 2616 also specifies 指出“PUT 请求中的 URI 标识了请求中包含的实体 [.. .] 并且服务器不得尝试将请求应用于其他资源,”这会排除该方法,因为我的 URI 没有直接指定数据库表。
PATCH 似乎更接近了 - 现在我不是通过仅 部分 覆盖资源来作弊 - 但RFC 5789 makes it clear 这个方法,如 PUT,必须实际修改指定的资源通过 URI,而不是某个从属资源。
那我应该用什么方法呢?
或者,更广泛地说,为了其他用户的利益:
对于 X 的请求,你使用
但是如果要修改X的下属,应该使用什么方法呢?
【问题讨论】:
-
第一件事。如果您想使用正确的 HTTP 方法(如 Restfull 应用程序),则不应有一个请求涉及多个资源(如果您将表视为资源)。如果所有这些更新代表 1 个单一资源的 1 个单一更改,那么您应该使用 PUT
-
我认为从属资源是由多个表描述的聚合实体 - 它不是我可以指向的单一事物,而是位于数据库之上的概念抽象结构(通过为支持此抽象而编写的过程进行操作)。即使 URI 没有命名要更改的资源,您能否证明为什么 PUT 是正确的?
-
为了澄清一点,被修改的实际资源 - 特定的数据库抽象 - 由请求正文中的参数指定。因此,URI 绝对不是它的唯一标识符,而是标识进行少量预处理的请求处理程序。
-
@PlínioPantaleão 单个 REST 请求影响许多资源并没有错,只要它们通过单个逻辑资源这样做。请记住,客户端处理的表示与服务器实际存储数据的方式无关。
-
@thecoshman 这就是我在假设每个表都代表一个资源的情况下提出的原因。我知道这没有必要是真的,但这是我对问题的理解
标签: rest http http-method