POST和PUT HTTP REQUEST有什么区别?

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 PUT应该接受请求体,然后将其存储在由URI标识的资源中。

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

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多得多。到目前为止,放置、删除等基本上都是琐碎的问题。


  • 获取:从服务器检索数据。应该没有其他效果。
  • 发布:将数据发送到服务器以创建新实体。通常在上载文件或提交Web表单时使用。
  • 放置:类似于post,但用于替换现有实体。
  • 补丁:类似于put,但仅用于更新现有实体中的某些字段。
  • 删除:从服务器中删除数据。
  • 跟踪:提供一种测试服务器接收到什么的方法。它只返回发送的内容。
  • 选项:允许客户机获取有关服务支持的请求方法的信息。支持的方法允许相关的响应头。在CORS中还用作飞行前请求,以通知服务器实际的请求方法和询问自定义头。
  • head:只返回响应头。
  • connect:当浏览器知道它与代理对话,并且最终的URI以https://开头时,它会使用。连接的目的是允许端到端加密的TLS会话,因此代理无法读取数据。

  • 岗位被认为是某种工厂类型的方法。您将数据包含在其中以创建您想要的内容,而另一端的任何内容都知道如何处理它。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。


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

    当受害者访问攻击者网站时,以下CSRF不可能与PUT一起使用:

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

    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):(PUT将触发飞行前请求)

    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请求可能会产生多次创建相同资源的(附加)副作用。

    GET:使用get-only检索数据的请求,即请求指定资源的表示

    POST:它向服务器发送数据以创建资源。请求主体的类型由内容类型头指示。它通常会导致服务器的状态变化或副作用

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

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

    DELETE:删除指定的资源

    TRACE:它沿着到目标资源的路径执行消息循环测试,提供了一种有用的调试机制。

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

    HEAD请求与get请求相同的响应,但没有响应主体

    CONNECT:建立到目标资源标识的服务器的通道,可用于访问使用ssl(https)的网站。