POST和PUT HTTP REQUEST有什么区别?

时间:2008-09-20 06:34:41

标签: http post put

他们似乎都在向身体内的服务器发送数据,那么是什么让他们与众不同呢?

19 个答案:

答案 0 :(得分:704)

HTTP PUT:

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

HTTP 1.1 RFC location for PUT

HTTP POST:

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

官方HTTP RFC指定POST为:

  • 现有资源的注释;
  • 向公告栏,新闻组,邮件列表发送消息,    或类似的一组文章;
  • 提供一个数据块,例如提交的结果     形式,数据处理过程;
  • 通过追加操作扩展数据库。

HTTP 1.1 RFC location for POST

POST和PUT之间的区别:

RFC本身解释了核心差异:

  

之间的根本区别   POST和PUT请求反映在   不同的含义   Request-URI中。 POST请求中的URI   识别将要的资源   处理随附的实体。那   资源可能是数据接受的   进程,通往其他一些网关   协议,或单独的实体   接受注释。相比之下,   PUT请求中的URI标识   随请求附上的实体 -   用户代理知道URI是什么   打算和服务器不得   尝试将请求应用于某些人   其他资源。如果服务器需要   请求应用于   不同的URI,它必须发送301(永久移动)响应;然后用户代理可以制作   自己决定是否重定向请求。

使用正确的方法,无关:

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

答案 1 :(得分:175)

只有语义。

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

HTTP POST更为通用。它应该在服务器上启动一个动作。该操作可以将请求主体存储在URI标识的资源中,也可以是不同的URI,也可以是不同的操作。

PUT 喜欢文件上传。对URI的放置会完全影响该URI。对URI的POST可能会产生任何影响。

答案 2 :(得分:105)

举例说明REST风格的资源:

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

“PUT / books / 5”必须创建一个id为5的新书,或用ID 5替换现有的书。

在非资源风格中,POST几乎可以用于任何有副作用的东西。另一个区别是PUT应该是幂等的 - 同一URL的相同数据的多个PUT应该没问题,多个POST可能会创建多个对象或者你的POST操作。

答案 3 :(得分:55)

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

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

请参阅the HTTP RFC

答案 4 :(得分:38)

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

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

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

  3. 但要清楚该PUT通常会“替换”现有记录(如果它存在)并创建它是否存在......

答案 5 :(得分:16)

其他人已经发布了很好的答案,我只是想在大多数语言,框架和用例中添加它,比PUT更频繁。至于PUT,DELETE等基本上都是琐事问题。

答案 6 :(得分:14)

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

答案 7 :(得分:11)

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

答案 8 :(得分:9)

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

我最近因网络开发人员普遍误以为使用POST来创建资源,而PUT用于更新/更改资源,我一直非常恼火。

如果您查看RFC 2616的第55页(“超文本传输​​协议 - HTTP / 1.1”),Section 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。

答案 9 :(得分:9)

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

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

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

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

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

更多信息: RESTful Web services: The basics from IBM

答案 10 :(得分:9)

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

何时使用它们:

  • 要修改已经是资源集合一部分的单个资源时,请使用PUTPUT完全替换了资源。示例:PUT /resources/:resourceId

    边注::如果要更新部分资源,请使用PATCH


  • 要在资源集合下添加子资源时,请使用POST
    示例:POST => /resources

通常:

  • 通常,实际上,对于 UPDATE 操作,始终使用 PUT
  • 始终将 POST 用于创建操作。

示例:

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”删除报告

答案 11 :(得分:3)

您可以简单地说:

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

2.HTTP Post:用于创建项目

3.HTTP Put:用于更新项目

4.HTTP修补程序:用于部分更新项目

5.HTTP Delete:用于删除项目

答案 12 :(得分:2)

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

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

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

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

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

DELETE:它将删除指定的资源

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

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

HEAD:它请求与GET请求相同的响应,但没有响应正文

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

答案 13 :(得分:0)

值得一提的是,POST受到一些常见的 CSRF攻击,而PUT则不受。

当受害者访问Attackersite.com时,{strong> PUT 无法使用以下CSRF:

正常请求(发送了cookie):({PUT不是受支持的属性值)

<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将触发预检请求)

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

答案 14 :(得分:0)

简单

POST用于创建资源,并返回资源URI EX

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

此调用应创建一本新书并退回该书URI

Response ..../books/5

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

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

使用PUT将提供资源标识符,但是POST将返回新的资源标识符

答案 15 :(得分: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方法与编写url地址行相同与数据。因此,如果要发送敏感数据(不一定总是用户名和密码,但例如某些ID或哈希值),而又不想在url-address-line中显示这些数据,则应使用POST方法

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

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

答案 16 :(得分:0)

PUT和POST都是Rest方法。

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

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

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

答案 17 :(得分:0)

GET,PUT和DELETE的请求方法是CRUD(创建,读取,更新和删除)操作(即数据管理操作),是对 target 资源(状态为由请求URI标识的一个):

  • GET应该读取目标资源的状态; <​​/ li>
  • PUT应该创建更新目标资源的状态; <​​/ li>
  • 删除应删除目标资源的状态。

请求方法POST是另一种野兽。它不应创建像PUT这样的目标资源的状态,因为它是 process 操作,其目标级别比CRUD高(参见RFC 7231, § 4.3.3)。进程可以创建资源,但与 target 资源不同,否则应使用较低级别的目标请求方法PUT,因此即使在这种情况下也不能这样做CRUD操作。

CRUD操作(HTTP中的GET,PUT和DELETE)和非CRUD操作(HTTP中的POST)之间的区别是抽象数据类型对象之间的区别艾伦·凯(Alan Kay)在大部分演讲和他的ACM论文The Early History of Smalltalk中都强调:

我从Simula那里得到的是,您现在可以用目标替换绑定和分配。您希望任何程序员做的最后一件事就是弄乱内部状态,即使以图形方式呈现也是如此。相反,应该将对象呈现为更适合用作动态组件的更高级别行为的站点。

[…]不幸的是,当今所谓的“面向对象程序设计”中的许多内容只是带有高级构造的旧式程序设计。许多程序现在都通过“昂贵的附加程序”来完成“分配样式”操作。

[…]分配语句(甚至是抽象的)也表达了非常低级的目标,需要更多的目标才能完成任务。 […]可以考虑所有这一切的另一种方式是:尽管自动存储分配的后期绑定无法完成程序员无法做的任何事情,但它的存在会导致更简单,更强大的代码。 OOP是许多事物的后期绑定策略,与旧方法相比,它们将延缓脆弱性和规模爆炸的时间更长。

答案 18 :(得分:0)

Post 和 Put 主要用于发布数据和其他更新数据。但是你只能对 post 请求做同样的事情。