post和get的区别
get和post是http与服务器交互的一种方式
- 一共有四种方式: put、delete、 post、get、他们对应增删改查;
区别
get把请求的数据放在url上,即HTTP协议头上,其格式为:
以?分割URL和传输数据key=value的形式,用&连接参数
如果是空格,转换为+,
post把数据放在HTTP的包体内(requrest body)
GET 用于获取信息,是无副作用的且幂等的,且可缓存 POST 用于修改服务器上的数据,有副作用,非幂等,不可缓存
数据传输大小
1、get提交的数据最大是2k(原则上url长度无限制,那么get提交的数据也没有限制,制实际上取决于浏览器,(大多数)浏览器通常都会限制url长度在2K个字节,即使(大多数)服务器最多处理64K大小的url)
2、 post理论上没有限制。实际上IIS4中最大量为80KB,IIS5中为100KB。
GET产生一个TCP数据包,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
POST产生两个TCP数据包,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
安全性
post的安全性比get的安全性高
GET在浏览器回退时是无害的,POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET只接受ASCII字符的参数的数据类型,而POST没有限制
get 和post请求报文的区别
GET 和 POST 只是 HTTP 协议中两种请求方式(异曲同工),而 HTTP 协议是基于 TCP/IP 的应用层协议,无论 GET 还是 POST,用的都是同一个传输层协议,所以在传输上,没有区别。
报文格式上,不带参数时,最大区别就是第一行方法名不同, 仅仅是报文的几个字符不同而已
POST 方法请求报文第一行 POST /url HTTP/1.1
GET 方法请求报文第一行 GET /url HTTP/1.1
带参数时报文的区别
在约定中,GET 方法的参数应该放在 url 中,POST 方法参数应该放在 body 中
举个例子,如果参数是 name=Javanx, age=25。
GET 方法报文
GET /updateInfo?name=Javanx&age=25 HTTP/1.1 Host: localhost·
POST 方法报文
POST /updateInfo HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded name=Javanx&age=25
现在我们知道了两种方法本质上是 TCP 连接,没有区别。其实不按规范来也是可以的,可以在 URL 上写参数,然后方法使用 POST;也可以在 Body 写参数,然后方法使用 GET。当然,这需要服务端支持。
GET 方法参数写法是不固定的
在约定中,我们的参数是写在 ? 后面,用 & 分割。
但在解析报文的过程是通过获取 TCP 数据,用正则等工具从数据中获取 Header 和 Body,从而提取参数。
比如header请求头中添加token,来验证用户是否登录等权限问题。
也就是说,可以自己约定参数的写法,只要服务端能够解释出来就行
GET 方法的长度限制?
首先,HTTP 协议没有 Body 和 URL 的长度限制,对 URL 限制的大多是浏览器和服务器的原因。
服务器是因为处理长 URL 要消耗比较多的资源,为了性能和安全(防止恶意构造长 URL 来攻击)考虑,会给 URL 长度加限制。
POST 方法比 GET 方法安全?
有人说POST 比 GET 安全,因为数据在地址栏上不可见。
然而,从传输的角度来说,他们都是不安全的,因为 HTTP 在网络上是明文传输的,只要在网络节点上捉包,就能完整地获取数据报文。
要想安全传输,就只有加密,也就是 HTTPS
。
POST 方法会产生两个 TCP 数据包
post 会将 header 和 body 分开发送,先发送 header,服务端返回 100 状态码再发送 body。
HTTP 协议中没有明确说明 POST 会产生两个 TCP 数据包,而且实际测试(Chrome)发现,header 和 body 不会分开发送。
所以,header 和 body 分开发送是部分浏览器或框架的请求方法,不属于 post 必然行为。