首先,一些定义:
PUT在第9.6节RFC 2616中定义:
PUT方法请求将封闭实体存储在提供的请求URI下。如果请求URI引用已经存在的资源,则封闭实体应该被认为是驻留在源服务器上的版本的修改版本。如果请求URI没有指向现有资源,并且请求用户代理能够将该URI定义为新资源,则源服务器可以使用该URI创建资源。
PATCH在rfc5789中定义:
PATCH方法请求一系列变化中描述的请求实体应用于由请求标识的资源-URI。
同样根据RFC 2616第9.1.2节,PUT是幂等的,而PATCH不是。
现在让我们看一个真实的例子。当我用数据{username: 'skwee357', email: 'skwee357@domain.example'}
向/users
发送POST并且服务器能够创建资源时,它将响应201和资源位置(让我们假设/users/1
),并且任何下一次对GET/users/1
的调用都将返回{id: 1, username: 'skwee357', email: 'skwee357@domain.example'}
。
现在让我们假设我想修改我的电子邮件。电子邮件修改被认为是“一组更改”,因此我应该用“补丁文档”PATCH/users/1
。在我的情况下,它将是JSON文档:{email: 'skwee357@newdomain.example'}
。然后服务器返回200(假设权限正常)。这就带来了第一个问题:
PATCH是一个相对较新的动词(RFC于2010年3月推出),它用于解决“修补”或修改一组字段的问题。在PATCH推出之前,每个人都使用PUT来更新资源。但是在PATCH推出之后,我对PUT的用途感到困惑。这就引出了我的第二个(也是主要)问题: