两者的区别:
PATCH:更新部分资源,非幂等,非安全
PUT:更新整个资源,具有幂等性,非安全
注:
幂等性:多次请求的结果和请求一次的结果一样
安全性:请求不改变资源状态
举个两者明显区别的例子(我对两者定义的理解):
查询资源列表
request: GET /users response: [ { "id": 1 "name": "xx" "description": "test xx", "phone": "127" } ]
这时候提供个接口,支持修改名称和描述
第一种:接口的HTTP方法定义为PUT:
request: PUT /users/1 { "name": "yy" }
查询资源列表
request: GET /users response: [ { "id": 1 "name": "yy" "description": null, "phone": "127" } ]
第二种:接口的HTTP方法定义为PATCH:
request: PATCH /users/1 { "name": "yy" }
查询资源列表
request: GET /users response: [ { "id": 1 "name": "yy" "description": "test xx", "phone": "127" } ]
然后还有一个疑问:在上面的场景,PUT和PATCH都是具有幂等性的,为什么说PATCH非幂等的?
实际上,关于PATCH在定义中,还有另一种场景:通过PATCH发送一系列指令,并通过OP表示操作类型
PATCH /users [ { "op": "add", "path": "/", "value": { "name": "zz", "description": "test zz", "phone": "128" } }, { "op": "replace", "path": "/1", "value": { "name": "yy" } } ]
查询资源列表
request: GET /users response: [ { "id": 1 "name": "yy" "description": "test xx", "phone": "127" }, { "id": 2 "name": "zz" "description": "test zz", "phone": "128" } ]
op表示对资源的操作,总共有六种:add,replace,remove,move,copy,test
以上的例子都是按照PATCH与PUT的规定,进行举例,实际的的结果,是要根据代码逻辑来,就像有些人用POST方法去修改名称,只是说不规范,不是说不行。
参考:
https://stackoverflow.com/questions/28459418/rest-api-put-vs-patch-with-real-life-examples