在查看“petclinic”中的代码时,我注意到了 Spring 3.0 示例的一部分
<c:choose>
<c:when test="${owner.new}"><c:set var="method" value="post"/></c:when>
<c:otherwise><c:set var="method" value="put"/></c:otherwise>
</c:choose>
在 SO 的讨论中似乎 PUT 应该用于“创建/更新”,POST 用于“更新”。
哪个是对的?
将 post 用于“创建”和将 put 用于“更新”有什么影响?
注意:根据 HTTP/1.1 规范。在引用的 SO 讨论中引用,上面给出的代码似乎具有正确的行为。
最佳答案
根据 HTTP 规范,POST 和 PUT 都具有明确定义的行为。
POST 请求的结果应该是从属于请求 URL 的新资源;响应应包含带有新创建资源 URL 的 Location header 。
PUT 的结果应该是更新请求 URL 上的资源。如果请求 URL 中没有现有资源,则可以创建一个新资源。
混淆的起因是 POST 也与表单一起用作传递表单数据的机制。最常见的表单实现是回发到表单页面所在的同一 URL,从而给人一种错误的想法,即 POST 操作用于更新。但是,在这种特殊用法中,表单页面不是资源。
考虑到所有这些,这是正确的(当然在我看来 :-))用法:
在以下情况下应使用 POST 创建新资源:
- 新资源从属于现有资源
- 资源标识/URL 在创建时未知
PUT 应该用于更新具有众所周知的 URL 的现有资源。它也可以用于在众所周知的 URL 上创建资源;但是,以不同的方式考虑这种情况确实有帮助 - 如果资源 URL 在发出 PUT 请求之前已知,则可以将其视为与该位置已存在但为空的资源相同。
关于http - Put 与 Post - REST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3655505/