我对此很纳闷。
假设我有一个user
资源id
和name
字段。如果我想更新一个字段,我可以像这样对资源进行PATCH请求
PATCH /users/42
{"name": "john doe"}
然后应用程序将更新用户42的名称。
但是,如果我重复此请求,结果会有所不同吗?
根据RFC 5789
PATCH既不安全也不具有幂等性
我对此很纳闷。
假设我有一个user
资源id
和name
字段。如果我想更新一个字段,我可以像这样对资源进行PATCH请求
PATCH /users/42
{"name": "john doe"}
然后应用程序将更新用户42的名称。
但是,如果我重复此请求,结果会有所不同吗?
根据RFC 5789
PATCH既不安全也不具有幂等性
Answers:
PATCH请求可以是幂等的,但不是必须的。这就是为什么它被描述为非幂等的原因。
PATCH是否可以是幂等的,在很大程度上取决于如何传达所需的更改。
例如,如果补丁格式为{change: 'Name' from: 'benjamin franklin' to: 'john doe'}
,则第一个请求之后的任何PATCH请求都会具有与第一个请求不同的效果(失败响应)。
非等幂性的另一个原因可能是,将修改应用于原始资源以外的其他内容可能会使资源无效。如果您多次应用更改,情况也会如此。
<name>
元素。如果PATCH将<name>
元素添加到最初不包含元素的资源中,则两次应用PATCH(或将其应用到已经包含的资源中<name>
)会使资源无效,因为它会突然包含两个<name>
不允许的元素这样的资源。
PATCH
请求描述了将应用于资源的一组操作,如果将同一组操作两次应用于同一资源,则结果可能会不同。这是因为定义操作取决于您。换句话说,您必须定义合并规则。
请记住,PATCH
请求可以用于修补许多不同格式的资源,而不仅仅是JSON。
因此,如果将合并规则定义PATCH
为幂等,则请求可以是幂等的。
幂等示例:
// Original resource
{
name: 'Tito',
age: 32
}
// PATCH request
{
age: 33
}
// New resource
{
name: 'Tito',
age: 33
}
非等幂示例:
// Original resource
{
name: 'Tito',
age: 32
}
// PATCH request
{
$increment: 'age'
}
// New resource
{
name: 'Tito',
age: 33
}
在第二个示例中,我使用了“ Mongo like”语法,用于增加属性。显然,这不是幂等的,因为多次发送相同的请求每次都会导致不同的结果。
现在您可能想知道使用这种组合语法是否有效。根据标准,它是:
PUT和PATCH请求之间的差异反映在服务器处理封闭实体以修改由Request-URI标识的资源的方式上。在PUT请求中,封闭的实体被视为原始服务器上存储的资源的修改版本,并且客户端正在请求替换存储的版本。但是,对于PATCH,封闭的实体包含一组指令,这些指令描述了应如何修改当前驻留在源服务器上的资源以产生新版本。
您可能还想知道以这种方式使用请求是否很麻烦PATCH
,并且许多人认为它们不是,这是一个很好的答案,其中包含有关该问题的大量评论。
{"name": "bendjamin franklin"}