zoukankan      html  css  js  c++  java
  • POST vs PUT and POST vs GET

    1. POST 与 PUT 的区别

    什么是幂等性(Idempotence)?根据维基百科中的幂等性定义:

    Idempotence is the property of certain operations in mathematics and computer science, that can be applied multiple times without changing the result beyond the initial application

    即任意多次执行所产生的影响均与一次执行的影响相同。

    RFC 的文档中说明了哪些方法是幂等的。方法GET,HEAD,PUT,DELETE都有这种性质。

    1.1 POST

    POST 方法用于向服务器指定的 Request-URI 端发送用户产生的数据,比如说,用户发表评论这一操作背后执行的就是 POST 方法。POST 方法是非幂等的。HTTP RFC 明确了几个应该使用 POST 请求的场景:

    • Annotation of existing resources;(对现有资源的注释)
    • Posting a message to a bulletin board, newsgroup, mailing list, or similar group of articles;(发表评论)
    • Providing a block of data, such as the result of submitting a form, to a data-handling process;(向数据处理进程提供大量数据)
    • Extending a database through an append operation.(向数据库中追加条目)

    1.2 PUT

    根据给定的 Request-URI 创建(create)一个新的资源;如果该指定的 URI 对应已经存在资源了,则会覆盖(overwrite)原有的资源(或者说是替换(replace)原有资源)。该方法是幂等的。

    主要区别:在 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.

    翻译如下:

    POST和PUT请求之间的根本区别体现在Request-URI的不同含义上,更多体现的是语义上的区别,而不是功能实现上的区别。 POST请求中的URI标识将处理封闭实体的资源。 该资源可能是一个数据接受过程,某个其他协议的网关或一个接受注释的单独实体。 相比之下,PUT请求中的URI标识了请求所包含的实体——用户代理明确知道URI的意图,并且服务器绝不能尝试将请求应用于其他资源。 如果服务器希望将该请求应用于其他URI,则它必须发送301(Moved Permanently)响应,然后,用户代理可以自行决定是否重定向请求。

    2. POST 与 GET 的区别

    2.1 GET

    GET 请求用于读取一个资源。因为只是读取,不涉及对资源的修改,因此首先可以明确,该操作是具有幂等性的。其次,既然是读取,就可以对 GET 请求的数据做缓存,这个缓存可以做到浏览器本身上(避免浏览器频繁的向服务器发请求),也可以做到代理上(如nginx),这是一种提升浏览器响应速度的方法。

    2.2 POST

    POST 请求用于处理一个资源。在页面里<form> 标签会定义一个表单。点击其中的submit元素会发出一个POST请求让服务器做一件事。这件事往往是有副作用的,不幂等的。不幂等也就意味着不能随意多次执行。因此也就不能缓存。比如通过POST下一个单,服务器创建了新的订单,然后返回订单成功的界面。这个页面不能被缓存。试想一下,如果POST请求被浏览器缓存了,那么下单请求就可以不向服务器发请求,而直接返回本地缓存的“下单成功界面”,却又没有真的在服务器下单。那是一件多么滑稽的事情。

    主要区别

    1. GET请求消息体为空,POST请求带有消息体。(GET请求没有body,只有url,请求数据放在url的query-string中;POST请求的数据在body中。但这种情况仅限于浏览器发请求的场景。)
    2. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456。POST方法是把提交的数据放在HTTP包的body中。
    3. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制。
    4. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。
    5. GET请求会被浏览器主动cache,而POST不会,除非手动设置。

    (完)


    参考:

    1. https://www.keycdn.com/support/put-vs-post
    2. https://stackoverflow.com/questions/107390/whats-the-difference-between-a-post-and-a-put-http-request
    3. https://www.zhihu.com/question/28586791/answer/767316172
  • 相关阅读:
    Redis开发与运维:SDS
    Redis开发与运维:数据迁移
    我的2019上半年
    C# 并发编程
    经典排序算法 — C# 版(上)
    图解 -- 树的汇总
    图解--队列、并发队列
    栈到CLR
    我们的数组
    算法复杂度
  • 原文地址:https://www.cnblogs.com/kkbill/p/13198729.html
Copyright © 2011-2022 走看看