HTTP 中的 POST 和 PUT 有什么区别?

2024-03-07

背景资料分析:

根据RFC 2616,第 9.5 节 https://www.rfc-editor.org/rfc/rfc2616#section-9.5, POST习惯于create资源:

POST 方法用于请求源服务器接受请求中包含的实体,作为请求行中的请求 URI 标识的资源的新下属。

根据RFC 2616,第 9.6 节 https://www.rfc-editor.org/rfc/rfc2616#section-9.6, PUT习惯于创建或替换资源:

PUT 方法请求将所包含的实体存储在提供的 Request-URI 下。如果 Request-URI 引用一个已经存在的资源,则所包含的实体应该被视为驻留在源服务器上的实体的修改版本。如果请求 URI 不指向现有资源,并且该 URI 能够被请求用户代理定义为新资源,则源服务器可以使用该 URI 创建资源。

我的问题:

那么,应该使用哪种 HTTP 方法来创建资源呢?或者两者都应该支持?


Overall:

PUT 和 POST 都可以用于创建。

您必须问“您正在对什么执行操作?”,以区分您应该使用什么。假设您正在设计一个用于提问的 API。如果您想使用 POST,那么您可以对问题列表执行此操作。如果您想使用 PUT,那么您可以对特定问题执行此操作。

太好了,两者都可以使用,那么我应该在 RESTful 设计中使用哪一个:

您不需要同时支持 PUT 和 POST。

您使用哪个取决于您。但请记住根据您在请求中引用的对象来使用正确的对象。

一些注意事项:

  • 您是否明确命名创建的 URL 对象,还是让服务器决定?如果您命名它们,则使用 PUT。如果让服务器决定,则使用 POST。
  • PUT 被定义为假定幂等性,因此如果您将一个对象 PUT 两次,它应该不会产生额外的效果。这是一个很好的属性,所以我会尽可能使用 PUT。只需确保 PUT 幂等性实际上在服务器中正确实现即可。
  • 您可以使用具有相同对象 URL 的 PUT 更新或创建资源
  • 使用 POST,您可以同时收到 2 个请求来修改 URL,并且它们可能会更新对象的不同部分。

一个例子:

我写了以下内容作为关于此问题的另一个答案 https://stackoverflow.com/questions/256349/what-are-the-best-common-restful-url-verbs-and-actions/256359#256359:

POST:

用于修改和更新资源

POST /questions/<existing_question> HTTP/1.1
Host: www.example.com/

请注意,以下内容是错误的:

POST /questions/<new_question> HTTP/1.1
Host: www.example.com/

如果尚未创建 URL,您 不应该使用 POST 来创建它 指定名称时。这应该 导致“找不到资源”错误 因为<new_question>不存在 然而。你应该把<new_question>首先在服务器上获取资源。

你虽然可以做类似的事情 使用 POST 创建资源:

POST /questions HTTP/1.1
Host: www.example.com/

请注意,在这种情况下,资源 未指定名称,新对象 URL 路径将返回给您。

PUT:

用于创建资源,或 覆盖它。当您指定 资源新 URL。

对于新资源:

PUT /questions/<new_question> HTTP/1.1
Host: www.example.com/

要覆盖现有资源:

PUT /questions/<existing_question> HTTP/1.1
Host: www.example.com/

另外,更简洁一点的是,RFC 7231 第 4.3.4 节 PUT https://www.rfc-editor.org/rfc/rfc7231#section-4.3.4状态(强调),

4.3.4.放

