最近在做需求时处理了关于HTTP请求方法的问题,在此写篇博客做一下记录
HTTP简述
HTTP,即超文本传输协议(HyperText Transfer Protocol),互联网上应用最为广泛的一种网络协议,是一个以request-response(请求-回复)形式工作的应用层协议。
在客户端向服务器发起一个HTTP请求的时候,我们可以选择相应的请求方法,其中最为常用的方法,就是GET方法与POST方法。
GET方法
在使用GET方法发送HTTP请求时,一般而言,查询的键值对参数被附加在url地址的后面:
1 | /test/demo_form.asp?name1=value1&name2=value2 |
GET请求具有如下特点:
- GET 请求可被缓存
- GET 请求保留在浏览器历史记录中
- GET 请求可被收藏为书签
- GET 请求不应在处理敏感数据时使用
- GET 请求有长度限制
- GET 请求只应当用于取回数据
POST方法
在使用POST方法发送HTTP请求时,一般而言,查询的键值对参数是添加在HTTP消息主体中发送的:
1 | POST /test/demo_form.asp HTTP/1.1 |
POST请求具有如下特点:
- POST 请求不会被缓存
- POST 请求不会保留在浏览器历史记录中
- POST 不能被收藏为书签
- POST 请求对数据长度没有要求
GET方法与POST方法对比
方法 | GET | POST |
---|---|---|
后退按钮/刷新 | 没影响 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交) |
书签 | 可收藏为书签 | 不可收藏为书签 |
缓存 | 可缓存 | 不可缓存 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。 |
历史记录 | 参数保留在浏览器历史中 | 参数不会保留在浏览器历史中 |
对参数数据长度的限制 | 当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符) | 无限制 |
对数据类型的限制 | 只允许 ASCII 字符 | 没有限制,也允许二进制数据 |
安全性 | 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分 | POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中 |
可见性 | 数据在 URL 中对所有人都是可见的 | 数据不会显示在 URL 中 |
对于两种方法安全性的思考:其实如果对于能够通过Fiddler或者Charles工具抓包的童鞋而言,两种方法其实都相当于是明文传输,都不安全。只不过POST方法由于参数在HTTP请求主体中,一般而言在浏览器上不容易看到,相对安全
对于两种方法参数传输的思考:
GET方法和POST方法与数据如何传递没有关系
GET和POST是由HTTP协议定义的。在HTTP协议中,Method和Data(url, body, header)是正交的两个概念,也就是说,使用哪个Method与应用层的数据如何传输是没有相互关系的
HTTP没有要求,如果Method是POST数据就要放在body中。也没有要求,如果Method是GET,数据(参数)就一定要放在URL中而不能放在BODY中
HTTP协议对GET和POST都没有对长度的限制
HTTP协议明确地指出了,HTTP头和Body都没有长度的要求。而对于url长度上的限制,有两方面的原因造成:
- 浏览器。据说早期的浏览器会对URL长度做限制。据说IE对url长度会限制在2048个字符内。
- 服务器。url长了,对服务器处理也是一种负担。过长的url会增加服务器的解析时间,因此多数服务器出于安全以及稳定方面的考虑,会给url长度加限制。但是这个限制是针对所有HTTP请求的,与GET、POST没有关系。