这是一个PUT与PATCH的问题。换句话说,问题标题:通常,基础对象的 URL 存在于/object/{id}
处。添加 URL/object/{id}/member
并在该特定成员上调用 PUT 是否仍然幂等?
最小示例
如果我有名为Booking
的资源,如下所示
public class Booking {
private bookingId;
private name;
}
//accessors ...
我认为PUT和PATCH的东西很清楚。我的困惑源于决定幂等性指的是什么......
- 对给定 URL 的响应的幂等性?选项 1
- 基础数据对象 (Java( 的幂等性而不是成员?选项 2
如果第一种情况为真,那么我希望像这样创建对 Booking 的对象成员的特定调用是 RESTful:
把/booking/{id}/name
灰色地带放在这里?(通常是booking/{id}
的补丁操作(
{
name: "Joe Schmoe"
}
在这种情况下,基础对象已更改,但资源保持幂等(此处的 GET 将返回相同的内容,并且像上面这样的后续 PAT 不会更改任何内容(,因为资源特定于对象成员?或者通过更改成员,我是否违反了幂等法?
如果第二个选项为 true,并且 URL 不应特定于对象成员,那么我希望在代表整个对象的 URL 资源上的成员上使用 PATCH 来更新特定的对象成员,如下所示:
补丁/booking/{id}
*
{
name: "Joe Schmoe"
}
我希望执行以下操作不会休息。它显然会破坏资源 URL 的幂等性。如果我在这里弄错了,请告诉我。
放/booking/{id}
{
name: "Joe Schmoe"
}
首先,请记住,幂等性是HTTP方法的属性(而不是资源的属性(。引用RFC 7231,这是当前定义HTTP/1.1协议语义和内容的文档:
4.2.2. 幂等方法
如果使用该方法的多个相同请求对服务器产生的预期效果与单个此类请求的效果相同,则请求方法被视为"幂等"。在此规范定义的请求方法中,
PUT
、DELETE
和安全请求方法是幂等的。[...]
看看我之前的回答,了解有关什么是幂等性的更多详细信息。
因此,使用幂等HTTP方法的请求可以多次执行,并且在服务器中会产生相同的效果。将效果理解为服务器上资源的状态,即使资源具有多个标识符也是如此。
请记住,从幂等性的角度来看,状态代码无关紧要。