报文上的区别
GET 和 POST 只是 HTTP 协议中两种请求方式,所以在传输上,没有区别,因为HTTP 协议是基于 TCP/IP 的应用层协议
报文格式上,不带参数时,最大区别仅仅是第一行方法名不同,一个是GET,一个是POST。带参数时报文的区别呢?在约定中,GET方法的参数应该放在url中,POST方法参数应该放在body中。
举个例子,如果参数是 name=qiming.c, age=22。
GET 方法简约版报文可能是这样的:
GET /index.php?name=qiming.c&age=22 HTTP/1.1 Host: localhost
POST 方法简约版报文可能是这样的:
POST /index.php HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded name=qiming. c&age=22
传输数据的大小
在HTTP规范中,没有对URL的长度和传输的数据大小进行限制。但是在实际开发过程中,对于GET,特定的浏览器和服务器对URL的长度有限制。因此,在使用GET请求时,传输数据会受到URL长度的限制。
对于POST,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对POST提交数据大小进行限制,Apache、IIS都有各自的配置。
安全性
POST的安全性比GET的高。比如,在进行登录操作,通过GET请求,用户名和密码都会暴露再URL上,因为登录页面有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因,此时的用户名和密码就很容易被他人拿到了。除此之外,GET请求提交的数据还可能会造成Cross-site request frogery攻击。
深入理解
GET和POST都是http请求方式,底层都是TCP/IP协议;通常GET 产生一个TCP数据包;POST产生两个TCP数据包(但firefox是发送一个数据包),
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据)表示成功;
而对于POST,浏览器先发送header,服务器响应100, 浏览器再继续发送data,服务器响应200 (返回数据)。