是否 RESTful 在 REST API 中使用 URL 特定于 object 成员的资源?放还是补丁?
Is it RESTful to use URL resources specific to object members in REST APIs? PUT or PATCH?
这是一个 PUT 与 PATCH 的问题。问题标题换句话说:通常,object 的 URL 存在于 /object/{id}
。添加 URL /object/{id}/member
并在该特定成员上调用 PUT 是否仍然是幂等的?
最小示例
如果我有名为 Booking
的资源,看起来像这样
public class Booking {
private bookingId;
private name;
}
//accessors ...
我认为 PUT 和 PATCH 的东西很清楚。我的困惑源于决定什么是幂等性...
- 给定响应的幂等性 URL? 选项 1
- 基础数据的幂等性 objects (Java) 而不是成员? 选项 2
如果第一种情况成立,那么我希望 RESTful 像这样创建对 Booking 的 object 成员的特定调用:
在此处放置/booking/{id}/name
灰色区域? (通常是 booking/{id}
的补丁操作)
{
name: "Joe Schmoe"
}
在这种情况下,基础 object 已被更改,但资源保持幂等(此处的 GET 将 return 与上面相同,后续的 PUT 不会改变任何东西),因为资源特定于 object 成员? 或者修改一个成员,我是不是违反了幂等律?
如果第二个选项为真,并且 URLs 不应特定于 object 成员,那么我希望在 URL 资源的成员上使用 PATCH表示整个 object 以更新特定 object 成员,如下所示:
补丁/booking/{id}
*
{
name: "Joe Schmoe"
}
我希望不 RESTful 执行以下操作。它显然会破坏资源 URL 处的幂等性。如果我在这里弄错了,请告诉我。
放置/booking/{id}
{
name: "Joe Schmoe"
}
首先,请记住 幂等性 是 HTTP 方法的 属性(而不是资源的 属性)。引用 RFC 7231,这是当前定义 HTTP/1.1 协议的语义和内容的文档:
A request method is considered "idempotent" if the intended effect on the server of multiple identical requests with that method is the same as the effect for a single such request. Of the request methods defined by this specification, PUT
, DELETE
, and safe request methods are idempotent. [...]
查看 了解更多有关 幂等性 的详细信息。
因此可以多次执行具有幂等 HTTP 方法的请求,并在服务器中产生相同的效果。将效果理解为服务器上资源的状态,即使一个资源有多个identifiers.
请记住,从幂等性的角度来看,状态代码是不相关的。
这是一个 PUT 与 PATCH 的问题。问题标题换句话说:通常,object 的 URL 存在于 /object/{id}
。添加 URL /object/{id}/member
并在该特定成员上调用 PUT 是否仍然是幂等的?
最小示例
如果我有名为 Booking
的资源,看起来像这样
public class Booking {
private bookingId;
private name;
}
//accessors ...
我认为 PUT 和 PATCH 的东西很清楚。我的困惑源于决定什么是幂等性...
- 给定响应的幂等性 URL? 选项 1
- 基础数据的幂等性 objects (Java) 而不是成员? 选项 2
如果第一种情况成立,那么我希望 RESTful 像这样创建对 Booking 的 object 成员的特定调用:
在此处放置/booking/{id}/name
灰色区域? (通常是 booking/{id}
的补丁操作)
{
name: "Joe Schmoe"
}
在这种情况下,基础 object 已被更改,但资源保持幂等(此处的 GET 将 return 与上面相同,后续的 PUT 不会改变任何东西),因为资源特定于 object 成员? 或者修改一个成员,我是不是违反了幂等律?
如果第二个选项为真,并且 URLs 不应特定于 object 成员,那么我希望在 URL 资源的成员上使用 PATCH表示整个 object 以更新特定 object 成员,如下所示:
补丁/booking/{id}
*
{
name: "Joe Schmoe"
}
我希望不 RESTful 执行以下操作。它显然会破坏资源 URL 处的幂等性。如果我在这里弄错了,请告诉我。
放置/booking/{id}
{
name: "Joe Schmoe"
}
首先,请记住 幂等性 是 HTTP 方法的 属性(而不是资源的 属性)。引用 RFC 7231,这是当前定义 HTTP/1.1 协议的语义和内容的文档:
A request method is considered "idempotent" if the intended effect on the server of multiple identical requests with that method is the same as the effect for a single such request. Of the request methods defined by this specification,
PUT
,DELETE
, and safe request methods are idempotent. [...]
查看
因此可以多次执行具有幂等 HTTP 方法的请求,并在服务器中产生相同的效果。将效果理解为服务器上资源的状态,即使一个资源有多个identifiers.
请记住,从幂等性的角度来看,状态代码是不相关的。