前言
学过web的小伙伴肯定对HTTP中的两种客户端数据请求方式GET和POST都有所了解,但是两者的具体区别相必有很多小伙伴还是不能完全区分开的,对于GET和POST的区别听很多小伙伴说在面试中都会涉及到,所以小伙伴来到这就保证你可以在面试环节秀对方一脸喽
两者简介
GET和POST是浏览器客户端向服务器端请求数据的两种基本方法,相必学过Javaweb的小伙伴在学习Javaweb三大核心组件之一的servlet是,在实现servlet的方法是会涉及到doGet()和doPost()两种方法,这两种方法就是针对于客户端不同的提交方式作出不同的响应。在get与post的两种请求方式中就必须要提到HTTP协议。
HTTP协议
相必学过网络的人对HTTP都不陌生,HTTP作为一种超文本传输协议,基本上每天我们上网都不可避免的接触到HTTP,HTTP是一种基于请求响应的通信协议,客户端对服务器发出一个取得资源的请求,服务器将要求得资源响应给客户端,每次的联结只作为一次请求/响应,是一种很简单的通行协议,没有请求就没有响应。
HTTP协议之下,服务器是一个健忘的家伙,服务器响应客户端后,就不会记得客户端的信息,更不会去维护与客户端有关的状态,因此HTTP又称无状态的通行协议
区别
最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数,这也是get方法不安全的主要原因
因为在使用get请求数据的时候,浏览器会将请求的数据放在URL中,一些隐私信息容易被探测
当我们进行数据请求,用户名fan,密码fan
进行数据请求,大家会发现输入的用户名及密码会显示在URL中,不安全
而post通过request body传递参数,将不会直接暴露在URL中,这也是post比get安全的原因
GET在浏览器回退/刷新时是无害的,而post会再次提交数据
在这里要设计到get的幂等
幂等(idempotent、idempotence)是一个数学或计算机学概念,常见于抽象代数中。
幂等有一下几种定义:
对于单目运算,如果一个运算对于在范围内的所有的一个数多次进行该运算所得的结果和进行一次该运算所得的结果是一样的,那么我们就称该运算是幂等的。比如绝对值运算就是一个例子,在实数集中,有abs(a)=abs(abs(a))。
对于双目运算,则要求当参与运算的两个值是等值的情况下,如果满足运算结果与参与运算的两个值相等,则称该运算幂等,如求两个数的最大值的函数,有在在实数集中幂等,即max(x,x) = x。
所以当有持续性的刷新适合用GET方法
其他主要区别
1,GET方法只接受ASCLL字符,而POST没有限制,允许二进制。
2,GET在浏览器回退/刷新时是无害的,而post会再次提交数据
3,GET请求只能进行URL编码,而post支持多种编码方式
4,GET产生的URL地址可以被Bookmark,而POST不可以。
5,GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
6,ET请求在URL中传送的参数是有长度限制的,而POST么有。
其中浏览器的URL长度限制一般取决于浏览器,一般限制为2k,因为URL太长浏览器可能请求的数据可能接受不到,所以一般在HTML的表单中输入的字段长度不超过2k可以使用GET
其中GET在浏览器回退/刷新时是无害的,而post会再次提交数据
get与post的适用状态
符合下列条件适用于GET
1,请求是为了查找资源,HTML表单数据仅用来帮助搜索。
2, 请求结果无持续性的副作用。
3, 收集的数据及HTML表单内的输入字段名称的总长不超过1024个字符
符合下列条件适用于POST
1,请求的结果有持续性的副作用,例如,数据库内添加新的数据行。
2,若使用GET方法,则表单上收集的数据可能让URL过长。
3,要传送的数据不是采用7位的ASCII编码。
GET与POST的核心对比表
操作方式 | 数据位置 | 明文密文 | 数据安全 | 长度限制 | 应用场景 |
---|---|---|---|---|---|
GET | HTTP包头 | 明文 | 不安全 | 长度较小传输 | 查询数据 |
POST | HTTP正文 | 可明可密 | 安全 | 支持较大数据传输 | 修改数据 |