PUT、POST 或 PATCH 请求最终有何不同?

How do PUT, POST or PATCH request differ ultimately?

通过 PUT/PATCH/POST 请求发送的数据最终进入数据库。

现在我们是插入新资源还是更新或修改现有资源 - 这完全取决于正在执行的数据库操作。

即使我们发送 POST 并最终只在数据库中执行更新,它根本不会影响任何地方,不是吗?!

因此,除了纯粹概念的观点之外,它们是否真的不同?

它们略有不同,并且绑定到不同的 REST 概念 API(基于 HTTP)

想象一下您有一些 Booking 实体。然后使用资源执行以下操作:

POST - 创建新资源。而且它不是幂等的——如果你两次发送相同的请求 -> 两个预订将被存储。第三次 - 将创造第三次。您正在根据每个请求更新您的数据库。

PUT - 更新资源的完整表示。这意味着 - 它用一个新的对象替换了预订的完整对象。而且它是幂等的——你可以发送一个请求十次结果都是一样的(如果资源在你的调用之间没有改变)

PATCH - 更新资源的某些部分。例如,您的预订实体有一个 date 属性 -> 您只更新这个 属性。例如,将现有的 date 替换为根据请求发送的 new date


However, for either of the above - who is deciding whether it is going to be a new resource creation or updating/modifying an existing one, it's the database operation or something equivalent to that which takes care of persistence

你在混合不同的东西。

持久层UI层 是两个不同的东西。

Java - Model View Controller.

使用的一般模式

REST API 有自己的概念。并且DB层有它自己的目的。请记住,将应用程序的工作分成几层恰恰是高内聚 - 当代码是 narrow-focused 并且只做一件事并且做得很好时。

主要是在回答,发了一些REST的概念。

关于应用程序应该做什么的主要决定 - create the new entity or update是开发人员。而这种决策通常是通过服务层完成的。还有许多其他因素可以完成,例如事务支持、从数据库执行数据过滤、分页等。

另外,还要看DB层是怎么实现的。如果使用带有 HIbernate 的 JPA 或使用 JDBC 模板,自定义查询执行...

这是关于发件人的意图,从我的角度来看,它在服务器端有不同的行为。

简而言之:

  • POST :在服务器上创建新数据条目(尤其是使用 REST)
  • PUT :更新服务器上的完整数据条目 (REST) 或创建新的数据条目(非 REST)。与 POST 请求的区别在于客户端指定服务器上的目标位置。
  • PATCH :客户端请求部分更新(给出了条目的Id和部分数据)。与 PUT 的区别在于客户端不会将完整数据发送回服务器,这可以节省带宽。

一般来说,您可以使用任何 HTTP 请求来存储数据(GET、HEAD、DELETE...),但对于特定和标准化的场景,通常的做法是使用 POST、PUT 和 PATCH。因为以后每个开发者都能看懂

Hence, do they actually differ - apart from a purely conceptual point of view?

语义 不同 - 消息的含义以及允许的通用组件假设正在进行的内容。

这些含义只是那些在 HTTP method registry. Today, that means that POST and PUT are described by HTTP semantics; PATCH 中列出的参考文献所描述的,由 RFC 5789 描述。

松散地:PUT 意味着请求内容是对某些资源的当前表示的建议替换——如果我们使用 HTTP 协议来执行此操作,这是我们用来上传或替换单个网页的方法.

PATCH 意味着请求内容是一个补丁文档——也就是说对某些资源的当前表示的建议编辑。因此,您可以不使用 PUT 发送整个 HTML 文档,而是发送对标题元素中拼写错误的修复。

POST 是...嗯,POST 是其他一切。

POST serves many useful purposes in HTTP, including the general purpose of “this action isn’t worth standardizing.” -- Fielding 2009

POST 方法对其语义的限制最少(这就是我们可以将其用于任何事情的原因),但结果是 HTTP 应用程序本身必须对其非常保守。

Webber 2011 很好地讨论了 HTTP 是一个 应用程序协议 .

这一事实的实现

Now whether we are inserting a new resource or updating or modifying an existing one - it all depends upon the database operation being carried out.

HTTP 方法告诉我们请求的含义 - 它不会对您的实现方式施加任何限制。

参见Fielding, 2002

HTTP does not attempt to require the results of a GET to be safe. What it does is require that the semantics of the operation be safe, and therefore it is a fault of the implementation, not the interface or the user of that interface, if anything happens as a result that causes loss of property (money, BTW, is considered property for the sake of this definition).

HTTP 方法是“通过网络传输文档”域的一部分 - 即它们是允许我们假装 bank/book store/cat 视频存档的外观的一部分实施只是另一个“网站”。