POST和PUT HTTP REQUEST有什么区别?


Answers:


892

HTTP PUT:

PUT将文件或资源放在特定的URI上,并确切地放在该URI上。如果该URI上已经有文件或资源,则PUT会替换该文件或资源。如果那里没有文件或资源,PUT将创建一个。PUT是幂等的,但矛盾的是PUT响应不可缓存。

PUT的HTTP 1.1 RFC位置

HTTP POST:

POST将数据发送到特定的URI,并期望该URI上的资源可以处理请求。此时,Web服务器可以确定在指定资源的上下文中如何处理数据。POST方法不是幂等的,但是POST响应可缓存的,只要服务器设置适当的Cache-Control和Expires标头即可。

官方HTTP RFC指定POST为:

  • 注释现有资源;
  • 将消息发布到公告板,新闻组,邮件列表或类似的文章组;
  • 向数据处理过程提供数据块,例如提交表单的结果;
  • 通过附加操作扩展数据库。

POST的HTTP 1.1 RFC位置

POST和PUT之间的区别:

RFC本身解释了核心差异:

POST和PUT请求之间的根本区别体现在Request-URI的不同含义上。POST请求中的URI标识将处理封闭实体的资源。该资源可能是一个数据接受过程,某个其他协议的网关或一个接受注释的单独实体。相比之下,PUT请求中的URI标识请求中包含的实体-用户代理知道URI的意图,并且服务器不得尝试将请求应用于其他资源。如果服务器希望将该请求应用于其他URI,则它必须发送301(永久移动)响应;然后,用户代理可以自行决定是否重定向请求。

此外,更简洁一点的是RFC 7231第4.3.4节PUT状态(添加了强调),

4.3.4。放

PUT方法请求目标资源的状态为请求消息有效载荷中包含的表示形式 createdreplaced具有该状态。

使用正确的方法,除了无关的:

REST ROA vs SOAP的一个好处是,当使用HTTP REST ROA时,它鼓励正确使用HTTP动词/方法。因此,例如,仅当您想在该确切位置创建资源时才使用PUT。而且,您永远不会使用GET创建或修改资源。


1
我在规范中读到了If the Request-URI does not point to an existing resource [...] the origin server *can* create the resource with that URI。因此,如果不存在则拒绝创建资源的PUT实现是正确的,对吗?如果是这样,实际上会发生这种情况吗?还是通常在PUT上创建实现?
houcros

1
一些额外的例外,这使得差别很明显的,在接下来的URL - dzone.com/articles/put-vs-post
阿希什Shetkar

1
我不了解的是如何实现PUT的幂等性。通常,在创建新资源的情况下,大多数API都会使用ID的自动生成。并在PUT中,如果资源不存在,则应创建一个资源,但要使用URI中指定的ID,但是如果将id生成方法设置为自动的,该怎么做?
罗尼·阿克塞拉德

1
简而言之:POST请求中的URI 标识将处理封闭实体的资源PUT请求中的URI 标识实体本身
Drazen Bjelovuk '19

对POST方法的响应不可缓存,除非响应包含适当的Cache-Control或Expires标头字段
NattyC

210

仅语义。

HTTP PUT应该接受请求的主体,然后将其存储在URI标识的资源中。

HTTP POST更通用。应该在服务器上启动一个动作。该动作可能是将请求正文存储在URI标识的资源上,或者可能是其他URI,或者可能是其他动作。

PUT 就像文件上传一样。放入URI会完全影响该URI。到URI的POST可能完全无效。


暗示某种功能的实际上可能不是
TaylorMac

131

举例说明REST风格的资源:

带有大量书籍信息的“ POST / books”可能会创建一本新书籍,并使用标识该书籍的新URL进行响应:“ / books / 5”。

“ PUT / books / 5”将不得不创建ID为5的新书,或将ID为5的现有书替换。

在非资源样式中,POST可以用于几乎所有具有副作用的东西。另一个不同之处在于,PUT应该是幂等的-将相同数据的多个PUT放入相同的URL应该没问题,如果多个POST可能会创建多个对象,或者您的POST操作会执行任何操作。


嗨,Bhollis,如果我使用POST / books / 5,会发生什么?会抛出找不到资源吗?
ChanGan

13
我觉得幂等性是PUT和POST之间最明显和最重要的区别
Martin Andersson 2013年

