POST和PUT HTTP REQUEST有什么区别?
它们似乎都在将数据发送到体内的服务器,那么什么使它们与众不同呢?
解决方案
PUT是一种用于将内容"上传"到特定URI或者覆盖该URI中已有内容的方法。
另一方面,POST是一种提交与给定URI相关的数据的方法。
请参阅HTTP RFC
仅语义。
HTTPPUT
应该接受请求的主体,然后将其存储在URI标识的资源中。
HTTPPOST
更通用。应该在服务器上启动一个动作。该动作可以是将请求正文存储在URI标识的资源上,或者可以是其他URI,或者可以是不同的动作。
PUT就像文件上传一样。放入URI会完全影响该URI。到URI的POST可能完全没有效果。
POST被认为是一种工厂类型的方法。我们在其中包含数据以创建所需的内容,而另一端的内容则知道该如何处理。 PUT用于更新给定URL上的现有数据,或者在我们知道URI将会是什么并且不存在URI时创建新的东西(与POST相对,后者会创建一些东西并将URL返回给如有必要)。
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本身解释了核心区别:
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创建或者修改资源。
举例说明REST风格的资源:
带有大量书籍信息的" POST / books"可能会创建一本新书籍,并使用标识该书籍的新URL进行响应:" / books / 5"。
" PUT / books / 5"将必须创建ID为5的新书,或者将ID为5的现有书替换。
在非资源风格中,POST几乎可以用于任何有副作用的东西。另一个区别是,PUT应该是幂等的,将相同数据的多个PUT放在同一个URL上应该没问题,如果多个POST可能会创建多个对象,或者POST操作会执行任何操作。
其他人已经发布了很好的答案,我只是想在大多数语言,框架和用例中添加,我们处理POST的次数要比PUT多得多。到目前为止,PUT,DELETE等基本上都是琐事问题。