PUT 方法请求目标资源的状态为created or replaced具有由表示定义的状态 包含在请求消息有效负载中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTP 中的 POST 和 PUT 有什么区别? 的相关文章

  • 如何设计导出端点的REST API?

    我正在设计 REST API 并遇到设计问题 我有alerts我希望用户能够export为少数文件格式之一 所以我们已经开始执行操作 命令了export 感觉像是 RPC 而不是 REST 此外 我不想采用默认的文件格式 相反 我想要求提供
  • Perl:读取网页文本文件并“打开”它

    我正在尝试创建一个脚本来读取文本文件 然后分析它们 无论文本文件是在线还是离线 离线部分完成 使用 open FILENAME anyfilename txt analyze file sub analyze file while
  • HttpURLConnection (java.net.CookieManager) 和 WebView (android.webkit.CookieManager) 之间的 cookie 双向同步

    不幸的是 Android 有很多 cookie 管理器 饼干为HttpURLConnection由以下人员维护java net CookieManager和饼干WebView由以下人员维护android webkit CookieManag
  • 在 C# 中的 RESTfull/HTTP 请求中添加标头和发布数据

    我在 C 中发送 POST 请求时遇到问题 似乎我误解了一些 HTTP 基础知识 所以基本上我正在实施 RESTfull 服务client 其工作原理如下 使用用户名 密码发出 POST 请求并获取令牌 在发出其他 GET POST PUT
  • RESTful API 应该有架构吗?

    最近有人告诉我 一个合适的 RESTful API 应该为其接受和返回的资源表示定义一个模式 例如 用于 XML 的 XSD 和用于 JSON 的 JSON 架构 然而 在我读过的所有关于 REST 的书籍和文章中 这一点似乎不仅没有突出
  • 如何使用jquery $.post()方法提交表单值[重复]

    这个问题在这里已经有答案了 我有 1 个带有表单的主页和另一个用于处理表单值的页面 这是两个页面的源代码 表格页
  • 如何将 html 输入到 Flask 中?

    我有这个 html 位
  • REST Web 服务 - 动态查询参数

    我需要将动态查询参数发送到 REST Web 服务 GET 方法 如下所示 主机 端口 应用程序 field1 XXX value1 VVV field2 XXX value2 XXX 消费者可以发送参数最多为字段和值 每个字段都映射到值
  • 使用 jQuery 显示 POST 数据?

    我正在使用闪光灯网络摄像头拍照 它工作得很好 并通过 POST 返回一个 URL 我正在用 PHP 进行编码 并希望在收到该 POST 数据后显示该数据 问题是我不重新加载页面 我环顾四周 不确定是否动态加载这个数据数组 我应该去哪里寻找
  • IE 下的 Http 请求速度变慢

    在我的 javascript 应用程序中工作时 我注意到使用 IE 11 时 相同的 ajax 请求时间最多延长 10 倍 响应大小完全相同 12 6KB 我看到的唯一区别是 IE 添加 Pragma no cache 不是铬 Chrome
  • 在 Angular 中一起使用 Promise 和服务

    我的问题是基于这个话题 https groups google com forum msg angular qagzXXhS VI p9ArYjfivW8J在 Angular 谷歌小组中 我想提供一个服务 存储通过 http 从后端检索的一
  • REST api:在一次获取中请求多个资源[重复]

    这个问题在这里已经有答案了 我正在尝试设计一个 RESTful API 用户可以在单个 GET 请求中获取单个产品或产品列表 每个产品都有一个唯一的 ID 单个产品 URL 非常简单 http mycompany com api v1 pr
  • 使用 REST API 进行正确的会话管理

    我已经完成了 RESTful API 的设计 其中我使用作为参数发送的 API 令牌对每个请求进行身份验证 现在我想创建一个客户端界面 我想知道什么是管理每个客户端的会话的正确安全方法browser客户 我想过一个流程来保持服务器端无状态
  • 将对象数组作为请求中的 url 参数传递

    我需要将一个对象数组 每个对象有 2 个字段 作为 http 请求的 url 中的参数 我该怎么做以及这个链接应该是什么样子 您可以使用您的结构创建一个 xml 即一个对象数组 每个对象都有两个字段 然后将其转换为字符串 如下所示 举个例子
  • OpenRasta - Scott Littlewoods 基本身份验证工作示例

    我正在测试使用 OpenRasta 作为 ASP NET MVC 的可行替代方案的可行性 但是 我遇到了有关身份验证的绊脚石 让我明确一点 开放式摘要身份验证 不是一个选项在此刻 我读到 Scott Littlewood 为 OpenRas
  • RxJS Angular2 在 Observable.forkjoin 中处理 404

    我目前正在链接一堆 http 请求 但是在订阅之前我无法处理 404 错误 My code 在模板中 service getData subscribe data gt this items data err gt console log
  • 什么是 Google API 发现?

    我无法理解 Google 产品 服务中使用的 API 发现 概念 以下是一些使用上述发现服务访问 Google Cloud Vision 的 Python 代码 from googleapiclient discovery import b
  • 为什么设置 POST Content-type:"Application/Json" 会导致 REST WebService 上出现“错误请求”?

    我在使用网络服务时遇到一个奇怪的问题 当我作为客户端将表单发布到 REST Web 服务而不设置任何 类型内容 标头时 一切正常 我接到服务器上的电话并且 Json 文本可用 如果我作为客户端将我的发布请求的内容类型标头设置为 applic
  • 使用PHP获取http url参数而不自动解码

    我有一个像这样的网址 test php x hello world y 00h 00e 00l 00l 00o 当我将它写入文件时 file put contents x txt GET x gt hello world file put
  • 响应中的有效 JSON

    我正在开发客户端和服务器应用程序 遇到了一个有趣的问题 我们正在创建一个 Restful API 并通过 JSON 响应与客户端进行通信 执行 DELETE 时 我们将返回 200 OK 和空白响应 我们的客户收到 200 OK 但解析 J

