#HTTP#
首先,最常见的答案

当我们在谷歌或互联网上搜索这个问题时,得到的是以下三个答案,这似乎是“标准答案”。其实这个答案是有待商榷的。
1.GET使用URL或cookie来传递参数,而POST将数据放在主体中。
2.如果GET提交的数据长度有限,POST的数据可能会非常大。
3.POST比GET更安全,因为数据在地址栏中是不可见的。
第二,“标准答案”其实是错的。
1.GET使用URL或cookie来传递参数,而POST将数据放在主体中。
GET和POST是由HTTP协议定义的。在HTTP协议中,方法和数据是两个正交的概念,也就是说,使用哪种方法与应用层的数据如何传输无关。
HTTP不要求。如果方法是POST,数据应该放在主体中。没有要求。如果方法是GET,数据必须放在URL中,而不是放在正文中。
那么,网上这种广为流传的说法从何而来?我在HTML标准中找到了类似的描述。这与网上流传的说法一致。但是,这只是HTML标准对HTTP协议用法的约定。怎么能算是GET和POST的区别呢?
此外,现代Web服务器都支持在GET中包含正文的请求。虽然这种请求不能从浏览器发出,但是现在的Web服务器不仅仅是为浏览器服务的,已经完全超出了HTML服务器的范围。
2.如果GET提交的数据长度有限,POST的数据可能会非常大。
先说结论:HTTP协议对GET和POST的长度没有限制。HTTP协议明确规定HTTP头和正文没有长度要求。
首先,“GET提交的数据长度有限”。如果我们使用GET通过URL提交数据,那么GET能够提交的数据量与URL的长度直接相关。实际上,URL参数没有上限,HTTP协议规范也没有限制URL长度。这种限制受到特定浏览器和服务器的限制。IE URL的长度限制是2083字节。对于其他浏览器,如网景、火狐等。,理论上没有长度限制,但限制取决于操作系统的支持。

注意,这个限制是整个URL长度,而不仅仅是参数值数据长度。
POST也是如此。POST没有大小限制,HTTP协议规范也没有限制POST数据的大小。限制它的是服务器处理器的处理能力。
当然,我们常说的GET的URL会有长度限制。有什么故事?虽然这不是GET和POST的本质区别,但我们也可以谈谈导致URL长度限制的两个原因:
1.浏览器。早期的浏览器限制了URL的长度。现在具体有哪些限制?我自己没有测试过,就不复制网上的说法了。
2.服务器。长URL也是服务器的负担。本来一个会话没有多少数据。现在,如果有人恶意构造几个M大小的URL,并不断访问你的服务器。服务器的最大并发量会明显下降。另一种攻击方式是告诉服务器Content-Length是一个很大的数字,然后只需向服务器发送一点数据,你就等着它吧。即使您有超时设置,每次访问的这种故意超时也会使服务器崩溃。鉴于此,出于安全和稳定的考虑,大多数服务器都会限制URL的长度。但是这个限制是针对所有HTTP请求的,与GET和POST无关。
3.POST比GET更安全,因为数据在地址栏中是不可见的。
这个说法其实是基于以上两点1和2。我觉得没问题,但是要了解地址栏使用GET为什么不安全,是否还有其他“POST比GET安全”的原因。
通过GET提交数据,用户名和密码将以明文形式出现在URL上,因为登录页面可能会被浏览器缓存。别人可以查看浏览器的历史记录,所以别人可以得到你的账号和密码。此外,使用GET提交数据还可能导致跨站点请求伪造攻击。
第三,我的理解
"1.GET使用URL或cookie来传递参数,而POST将数据放在主体中”。这是因为HTTP协议的使用约定。不是他们自己的不同。
"2.如果GET提交的数据长度有限,POST的数据可能会非常大”。这是因为他们使用的操作系统和浏览器设置不同造成的差异。也不是GET和POST本身的区别。
"3.POST比GET更安全,因为数据在地址栏是看不见的。”这种说法没有错,但仍然不是GET和POST本身的区别。

这三点虽然不是他们自身的差异,但至少是他们在使用上的差异,所以我在面试这个问题的时候,如果面试官能回答出以上三点,我基本会给及格分。那么你想要更高的分数吗?
第四,终极差异
GET和POST的最大区别是GET请求是幂等的,而POST请求不是。这是它们本质区别,以上只是使用上的区别。
什么是幂等?幂等意味着请求一个资源一次和多次应该有相同的副作用。简单地说,这意味着对同一个URL的多个请求应该返回相同的结果。看到我的评论里推荐的一篇关于幂等的文章。
正因为它们有这样的差异,我们不应该也不能使用get请求来添加、删除、更改数据,这样会有副作用。因为get请求是幂等的,所以会尝试在网络不好的隧道中重试。如果使用get请求额外的数据,则存在重复操作的风险,这可能会导致副作用。


