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 有什么区别? 的相关文章

  • org.apache.http 软件包在 API 级别 23 中被删除。替代方案是什么?

    在更新到最新的 android API 级别 23 Marshmallow 后 通过 build gradle 添加以下更改后 所有 org apache http 类都不起作用 android compileSdkVersion 23 b
  • 在 Flex 中以 HTTP Post 方式上传任意数据

    我们目前有一个 Java 小程序 可以生成大量数据并将其上传到我们的服务器 我们拥有的上传方法之一是使用 HTTP POST 到我们的服务器 其内容只是原始数据 没有多部分编码或任何内容 我正在考虑实现一个具有相同功能的 Flex 应用程序
  • 来自复杂对象的 spring RestTemplate POST 参数

    我正在尝试使用 postForObject 方法使用restTemplate 来测试我们的REST 服务 单元测试 Test public void testPostOrder String url BASE URL orders Orde
  • OkHttp如何获取Json字符串?

    Solution 这是我这边的一个错误 正确的方法是响应 body string 以外响应 body toString 我使用 Jetty servlet URL 是http 172 16 10 126 8789 test path jso
  • HttpRequest PUT内容到poco库中

    我想使用 HTTP PUT 请求将一些数据从 C 应用程序发送到服务器 我在用poco http pocoproject org我的应用程序中的网络库 我正在使用这个代码片段 HTTPClientSession session uri ge
  • Perl:LWP::UserAgent 对于重定向 URL 始终返回代码 200

    我有一个简单的 url 它执行 302 临时错误 移至另一页 我尝试在 URL 返回代码 200 表示 OK 时检索它 并在返回 200 以外的其他内容时停止 My code my ua LWP UserAgent gt new env p
  • .NET 中有什么方法可以以编程方式侦听 HTTP 流量吗?

    我正在使用浏览器自动化来测试网站 但我需要验证来自浏览器的 HTTP 请求 即图像 外部脚本 XmlHttpRequest 对象 有没有一种方法可以以编程方式实例化代理以供浏览器使用以查看其发送的内容 我已经在使用 Fiddler 来监视流
  • Chrome 在传输一定量的数据后挂起 - 等待可用的套接字

    我有一个浏览器游戏 最近我开始向游戏添加音频 Chrome 无法加载整个页面并卡在 91 requests 8 1 MB transferred 并且不再加载任何内容 它甚至破坏了所有其他选项卡中的网站 说Waiting for avail
  • 使用 Post 以 REST 方式更新值

    我对 REST 很陌生 所以如果这是一个愚蠢的问题 请原谅我 这样 我就有了客户资源 一个客户有很多信用 所以 我想获取客户积分的 URL 是 客户 21 积分 其中 21 是客户 ID 现在 如果我没有全额积分 如何添加积分 例如 客户有
  • 在处理程序之后访问 HTTP 请求上下文

    在我的日志记录中间件 链中的第一个 中 我需要访问一些在链下游的某些身份验证中间件中编写的上下文 并且仅在处理程序本身执行之后 旁注 需要首先调用日志记录中间件 因为我需要记录请求的持续时间 包括在中间件中花费的时间 此外 当权限不足时 身
  • 用于 RESTful 轨道应用程序的简单面包屑

    是否有任何辅助方法 除了默认 Rails 面包屑导航 http wiki rubyonrails org rails pages Breadcrumbs 为特定页面动态生成面包屑导航 而无需在 RESTful 应用程序中传递琐碎的参数 也就
  • 由于浏览器设置的标头,Safari 拒绝重定向的 CORS 请求

    Summary Safari 拒绝一些涉及重定向的 CORS 请求 声称某些标头是不允许的 但该标头从来不是由脚本请求的 而是由浏览器添加的 所以我认为这应该不重要 Safari 的行为是一个错误吗 规格有问题吗 或者 事情变成这样是有原因
  • RESTful API,如果查询字符串不够长怎么办?

    我们有产品资源集合 products 我们希望过滤此集合以仅返回具有特定列表之一的成员class id的 例如 GET products classes 100 101 102 这应该返回具有列出的任何类的产品成员的集合 我们遇到的问题是
  • 返回重定向作为对 Ajax(fetch、XHR 等)请求的响应

    如果浏览器收到对 ajax 请求的重定向响应 会发生什么 如果浏览器收到对 ajax 请求的重定向响应 会发生什么 如果服务器发送重定向 又名 302 响应加上 Location 标头 浏览器将自动遵循重定向 对此的回应second请求 假
  • REST Web 服务 WSDL? [复制]

    这个问题在这里已经有答案了 我正在实现一个 Web 服务 并且已经实现了 REST 和 SOAP 版本 看看哪个版本适合我的需求 我决定选择 REST 因为它很简单 而且我可能会开发一个 iPhone 应用程序来使用它 我的问题很简单 是否
  • 在 Angular 中让多个调用等待同一个 Promise

    我在一个页面上有多个使用相同服务的控制器 为了举例 我们将服务称为 USER 第一次调用 USER getUser 时 它会发出 http 请求来获取有关用户的数据 调用完成后 它将数据存储在 USER data 中 如果再次调用 USER
  • 如何获取数组作为 GraphQL 解析器的输入

    我想得到一个字符串数组ids查询变量中的参数并在我的解析器中使用它 下面是我的代码 People resolver ts import Resolver Query Mutation Args from nestjs graphql imp
  • REST 将多个输入传递给 GET 方法

    我在 RAD 中部署了一个简单的基于 REST 的应用程序 使用以下方式访问简单的 URLhttp localhost
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 网站(Google 和/或您)应如何处理 Accept-Language 标头?

    很长一段时间以来 我对谷歌在以下情况下的行为并不满意 并且在无意中注意到之后80 其他人 https stackoverflow com questions 1011167 what are common ui misconceptions

随机推荐

  • 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 方法用于请求源服务器接受请求中包含的实体 作为请