两者的区别:
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