在REST API中使用特定于对象成员的URL资源是否RESTful? 放置还是修补?

问题描述 投票:0回答:2

这是一个PUT vs 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将返回相同的对象,并且像上面的后续PUT一样不会更改任何内容),因为该资源特定于对象成员或者通过更改成员,我是否违反了幂等律?

如果第二个选项为true,并且URL不应特定于对象成员,那么我希望在代表整个对象的URL资源的成员上使用PATCH来更新特定的对象成员,如下所示:

补丁/booking/{id} *

{
    name: "Joe Schmoe"
}

我希望执行以下操作不是 RESTful的。 显然,它将破坏资源URL的幂等性。 让我知道我是否在这里弄错了。

PUT /booking/{id}

{
   name: "Joe Schmoe"
}
java rest put idempotent
2个回答
1
投票

就幂等性而言,它与响应有关。 在报价下方找到。

幂等HTTP方法是可以多次调用而没有不同结果的HTTP方法。 该方法仅被调用一次还是十次调用都没有关系。 结果应该是相同的。 从本质上讲,这意味着成功执行请求的结果与执行请求的次数无关。 例如,在算术中,将零加到数字上就是幂等运算。

请参阅下面的链接。 https://restfulapi.net/idempotent-rest-apis/

您也可以参考此链接中的表格。 https://www.ably.io/concepts/idempotency

它清楚地显示了与http方法的幂等性。


1
投票

首先,请记住, 幂等性是HTTP方法的属性(而不是资源的属性)。 引用RFC 7231 ,它是当前定义HTTP / 1.1协议的语义和内容的文档:

4.2.2。 幂等方法

如果使用该方法的多个相同请求在服务器上的预期效果与单个此类请求的效果相同,则该请求方法被视为“幂等” 。 在本规范定义的请求方法中, PUTDELETE和安全请求方法是幂等的。 [...]

请看我以前的答案,以了解有关幂等性的更多详细信息。

因此,具有幂等HTTP方法的请求可以多次执行,并且在服务器中将产生相同的效果 。 即使资源具有多个标识符 ,也可以将效果理解为服务器上资源状态

请记住,从幂等的角度来看,状态代码并不重要。

© www.soinside.com 2019 - 2024. All rights reserved.