当我们对所有人使用存储库保存方法时,使用 PATCH、POST、PUT 类型有什么意义?

What is the point of having PATCH, POST, PUT types when we use repository save methods for all?

作为spring的新手,我想知道两者之间的实际区别:-

@PostMapping
@PutMapping
@PatchMapping

我的理解是 PUT 用于更新,但我们必须通过其 id 获取元素,然后 save() 它。类似地,Post 再次使用 save() 方法,它自动替换为其标识符 (PRIMARY)。在我的应用程序中,我可以交替使用其中三种方法。

POST用于创建一个全新的对象。

PUT 将一次性替换所有对象属性。
将 属性 留空将清空数据存储中的值。

PATCH 对对象进行部分更新。 您可以只发送应该更新的属性。 包含所有对象属性的 PATCH 请求与 POST 请求具有相同的效果。但它们并不相同。

HTTP 方法不是特定于 Spring 的约定,而是 REST API 规范的主要支柱。

他们确保请求的意图明确,并且提供者和消费者都同意最终结果。
有点像我们汽车中的踏板或变速杆。当它们都以相同的方式工作时,事情就容易多了。
切换它们可能会导致很多事故。

对于作为开发人员的我们来说,这意味着我们可以期望大多数 REST API 以类似的方式运行,假设 API 是根据或相当接近规范实现的。

POST/PUT/PATCH 可能看起来很相似,但存在细微差别。 正如您提到的 PUT 和 PATCH 方法需要更新对象的某种 ID。

在组合 POST/PUT/PATCH 端点的示例中,发送带有对象的请求,省略了它的一些属性。 API 有何反应?

  1. 仅更新​​收到的属性。
  2. 更新整个对象,清空省略的属性。
  3. 尝试创建新对象。

端点的消费者如何知道服务器执行了三个操作中的哪一个?

这是 HTTP 方法和 specification/convention 帮助确定适当的操作过程的地方。

Spring 可以促进可以处理创建、更新和部分更新的保存方法。但是对于 Java 或其他语言的其他框架就不一定了。

此外,您的应用程序现在可能足够简单,可以在同一控制器方法中处理 POST/PUT/PATCH。 但随着时间的推移,随着您的应用程序变得越来越复杂,关注点分离会使您的代码更加清晰、可读性和可维护性更高。

What is the point of having PATCH, POST, PUT types when we use repository save methods for all?

HTTP 方法标记用于定义 request semantics 通用组件(浏览器、反向代理等)可以利用信息来做智能事情。

其中最简单的是 PUT 具有 idempotent 语义;如果 HTTP 响应丢失,通用组件知道它可以自主重试发送请求。这反过来又让你在不可靠的网络上“免费”获得一点额外的可靠性。

您的源服务器对每个服务器使用相同的持久性机制这一事实是一个实现细节,是故意隐藏在“统一接口”后面的东西。

PATCH 和 POST 之间的区别很微妙; PATCH 为您提供了一种明确的方式来指定所包含的实体是补丁文档,并提供了一种机制来发现原始服务器可以理解哪些补丁文档格式,而这两种格式都不是您单独从 POST 获得的。

不太清楚的是,至少对我来说,PATCH 语义是否允许中间组件对请求做一些智能的事情——换句话说,额外的约束(相对于 POST)是否允许中介做些有趣的事吗?

据我所知,PATCH 请求的语义更具体,但 actionably 没有更具体——当然不像我们在安全的情况下那样明显或幂等请求语义。