是否 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 的东西很清楚。我的困惑源于决定什么是幂等性...

如果第一种情况成立,那么我希望 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 协议的语义和内容的文档:

4.2.2. Idempotent Methods

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.

请记住,从幂等性的角度来看,状态代码是不相关的。