GET vs POST


前言

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语义不是幂等的,重复请求可能会带来意想不到的后果。

参考


文章作者: Mou shuai
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Mou shuai !
评论
  目录