1
嗨,ChanGan,这是Wikipedia对您的“ POST / books / 5”案例的解释:“通常不使用。将被寻址的成员本身视为一个集合,并在其中创建一个新条目。”
rdiachenko

这个答案给人的印象是可以在同一资源上定义PUT和POST,但是等幂性旁边的另一个区别是谁控制ID空间。在PUT中,用户通过创建具有特定ID的资源来控制ID空间。在POST中,服务器将返回用户应在后续调用(如GET)中引用的ID。上面的内容很奇怪,因为两者兼而有之。
汤米

74
  1. GET:从服务器检索数据。应该没有其他效果。
  2. POST:将数据发送到服务器以创建新实体。常用于上传文件或提交网络表单。
  3. PUT:与POST类似,但用于替换现有实体。
  4. PATCH:类似于PUT,但仅用于更新现有实体中的某些字段。
  5. DELETE:从服务器中删除数据。
  6. 跟踪:提供一种方法来测试服务器接收的内容。它只是返回已发送的内容。
  7. 选项:允许客户端获取有关服务支持的请求方法的信息。相关的响应标头是“允许”和受支持的方法。在CORS中还用作预检请求,以通知服务器有关实际的请求方法并询问自定义标头。
  8. HEAD:仅返回响应头。
  9. CONNECT:当浏览器知道与代理进行对话并且最终URI以https://开头时,由浏览器使用。CONNECT的目的是允许端到端加密TLS会话,因此代理无法读取数据。

9
最佳简短答案
vibs2006

使用https时,是否在每个请求之前触发CONNECT?
可变

66

PUT是一种将内容“上传”到特定URI或覆盖该URI中已有内容的方法。

另一方面,POST是一种提交与给定URI相关的数据的方法。

请参阅HTTP RFC


45

据我所知,PUT主要用于更新记录。

  1. POST-创建文档或任何其他资源

  2. PUT-更新创建的文档或任何其他资源。

但是要明确一点,PUT通常“替换”现有记录(如果存在),并创建(如果不存在)。


1
在这种情况下,记录是什么?问题是关于HTTP请求。
Kishore

如果文档/资源已经存在,POST将如何处理?它会抛出错误,还是会出错?
Aditya Pednekar '18

根据我所读的大部分内容,PUT也可以创建。
aderchox

19

其他人已经发布了很好的答案,我只是想在大多数语言,框架和用例中添加,您处理POST的次数要比PUT多得多。到目前为止,PUT,DELETE等基本上都是琐事问题。


15

请参阅:http: //zacharyvoase.com/2009/07/03/http-post-put-diff/

最近,Web开发人员普遍误解了一个帖子,即使用POST来创建资源,而使用PUT来更新/更改资源,这使我非常恼火。

如果您看一下RFC 2616(“超文本传输​​协议– HTTP / 1.1”)的第55页,第9.6节(“ PUT”),您将看到PUT的实际用途:

PUT方法请求将封闭的实体存储在提供的Request-URI下。

还有一个方便的段落来解释POST和PUT之间的区别:

POST和PUT请求之间的根本区别体现在Request-URI的不同含义上。POST请求中的URI标识将处理封闭实体的资源。该资源可能是一个数据接受过程,某个其他协议的网关或一个接受注释的单独实体。相反,PUT请求中的URI标识了请求所包含的实体–用户代理知道要使用的URI,并且服务器绝不能尝试将请求应用于其他资源。

它没有提及更新/创建之间的区别,因为这不是真正的意义。关于这之间的区别:

obj.set_attribute(value) # A POST request.

和这个:

obj.attribute = value # A PUT request.

因此,请停止传播这种流行的误解。阅读您的RFC。


13
这似乎是毫无意义的粗鲁,而且以一种不太有用的方式进行了脚。在您引用的PUT的示例中,在RESTful api中,新实体是“新”记录-可以在该位置访问。是否允许子成员这样可变是一个好的设计选择(我认为这是不理想的),但是即使这样,您也正在使用一个亚种来攻击许多有用的信息。在大多数情况下,通常所说的描述是对RFC内容的总结,总结以及对惯常做法的良好说明。同样,礼貌也不会伤害您。
tooluser 2015年

3
这不能被充分支持。PUT在REST API中没有位置。在大多数情况下,POST指示正确的语义。
Beefster

说得不好,但确实是对RFC的准确解释。看来,Web开发人员世界中充斥着大量错误信息。
威廉T弗罗加德

