大家好,今天来为大家解答HTTP请求方法:GET与POST的差异详解这个问题的一些问题点,包括也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
方法GETPOST后退按钮/刷新无害数据将被重新提交(浏览器应通知用户数据将被重新提交)。书签可以加书签,也可以不加书签。缓存可以被缓存,也不能被缓存。编码类型为application/x-www-form-urlencodedapplication/x-www-form-urlencoded 或multipart/form-data。对二进制数据使用多种编码。历史参数保留在浏览器历史记录中。参数不会保存在浏览器历史记录中。数据长度有限制。发送数据时,GET方法将数据添加到URL中; URL 的长度有限(URL 的最大长度为2048 个字符)。没有限制。对数据类型的限制仅允许ASCII 字符。没有限制。也允许二进制数据。安全性GET 的安全性不如POST,因为发送的数据是URL 的一部分。发送密码或其他敏感信息时切勿使用GET! POST 比GET 更安全,因为参数不会保存在浏览器历史记录或Web 服务器日志中。 URL 中的每个人都可以看到可见性数据。数据不会显示在URL 中。后来有同学指出,限制URL长度是错误的。 HTTP 协议不限制URI 的长度。具体长度受浏览器和系统限制。
这种比较只给出了一些现象上的差异,但没有解释原因。对这个问题的认识不能停留在这个层面。
理解错了?
有一篇文章,99%的人都误解了HTTP中GET和POST的区别,并否定了上面的答案:“不幸的是,这不是我们想要的答案!”,作者说:
GET和POST本质上都是TCP链接,没有什么区别。然而,由于HTTP法规和浏览器/服务器的限制,它们在应用过程中表现出一些差异。 GET 和POST 之间还有另一个主要区别。简单来说:GET生成一个TCP数据包; POST 生成两个TCP 数据包。
对于GET请求,浏览器会将http header和数据一起发送,服务器会响应200(返回数据);对于POST,浏览器将首先发送标头,服务器将响应100 continue,然后浏览器将发送数据,服务器将响应。 200 ok(返回数据)。
我们讲过TCP,感觉很高大上,但至少我在读这篇文章的时候就相信了。
反转??
但是我在浏览知乎的时候又看到了这篇文章:听说“99%的人都误解了HTTP中GET和POST的区别”?指出了上一篇文章中的两个错误:
仅当请求携带Expect: 100-Continue 标头时,100 continue 才有意义。
当请求包含包含100-Continue 期望的Expect 标头字段时,100 响应表明服务器希望接收请求负载正文,如第5.1.1 节中所述。客户端应该继续发送请求并丢弃100 响应。如果请求不包含包含100-Continue 期望的Expect 标头字段,则客户端可以简单地丢弃此临时响应。
当我们通常讨论GET 与POST 时,我们实际上是在讨论规范,而不是实现。什么是规格?说白了就是相关的RFC。实现是指实现规范中描述的规范的所有代码/库/产品,例如curl、Python的requests库或Chrome。
如何发送POST 请求根本不是这个RFC 讨论的内容。 RFC仅解释了100 continue和Expect header之间的联系。例如,如果要在GET 请求中包含body,也可以发送Expect: 100-continue 并等待100 continue,这符合标准。
换句话说,“XHR发送两个TCP数据包”是关于实现的知识,而不是关于规范的知识。你不能说“Chrome在AJAX POST时会发送两个TCP数据包,而GET只会发送一个”就是GET和POST的区别,就像你不能说工业废气排放国家标准就在那里一样因为北京的PM 2.5经常爆炸。问题。
看起来更有意义,而且还使用了RFC、规范、实现等高端词汇。现在我这个吃瓜群众再也坐不住了,决定自己研究一下。
RFC探秘
首先什么是RFC?维基百科上的定义是:
征求意见(RFC) 是互联网工程任务组(IETF) 发布的一系列备忘录。这些文件收集有关Internet 的信息以及来自UNIX 和Internet 社区的软件文件,并按编号排列。目前,RFC 文档由互联网协会(ISOC) 发起和发布。
简单理解RFC就是互联网的规范。我们通常所说的“协议”以RFC的形式存在。 HTTP/1.1规范当前的RFC如下:RFC7230、RFC7231、RFC7232、RFC7233、RFC7234、RFC7235。其中,RFC7231中的Section 4.RequestMethods涉及到几种HTTP方法。仔细阅读本章。
请求方法令牌是请求语义的主要来源;它表明客户提出此请求的目的以及客户期望获得成功的结果。
这里涉及到一个非常重要的词:语义。那么什么是语义呢?本文讲解:语法和语义的区别。
语言是法律句子的集合。什么样的刑罚是合法的?可以从语法和语义两个方面来判断。语法与语法结构有关,而语义与根据该结构组合的单词符号的含义有关。合理的语法结构并不表明语义合法。例如,我们常说:我上大学了。这句话符合语法和语义规则。但是我上大学的时候,虽然符合语法规则,但是没有任何意义,所以不符合语义。
对于HTTP 请求,语法是指请求响应的格式。例如,请求的第一行必须采用方法名URI协议/版本的格式。具体内容请参考之前写的《图解HTTP》读书笔记中的内容。任何符合此格式的请求都是合法的。
语义定义了此类请求的性质。例如,GET的语义是“获取资源”,POST的语义是“处理资源”。实现这两个方法时,必须考虑它们的语义并执行符合其语义的操作。
当然,在遵守语法的情况下实现违反语义的行为是可能的。例如使用GET方法修改用户信息,使用POST方法获取资源列表。这样,我们只能说该请求是“合法”的,而不是“语义”的。写到这里,我突然想到XML中的两个概念:Well Formed和Valid,这似乎正是语法和语义的概念。
如上所述,方法是请求语义的主要来源,即也有次要来源。有些请求头可以进一步修改请求的语义。例如,带有RangeHeader 的GET 请求就成为部分请求。
RFC7231随后定义了HTTP方法的几个特征:
安全——安全
这里的“安全”的含义与通常理解的“安全”的含义不同。如果一个方法的语义本质上是“只读”的,那么这个方法就是安全的。如果客户端对服务器资源的请求使用安全的方法,那么它不应该引起服务器上的任何状态改变,因此是无害的。该RFC 定义GET、HEAD、OPTIONS 和TRACE 方法是安全的。
然而,这个定义只是一个规范,并不能保证该方法的实现也是安全的。服务器端实现可能不符合方法语义,如上面使用GET 修改用户信息时提到的。
引入安全概念的目的是为了方便网络爬虫和缓存在调用或缓存某些不安全的方法时避免出现意想不到的后果。用户代理(浏览器)应区分安全和不安全方法并提示用户。幂等- 幂等
幂等的概念是指多次执行同一个请求方法和只执行一次效果是完全一样的。根据RFC 规范,PUT、DELETE 和安全方法是幂等的。再次强调,这只是一个规范,并不能保证服务器实现是否是幂等的。
引入幂等性主要是为了处理重复发送同一个请求的情况,比如在请求响应之前就失去了连接。如果该方法是幂等的,您可以安全地重新发送请求。这也是浏览器在回退/刷新时遇到POST时会提示用户的原因:POST语义不是幂等的,重复请求可能会带来意想不到的后果。可缓存性——可缓存性,顾名思义,就是一个方法是否可以被缓存。在此RFC 中,GET、HEAD 以及某些情况下的POST 都是可缓存的,但大多数浏览器实现仅支持GET 和HEAD。有关缓存的更多信息,请参阅RFC7234。这三个特征都强调了同一件事,那就是协议不等于实现:协议规定安全不一定实现上安全,协议规定幂等不一定实现上幂等,协议规定可缓存性在实现中不一定是幂等的。必须是可缓存的。这其实就是上面作者提到的规范和实现的关系。
语义之争
到这里,你其实就明白了,你需要了解这两种方式的区别,本质上就是「语义」的对比而不是「语法」的对比,是「Specification」的对比而不是「Implementation」的对比。
关于这两个方法的语义,RFC7231中的原文已经写得很好了:
GET 方法请求传输目标资源的当前所选表示。 GET 是信息检索的主要机制,也是几乎所有性能优化的焦点。因此,当人们谈到通过HTTP 检索一些可识别信息时,他们通常指的是发出GET 请求。
GET 请求消息中的有效负载没有定义的语义;在GET 请求上发送有效负载正文可能会导致某些现有实现拒绝该请求。
POST 方法请求目标资源根据资源自身的特定语义处理请求中包含的表示。
我简单翻一下,补充一下我自己的理解:
GET的语义是请求获取指定的资源。 GET 方法是安全、幂等且可缓存的(除非有Cache-ControlHeader 约束)。 GET 方法的消息正文没有语义。
POST的语义是根据请求负载(消息体)来处理指定的资源。具体处理方法根据资源类型的不同而不同。 POST 不安全,不是幂等的,并且(大多数实现)不可缓存。为了针对其不可缓存性,有一系列的方法对其进行优化,未来将进行研究(FLAG已经立起)。
【HTTP请求方法:GET与POST的差异详解】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
想学习网页开发,了解GET和POST区别非常重要啊。
有15位网友表示赞同!
原来是这样,GET是查询数据POST是提交数据的,好理解!
有10位网友表示赞同!
看这个文章感觉HTTP协议确实挺重要的,很多网站都依赖它。
有19位网友表示赞同!
以前不知道这些方法的区别,现在终于明白啦!
有20位网友表示赞同!
数据安全性问题上GET和POST还是有区别的,谢谢分享!
有15位网友表示赞同!
学习编程的时候一定会用到这些概念的,提前了解下很有用!
有20位网友表示赞同!
这个解释很清晰易懂,第一次这么简单地理解到HTTP协议的使用方式。
有20位网友表示赞同!
感觉GET方法更常用一些,POST方法是不是用的场景比较少呢?
有18位网友表示赞同!
对于新手来说,这些知识点很重要呀,可以提前学习避免踩坑。
有20位网友表示赞同!
明白了之后,我就能更好地理解网页请求的过程了!
有5位网友表示赞同!
这个解释真棒,终于搞清楚了GET和POST的区别啦!
有18位网友表示赞同!
以后在开发的时候要注意使用哪种方法更合适。
有7位网友表示赞同!
学习这些基础知识很重要啊,为以后的编程道路打好基础!
有18位网友表示赞同!
网页开发真的需要很多技术,看来要花时间慢慢地学。
有17位网友表示赞同!
这个文章让我对HTTP协议有了更深的认识。
有11位网友表示赞同!
GET和POST方法的用法还是挺重要的,一定要记住的区别哦!
有5位网友表示赞同!
原来数据传输方式还挺多样化的呢!
有12位网友表示赞同!
这些知识点以后可能会用到,提前了解下很重要!
有6位网友表示赞同!
学习了这么多技术,感觉越来越开阔了。
有17位网友表示赞同!
做网站要考虑很多方面,比如这些协议和方法的运用。
有7位网友表示赞同!