我可以在 Http Patch 方法中使用查询参数吗?

use*_*825 1 rest

我可以在 Rest API 的 http PATCH 方法中使用查询参数,而不是发送部分请求正文吗?

  1. 我想避免在发送方和接收方中维护请求类的开销。

  2. 我只想更新 1 个字段。

Voi*_*son 6

我可以在 Rest API 的 http PATCH 方法中使用查询参数,而不是发送部分请求正文吗?

是的,但可能不是你的意思。

PATCH /a?b=c HTTP/2.0
Content-Type: application/merge-patch+json

{ "y": "z"}
Run Code Online (Sandbox Code Playgroud)

是一个完全令人满意的 HTTP 请求。它说“找到由 /a?b=c 标识的文档,并将 RFC 7386 指定的合并补丁应用于该文档。”

请注意:这里的“查询参数”是标识应该应用补丁的文档的一部分,并没有以任何方式描述应该应用的补丁。


你不应该做的事情:

PATCH /a?b=c
Run Code Online (Sandbox Code Playgroud)

作为尝试/a通过将“b”更新为值“c”来进行修改。这里的基本问题是您正在为具有标准化含义的请求创建新含义,因此当有人尝试使用通用组件访问您的 API 时,可能会出现混淆。

在您的 API 仅由您控制的前端使用的情况下(例如,仅通过从您的 Web 服务器下载的 Java 脚本客户端调用),并且如果您不需要使用任何中间组件(例如 Web 缓存) ) 在中间,那么你可能会侥幸逃脱。

如果您查看HTTP 缓存失效,您将看到PATCH /a?b=c它不会使通过 获取的缓存表示失效GET /a,因为目标 uri 不匹配。


jac*_*646 0

答案似乎是否定的

来自 RFC,(强调我的)

PATCH 方法请求将请求实体中描述的一组更改应用于资源...

来自火狐

请求有正文:是

另一个证实的参考文献W3 PATCH提到了标头的必要性Content-Length