前言
GET 和 POST 都是 HTTP 最常用的两种方法,两者在计算机网络中都有着举足轻重的地位,也有很多关于安全性,便利性方面的讨论
本篇文章,笔者会详尽的讨论两者的方方面面
GET
GET 用来获取资源
GET 方法简约版报文是这样的
GET /index.html?name=qiming.c&age=22 HTTP/1.1
Host: localhost
POST
POST 用来传递数据给服务器处理
POST 方法简约版报文是这样的
POST /index.html HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
name=qiming.c&age=22
区别
GET | POST | |
---|---|---|
后退按钮/刷新 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交) |
书签 | 可收藏为书签 | 不可收藏为书签 |
缓存 | 能被缓存 | 不能缓存 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded or multipart/form-data。为二进制数据使用多重编码 |
历史 | 参数保留在浏览器历史中 | 参数不会保存在浏览器历史中 |
对数据长度的限制 | 是的,当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符) | 无限制 |
对数据类型的限制 | 只允许 ASCII 字符 | 没有限制。也允许二进制数据 |
安全性 | 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET ! | POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中 |
可见性 | 数据在 URL 中对所有人都是可见的 | 数据不会显示在 URL 中 |
安全性
POST 比 GET 安全,因为数据在 URL 上不可见,不用担心被缓存,存储在本地 history 中...
但从传输的角度来说,他们都不安全,因为 HTTP 明文的特性,只要抓包就能知道所有信息
只有使用 HTTPS 才安全
便携性
GET 可以作为书签,可以保存在 history 中便于下一次输入
GET 回退没有任何问题,POST 回退会再次提交
GET 会被缓存,POST 不会
发送方式
对于 GET 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据)
对于 POST,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok
实际测试很多浏览器 POST 也只发一次
幂等性(Idempotent)
幂等的概念是指同一个请求方法执行多次和仅执行一次的效果完全相同。
按照RFC规范,PUT,DELETE和安全方法都是幂等的。同样,这也仅仅是规范,服务端实现是否幂等是无法确保的。引入幂等主要是为了处理同一个请求重复发送的情况,比如在请求响应前失去连接,如果方法是幂等的,就可以放心地重发一次请求。这也是浏览器在后退/刷新时遇到POST会给用户提示的原因:POST语义不是幂等的,重复请求可能会带来意想不到的后果。