POST和PUT HTTP REQUEST有什么区别?

它们似乎都在将数据发送到体内的服务器,那么什么使它们与众不同?


#1楼

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

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

请参阅HTTP RFC


#2楼

仅语义。

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

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

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


#3楼

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


#4楼

HTTP PUT:

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

PUT的HTTP 1.1 RFC位置

HTTP POST:

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

官方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方法请求created目标资源的状态或replaced为请求消息有效负载中包含的表示形式所定义的状态。

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

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


#5楼

举例说明REST风格的资源:

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

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

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


#6楼

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


#7楼

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

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

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

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


#8楼

请参阅: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。


#9楼

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

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

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

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

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

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


#10楼

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

#11楼

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

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

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

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

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

DELETE :删除指定的资源

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

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

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

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


#12楼

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

当受害者访问PUTPUT无法使用以下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"]);

#13楼

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是幂等操作:如果对同一请求多次执行,它将没有副作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值