首先来聊聊HTTP:
1.最初是浏览器与服务器之间的通讯协议,GET用于读取资源,POST用于提交表单。
2.后来被扩充到接口格式的定义,GET和POST作为接口的请求方式。
浏览器利用GET请求来读取一个资源,例如HTML页面 样式文件 JS文件和图片等等
利用POST来提交一个表单 同时得到一个结果反馈页
后来,HTTP被广泛运用到AJAX接口定义上,GET和POST则用于定义具体的请求方式
{
Method:{GET/POST}
Url:{http://xxx/x}
Header:{}
Body:{}
}
协议本身并没有强制要求GET请求的参数一定要放query,POST请求的参数一定要放body
也就是说,从接口定义的角度去看,GET和POST纯粹只是一个请求方式的差异,协议本身并没有针对两者做过多的限制,完全可以把GET请求的参数放到body或把POST请求的参数放到query
但是当约定过度的开放时,会增加项目开发的沟通成本,降低开发效率
然后就是大家经常说的 GET请求有长度上限,POST传输无上限?
其实这种说法是比较片面的
//GET请求:
http://xxx/xx?a=1&b=2
//POST请求:
http://xxx/xx
body:{
a:1,
b:2
}
GET请求有长度上限的本质原因是因为GET的参数一般约定俗成放在URL的query中,而又因为URL的长度有上限,因此得出了这个结论。
关于URL的长度,HTTP没有对GET和POST做过多的限制,只是浏览器和服务端的不同分别做了不同程度的限制而已,例如IE浏览器限制在2048个字符,谷歌浏览器限制在2M个,其他浏览器也有相应的规定。
为什么要做限制?
原因是服务端解析一个字符串时,需要分配内存,而URL必须作为一个整体去看待,无法将它分块处理,于是必须预先分配一块足够大的内存来存储URL,如果URL太长或并发量高的话,就有可能会挤爆服务器的内存。这个才是GET请求有上限的底层原因!
最后就是POST并没有比GET安全
常常可以看到有人说POST请求比GET请求更加安全,其实是错误的,正如前面所说,可以了解到GET POST本质上并无区别,只是约定的规范而已,大家只是更倾向于把GET请求的参数放在query中,POST请求的参数放到body上,这样相对于GET请求的参数直接放到了URL上,如果带有密码或隐私信息,直观上看的确显得不安全,但其实对于网络安全的角度而言,query和body上的参数都是明文的,HTTP本身就是不安全的协议,请求在任何一个网络节点被劫持,内容对于劫持的人来说都是透明的,GET和POST只是请求方式的不同,本身并不对安全起任何作用。真正要做到安全需要双端加密,如HTTPS双端加密后,即使在任何网络节点截取到了包也截取不了内容,这才是本质上的安全。