@Beefster没有“ POST指示”之类的东西。纳耶布尔在这里提出了一个要点。您如何看待它表示什么?除了您只是使用它是因为自从学习第一天开始就一直以这种方式使用它,但是与其他方法相比,您真的不知道为什么应该使用它吗?
1:21的Mosia Thabo

12

POST被认为是一种工厂类型的方法。您可以在其中包含数据以创建所需的内容,而另一端的内容则知道该如何处理。PUT用于更新给定URL上的现有数据,或者在您知道URI将会是什么并且不存在URI时创建新的东西(与POST相对,后者会创建一些东西并将URL返回给如有必要)。


10

REST要求开发人员以与协议定义一致的方式显式使用HTTP方法。这项基本的REST设计原则在创建,读取,更新和删除(CRUD)操作与HTTP方法之间建立了一对一的映射。根据此映射:

•要在服务器上创建资源,请使用POST。

•要检索资源,请使用GET。

•要更改资源的状态或进行更新,请使用PUT。

•要删除或删除资源,请使用DELETE。

更多信息: RESTful Web服务:IBM的基础


我认为您的PUT和POST后退
Beefster

@Beefster Post创建,更新,是吗?
阮长

不会。PUT实际上是将文字内容放置在URL上,而很少在REST API中放置它。POST更抽象,涵盖了没有“将这个确切的文件放入这个确切的URL”语义的任何添加内容。
Beefster

7

何时使用一种或另一种应该很简单,但是复杂的措辞使我们许多人感到困惑。

何时使用它们:

  • PUT当您想要修改已经是资源集合一部分的单个资源时使用。PUT完全替换资源。例:PUT /resources/:resourceId

    旁注:使用PATCH,如果你想更新资源的一部分。


  • POST当您要在资源集合下添加子资源时使用。
    例:POST => /resources

一般来说:

  • 通常,在实践中,始终将其PUT用于UPDATE操作。
  • 始终POST用于CREATE操作。

例:

GET / company / reports => 获取所有报告
GET / company / reports / {id} => 获取由“ id”标识的报告信息
POST / company / reports => 创建新报告
PUT / company / reports / {id} => 更新由“ id”标识的报告信息
PATCH / company / reports / {id} => 更新由“ id”标识的报告信息的一部分
DELETE / company / reports / {id} => 通过“ id”删除报告


4

POST和PUT之间的区别在于PUT是幂等的,这意味着多次调用同一PUT请求将始终产生相同的结果(没有副作用),而另一方面,重复调用POST请求可能具有(额外)多次创建相同资源的副作用。

GET :使用GET的请求仅检索数据,即它请求指定资源的表示形式

POST:它将数据发送到服务器以创建资源。请求主体的类型由Content-Type标头指示。它通常会导致服务器状态改变或副作用

PUT :创建一个新资源或用请求有效载荷替换目标资源的表示形式

PATCH :用于对资源进行部分修改

DELETE :删除指定的资源

TRACE :它沿着目标资源的路径执行消息环回测试,从而提供了有用的调试机制

OPTIONS :用于描述目标资源的通信选项,客户端可以为OPTIONS方法指定URL,或者星号(*)表示整个服务器。

HEAD :它要求一个与GET请求相同的响应,但没有响应主体

CONNECT :它建立到目标资源所标识的服务器的隧道,可用于访问使用SSL(HTTPS)的网站


2

REST的用法

POST 用于创建新资源,然后返回资源 URI

EX 
      REQUEST : POST ..../books
        {
        "book":"booName",
        "author":"authorName"
        }

此调用可能会创建一本新书并退回该书 URI

Response ...THE-NEW-RESOURCE-URI/books/5

PUT 用于替换资源,如果该资源存在,则只需对其进行更新,但是如果该资源不存在,则创建它,

REQUEST : PUT ..../books/5
{
"book":"booName",
"author":"authorName"
}

有了PUT我们知道的资源标识符,但是POST将返回新的资源标识符

非REST式使用

POST 用于在服务器端启动操作,此操作可能会或可能不会创建资源,但是此操作将始终具有副作用,它将始终更改服务器上的某些内容

PUT 用于在特定的URL上放置或替换文字内容

REST风格和非REST风格的另一个区别

POST 是非幂等操作:如果对同一请求多次执行,将导致某些更改。

