http - Put 与 Post - REST

标签 http rest crud

在查看“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/

相关文章:

android - Fehler(错误)6 - 无法加载请求的项目

json - 使用 crate 的 HTTP API 插入对象数组 : error 4003

api - 使用 API key 开发服务(起点)

java - Spring 中对版本化实体的 ETag 支持

javascript - Yodlee REST API - 添加新用户时出错 "Exception Occurred"

PHP/SQL - 使用 Select 元素显示/链接到数据库中的行

http - 为什么 Content-MD5 header 采用 base64 编码?

java - 唯一注释@GenerateValue

java - 多对一关系的未知实体错误

python - urllib2 POST进度监控