随机推荐

  • Facebook .NET SDK:如何使用 ASP.NET MVC 2 进行身份验证

    我正在尝试掌握 Facebook SDK 同时从 ASP NET 表单过渡到 MVC 最终 所以请耐心等待 我创建了两个控制器操作 当用户单击表单上的 FB 登录按钮时 将执行 FBLogon 然后他被重定向到 FB 登录页面 然后 他被发
  • 配置深度溢出值 - Start-Job

    我有一个递归函数 执行了大约 750 次 迭代 XML 文件并进行处理 代码正在运行使用Start Job 下面的例子 job Start Job ScriptBlock function Test Function Param count
  • 推送更新页面时自动编译的 ASP.NET 站点上出现随机 401 错误

    我们有一个部署在多个 IIS 服务器上的 asp net 网站 该网站是按需编译的 而不是预编译的 Web 应用程序 通常情况下 部署进展顺利 但时不时地 我们会在其中一台服务器上的某个已部署页面上收到 401 错误 除了通常是访问量较高的
  • 在 Microsoft botframework 中回复“正在输入”消息

    我正在 c net 和 LUIS 认知服务上使用 MicrofsoftBotFramework 开发聊天机器人 我希望当用户输入时 它应该在输入或机器人正在输入时回复 public async Task
  • 大写连字符的名称

    我在用WordUtils来自 apache commons 来正确规范人们的名字 例如 AnGEl lEe gt Angel Lee 而且效果很好 现在我提出的测试用例之一是连字符名称 通常 连字符的每个部分的第一个字母都大写 所以我期望
  • 如何在 Rmarkdown 中添加跨块的行号?

    我想将代码行编号添加到 Rmarkdown 文件的 HTML 输出中 我会对任何方法感到满意uniquely标识输出中的每一行代码 例如 在整个文档中递增的连续行号 或者代码块由它们自己的索引标识 并且在这些代码块中行号从 1 开始 我一直
  • Kubectl 还记得我吗?

    我已经在我的 kubernetes api 服务器上实现了基本身份验证 现在我正在尝试配置我的 kube config以我可以简单运行的方式文件 kubectl get pods kubectl config set cluster dig
  • 使用 Rack::Test 测试 AJAX POST - 如何传入数据?

    我在用着机架 测试 https github com brynary rack test测试我的应用程序并需要测试通过 AJAX 发布数据 我的测试看起来像 describe POST user do include Rack Test M
  • 如何从单词列表中查找 DF 中的匹配单词并在新列中返回匹配的单词[重复]

    这个问题在这里已经有答案了 我有一个包含 2 列的 DF 并且有一个单词列表 list of words lt c tiger elephant rabbit hen dog Lion camel horse df lt tibble ti
  • 模拟内部 axios.create()

    我在用着jest and axios mock adapter去测试axiosAPI 调用redux异步动作创建者 当我使用时我无法让它们工作axios创建的实例axios create 像这样 import axios from axio
  • iptables 模式下的 kube-proxy 不起作用

    I have Kubernetes v 1 1 1 iptables v1 4 21 内核 4 2 0 18 generic Ubuntu wily 自带 网络通过交换机上终止的 L2 VLAN 完成 没有云提供商 我做什么 我正在尝试 k
  • 修改与在 SQL Server 2005 中调用的表不同的表上的多行的触发器

    我尝试对由其他表上的更新触发的表执行更新 但收到错误消息 更新或删除的行值要么不会使该行变得唯一 要么会更改多行 例如我有这个表 table 1 int id primary key identity nchar 10 state name
  • iOS 以编程方式为表视图单元格内容创建 NSLayoutConstraint

    我想在 cellForRowAtIndexPath 中添加一些视图到我的单元格内容视图及其约束 但没有任何效果 我有这样的事情 NSLayoutConstraint constraint NSLayoutConstraint constra
  • PHP - preg_match() 一个接一个的单词

    我有一篇这样的文字 The cat was born on 1980 and lives 所以我想用正则表达式获取猫的年龄 文本中可能出现超过 1 次的 4 位数字 我正在尝试这个preg match born on 0 9 4 text
  • 如何在 MySQL 5.7 中创建六字符密码

    我需要在 Mac 上的新 MySQL 中创建一个具有六字符密码的用户 我知道 5 7 中的最低设置只允许八个字符 有什么办法可以解决这个问题吗 我输入CREATE USER newsier localhost IDENTIFIED BY s
  • 如何从mysql获取分层菜单

    我有一个带有分层菜单的表 例如 id parent id name 1 0 menu 2 1 item1 3 2 item1 1 4 1 item2 5 4 item2 1 我这里有数百个菜单项 为了获取数组中的所有项目 我必须编写一个像这
  • 更改 Firebase 实时数据库中的值时如何查看 flutter 应用程序的变化?

    每当我在 Firebase 实时数据库中进行任何更改时 我都会尝试使这些滚动开关更改其值 更具体地说 每当我将 Relay1 Data 的值更改为 0 时 我希望该开关变为非活动状态 我已经尝试并到处寻找 但找不到任何解决方案 bool r
  • 在本地主机上运行的 asp.net 应用程序上使用 https

    我创建了一个 asp net Web 应用程序 其中包含一个名为 Main aspx 的 Web 表单 我正在尝试通过 https 运行该应用程序 由于我没有 SSL IIS 等方面的经验 我在 google 上搜索了如何实现这一目标 但每
  • 如何通过Windows Defender SmartScreen保护? [复制]

    这个问题在这里已经有答案了 我试图防止我的应用程序 安装程序 不会被阻止Windows 智能屏幕保护 我使用 BitRock 并手动签署了我的安装程序 但我总是遇到这个问题 我购买了有效的证书 并且带有时间戳的签名没问题 这是一个商业应用程
  • HTTP 中的 POST 和 PUT 有什么区别?

    背景资料分析 根据RFC 2616 第 9 5 节 https www rfc editor org rfc rfc2616 section 9 5 POST习惯于create资源 POST 方法用于请求源服务器接受请求中包含的实体 作为请