PUT 是幂等运算:如果对同一请求多次执行,则不会有副作用。


1

值得一提的是,它POST很容易受到一些常见的跨站请求伪造(CSRF)攻击,PUT并非如此。

当受害者拜访时,下面的CSRF 无法使用PUTattackersite.com

攻击后果是,受害人无意中删除了一个用户,仅因为该用户(受害人)已在admin上登录target.site.com,然后才访问attackersite.com

普通请求(发送cookie):(PUT不是受支持的属性值)

代码attackersite.com

<form id="myform" method="post" action="http://target.site.com/deleteUser" >
    <input type="hidden" name="userId" value="5">
</form>
<script>document.createElement('form').submit.call(document.getElementById('myform'));</script>

XHR请求(发送cookie):(PUT将触发预检请求,其响应将阻止浏览器请求deleteUser页面)

var xhr = new XMLHttpRequest();
xhr.open("POST", "http://target.site.com/deleteUser");
xhr.withCredentials=true;
xhr.send(["userId=5"]);

1

简单来说,您可以说:

1.HTTP Get:用于获取一个或多个项目

2.HTTP Post:用于创建项目

3.HTTP Put:用于更新项目

4.HTTP Patch:用于部分更新项目

5.HTTP Delete:用于删除项目


0

实际上,除了标题之外没有其他区别。实际上,GET与其他方法之间存在根本的区别。使用“ GET” -Request方法,您可以在url地址行中发送数据,该数据首先以问号分隔,然后以&符号分隔。

但是,使用“ POST”请求方法,您无法通过url传递数据,但是必须在所谓的请求“正文”中将数据作为对象传递。在服务器端,您必须读出接收到的内容的主体,以获取发送的数据。但是,另一方面,当您发送“ GET”请求时,无法在正文中发送内容。

声称“ GET”仅用于获取数据而“ POST”用于发布数据的说法是绝对错误的。没有人可以阻止您根据“ GET”请求或“ POST”请求发送的数据来创建新内容,删除现有内容,编辑现有内容或在后端执行任何操作。没有人能阻止您以某种方式对后端进行编码,即使用“ POST”请求,客户端会请求一些数据。

对于请求,无论使用哪种方法,都将调用URL并发送或不发送一些数据来指定要传递给服务器的哪些信息以处理请求,然后客户端从服务器。数据可以包含您想要发送的任何内容,后端可以对数据执行任何想要的操作,响应可以包含您想要放置在其中的任何信息。

只有这两种基本方法。GET和POST。但这是它们的结构,这使它们与众不同,而不是您在后端编写的代码。在后端,您可以使用接收到的数据对任何内容进行编码。但是,通过“ POST”请求,您必须在正文中而不是在url-addressline中发送/检索数据,而通过“ GET”请求,您必须在url-addressline中而不是在其中发送/检索数据。身体。就这样。

所有其他方法,例如“ PUT”,“ DELETE”等,都具有与“ POST”相同的结构。

如果要稍微隐藏内容,则主要使用POST方法,因为无论您在url-地址行中写入什么内容,该内容都将保存在缓存中,而GET-Method与使用数据编写url-地址行相同。因此,如果您要发送敏感数据(不一定总是用户名和密码,但是例如某些ID或哈希值),而又不想将其显示在url-address行中,则应该使用POST方法。

URL-地址线的长度也被限制为1024个符号,而“ POST”方法则不受限制。因此,如果您有大量数据,则可能无法使用GET-Request发送它,但是您将需要使用POST-Request。因此,这也是POST请求的另一个优点。

但是,当您没有要发送的复杂文本时,处理GET请求就容易得多。否则,这是POST方法的另一个优点,就是使用GET方法,您需要对文本进行url编码,以便能够在文本甚至空格内发送一些符号。但是通过POST方法,您没有任何限制,并且您的内容无需任何更改或操纵。


0

PUT和POST都是Rest方法。

PUT-如果两次使用相同参数的PUT两次发出相同的请求,则第二个请求将无效。这就是为什么PUT通常用于Update场景的原因,使用相同的参数多次调用Update不会比初始调用做更多的事情,因此PUT是幂等的。

POST不是幂等的,例如Create将在目标中创建两个单独的条目,因此它不是幂等的,因此CREATE在POST中被广泛使用。

每次使用具有相同参数的POST进行相同的调用都会导致发生两种不同的情况,因此为什么POST通常用于Create场景

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.