HTTP请求
在浏览器表现上,资源代指可见、不可见的元素,包含图片、html、css等,构成了我们能够正常访问的页面。HTTP协议使用URI定位互联网上的资源,URI相当于资源在互联网中的地址,当客户端请求访问资源而发送请求时,URI需要将作为请求报文中的请求URI包含在内。
HTTP请求方法
根据请求资源的意图,可以将HTTP分为以下几种方法:
- GET:获取资源
- POST:提交要被处理的主体内容
- HEAD:与 GET 相同,但只返回 HTTP 报头,不返回主体内容
- PUT:传输文件,在主体中包含文件内容,保存到请求URI的指定位置
- DELETE:删除URI指定的资源
- OPTIONS:询问请求资源支持的方法
- CONNECT:把请求连接转换到透明的 TCP/IP 通道。
日常开发中,我们接触到最多的请求方法就是GET和POST,谈到它们的区别,首先想到的请求参数位置、安全性、浏览器表现等。
对比GET和POST请求的区别
从浏览器的表现
绝大多数场景下,浏览器作为发起HTTP请求的客户端,向客户端请求资源,不同请求方法对使用者带来最直观的区别是什么呢?
| GET | POST | |
|---|---|---|
| 书签 | 可以被收藏为书签 | 不可以被收藏为书签 |
| 历史记录 | 参数保留在浏览器历史中 | 参数不会保存在浏览器历史中 |
| 参数可见 | url显示参数 | 参数在提交表单中 |
| 缓存 | 浏览器主动缓存 | 除非手动设置,不会主动缓存 |
| 参数长度限制 | 受到浏览器或操作系统的长度限制 | 无限制 |
| 支持字符集 | ASCII | 没有限制。也允许二进制数据。 |
| 编码方式 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。 |
从服务器处理请求角度
| GET | POST | |
|---|---|---|
| 参数获取 | 请求url获取参数,cookie也可以当做参数传递的一种途径 | 需要Content-Type头区分不同的格式,再对主体进行解析 |
| 长度限制 | 出于对安全性和性能的考虑,多数服务器会限制url最大长度,但这不是HTTP标准要求的内容 | 无限制 |
安全性
前面提到,GET请求的参数显示在url中,而POST请求参数对使用者不可见,会有人想到POST比GET安全性更好。POST相对来说,比GET请求安全性好,因为不会缓存使用者输入的参数,其他人不会通过浏览历史获得数据。除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击。
从安全角度来说,在HTTP里,无论是POST和GET都是不安全的。
对于HTTP请求来说,因为都是通过明文传输,所以通过抓包工具获取具体传输的内容。因此,对于安全性有考虑的话,使用HTTPS更好一些,搜索引擎对HTTPS也更加友好。
下层协议--TCP
无论GET或者POST请求,最后都会经过TCP连接传输,不同请求方法对于TCP层来说会有影响么?
在一些浏览区或框架的实现中,的确会出现POST发送两次TCP请求,而GET请求只发送一次,但不是必然的。
HTTP协议中没有要求GET发送一个数据包;POST请求会先发送header,之后再发送data,会产生两个数据包。
从业务的角度考虑
从业务来说,保证接口的幂等性十分重要。简单解释一下幂等性,对于服务器资源来说,一次请求和重复请求对系统的影响是一致的。举个简单的例子,对于用户发起的充值10元,可能会因为网络延迟或恶意伪造等,会有两次一样的HTTP请求到达服务器,对于服务器来说,只会产生一次充值行为。
GET用于获取资源,应该是无副作用,安全和幂等的。
POST会对系统资源更新,应该认为保证幂等性。
参考文章:
HTTP 方法:GET 对比 POST
99%的人理解错 HTTP 中 GET 与 POST 的区别
GET和POST区别