What's the difference between a POST and a PUT HTTP REQUEST?
它们似乎都在向主体内的服务器发送数据,那么是什么使它们不同呢?
HTTP PUT:
Put将一个文件或资源放在一个特定的URI上,并正好放在那个URI上。如果该URI中已经有文件或资源,则PUT将替换该文件或资源。如果没有文件或资源,则PUT创建一个。Put是等幂的,但矛盾的是,Put响应不可缓存。
HTTP 1.1放置的RFC位置
HTTP POST:
post将数据发送到特定的URI,并期望该URI上的资源处理该请求。此时的Web服务器可以决定如何处理指定资源上下文中的数据。post方法不是等幂的,但是只要服务器设置适当的缓存控制和expires头,post响应就可以缓存。
官方的HTTPRFC将post指定为:
- 现有资源的注释;
- 向公告板、新闻组、邮件列表发送邮件,或类似的一组物品;
- 提供数据块,例如提交形成一个数据处理过程;
- 通过追加操作扩展数据库。
HTTP 1.1 POST的RFC位置
POST与PUT的区别:
RFC本身解释了核心区别:
The fundamental difference between the
POST and PUT requests is reflected in
the different meaning of the
Request-URI. The URI in a POST request
identifies the resource that will
handle the enclosed entity. That
resource might be a data-accepting
process, a gateway to some other
protocol, or a separate entity that
accepts annotations. In contrast, the
URI in a PUT request identifies the
entity enclosed with the request --
the user agent knows what URI is
intended and the server MUST NOT
attempt to apply the request to some
other resource. If the server desires
that the request be applied to a
different URI, it MUST send a 301 (Moved Permanently) response; the user agent MAY then make
its own decision regarding whether or not to redirect the request.
使用正确的方法,除此之外不相关:
REST ROA与SOAP的一个好处是,在使用HTTP REST ROA时,它鼓励正确使用HTTP谓词/方法。因此,例如,您只在希望在该确切位置创建资源时使用Put。而且您永远不会使用GET创建或修改资源。
只有语义。
HTTP
HTTP
Put就像一个文件上传。输入到某个URI会确切影响该URI。发布到URI可能会产生任何影响。
要给出REST样式资源的示例:
"post/books"包含一堆图书信息,可能会创建一本新书,并使用标识该图书的新URL响应:"/books/5"。
"put/books/5"必须创建一个ID为5的新图书,或者用ID 5替换现有图书。
在非资源样式中,post可以用于几乎所有具有副作用的内容。另一个区别是,Put应该是等幂的——将相同数据的多个Put放到同一个URL上是可以的,当多个Post可能创建多个对象或您的Post操作执行的任何操作时。
Put是一种将内容"上传"到特定的URI,或者覆盖该URI中已有内容的方法。
另一方面,post是一种提交与给定URI相关数据的方法。
请参阅HTTP RFC
据我所知,Put主要用于更新记录。
发布-创建文档或任何其他资源
放置-更新创建的文档或任何其他资源。
但要清楚的是,这个放置通常会"替换"存在的现有记录,如果不存在则创建。
其他人已经发布了非常好的答案,我只是想补充一点,对于大多数语言、框架和用例,您将要处理的帖子要比Put多得多。到目前为止,放置、删除等基本上都是琐碎的问题。
岗位被认为是某种工厂类型的方法。您将数据包含在其中以创建您想要的内容,而另一端的任何内容都知道如何处理它。Put用于更新给定URL上的现有数据,或者在知道URI将是什么并且它不存在时创建新的数据(而不是在必要时创建并返回其URL的文章)。
REST要求开发人员以与协议定义。这个基本的REST设计原则在创建、读取、更新和删除(CRUD)操作和HTTP方法。根据这个映射:
?要在服务器上创建资源,请使用Post。
?要检索资源,请使用get。
?要更改或更新资源的状态,请使用Put。
?要删除或删除资源,请使用"删除"。
更多信息:RESTful Web服务:IBM的基础知识
请参阅:http://zacharyvoase.com/2009/07/03/http-post-put-diffle/
最近,我非常恼火的是,Web开发人员普遍错误地认为,文章用于创建资源,而Put用于更新/更改资源。
如果您查看RFC2616第55页("超文本传输协议–HTTP/1.1"),第9.6节("Put"),您将看到Put的实际用途:
The PUT method requests that the enclosed entity be stored under the supplied Request-URI.
还有一个方便的段落来解释Post和Put之间的区别:
The fundamental difference between the POST and PUT requests is reflected in the different meaning of the Request-URI. The URI in a POST request identifies the resource that will handle the enclosed entity. That resource might be a data-accepting process, a gateway to some other protocol, or a separate entity that accepts annotations. In contrast, the URI in a PUT request identifies the entity enclosed with the request – the user agent knows what URI is intended and the server MUST NOT attempt to apply the request to some other resource.
它没有提到更新/创建之间的区别,因为这不是它的目的。这就是两者的区别:
1 | obj.set_attribute(value) # A POST request. |
而这:
1 | obj.attribute = value # A PUT request. |
所以,请停止这种普遍误解的传播。阅读你的RFC。
值得一提的是,
当受害者访问攻击者网站时,以下CSRF不可能与
正常请求(发送cookie):(
1 2 3 4 | <form id="myform" method="post" action="http://target.site.com/deleteUser"> <input type="hidden" name="userId" value="5"> </form> document.createElement('form').submit.call(document.getElementById('myform')); |
XHR请求(发送cookie):(
1 2 3 4 | var xhr = new XMLHttpRequest(); xhr.open("POST","http://target.site.com/deleteUser"); xhr.withCredentials=true; xhr.send(["userId=5"]); |
post和put的区别在于put是等幂的,也就是说,多次调用相同的put请求总是会产生相同的结果(即没有副作用),而另一方面,重复调用post请求可能会产生多次创建相同资源的(附加)副作用。