本质区别:GET 产生一个数据包,POST 产生两个数据包。
1、功能上讲,GET 一般用来从服务器上获取资源,POST 一般用来更新服务器上的资源;
2、从请求参数形式上看,GET 请求的数据会附在 URL 之后,即将请求数据放置在 HTTP 报文的 请求头 中,而 POST 请求会把提交的数据放置在是 HTTP 请求报文的 请求体 中;
3、就安全性而言,POST 的安全性要比 GET 的安全性高,因为 GET 请求提交的数据将明文出现在 URL 上,而且 POST 请求参数则被包装到请求体中,相对更安全;
4、从请求的大小看,GET 请求的长度受限于浏览器或服务器对 URL 长度的限制,允许发送的数据量比较小,而 POST 请求则是没有大小限制的。
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST没有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。
由于HTTP的规定和浏览器/服务器的限制,导致它们在应用过程中体现出一些不同。
GET | POST | |
---|---|---|
后退按钮/刷新 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交) |
缓存 | 能被缓存 | 不能缓存 |
编码方式 | 只能进行url编码 | 支持多种编码方式 |
是否保留在浏览历史 | 参数保留在浏览器历史中 | 参数不会保存在浏览器历史中。 |
对数据长度的限制 | 发送数据,GET 方法向 URL 添加数据,但URL的长度是受限制的 | 无限制 |
对数据类型的限制 | 只允许 ASCII 字符 | 没有限制,也允许二进制数据 |
安全性 | 安全性较差,因为参数直接暴露在 url 中 | 因为参数不会被保存在浏览器历史或 web 服务器日志中。 |
可见性 | 数据在 URL 中对所有人都是可见的 | 数据不会显示在 URL 中。 |
传参方式 | get参数通过 url 传递 | post放在request body中。 |