这两种方法都会修改现有资源,区别在于请求体的含义。PUT 请求体代表完整的新状态:原则上,省略的字段会被移除或重置。PATCH 请求体则描述了更改内容,格式由服务器决定——可以是部分对象,也可以是操作列表(例如 JSON Patch)。
根据定义,PUT 请求是幂等的:发送两次相同的完整表示会得到相同的结果。而 PATCH 请求则不一定幂等,因为像"append to this list"或"increment"这样的操作,执行两次与执行一次的结果不同。这就是为什么 PATCH 请求尤其需要 If-Match 机制的原因:它可以拒绝重试的 PATCH 请求,而不是重复发送。
这个 PATCH 请求实际上就是"PUT without the fields you did not change" 。很多 API 都这样实现,但方法本身并没有明确说明——合并式的 PATCH 请求和 JSON PATCH 文档都是 PATCH 请求,但语义截然不同。而且很多"PUT"接口实际上会进行合并而不是替换,所以务必测试一下你的接口在缺少某个字段的情况下会如何操作。
Pizza API 接受对 PATCH /pizza/v1/orders/{id}的部分更新,而 Protocol Lab 接受对 PATCH /protocol/v1/documents/{id}的 RFC 6902 JSON Patch;字符 PUT 端点替换并检查 If-Match。
所有术语 · 测试技巧 · 全部 39 个模拟 REST API
最后更新时间