POST请求的过程:
- 浏览器请求TCP连接(第一次握手)
- 服务器答应进行TCP连接(第二次握手)
- 浏览器确认,并发送POST请求头(第三次握手,这个报文比较小,所以HTTP会在此时进行
第一次数据发送) - 服务器返回100 continue响应
- 浏览器开始发送数据
- 服务器返回200 OK响应
GET请求的过程:
- 浏览器请求TCP连接(第一次握手)
- 服务器答应进行TCP连接(第二次握手)
- 浏览器确认,并发送GET请求头和数据(第三次握手,这个报文比较小,所以HTTP会在此时
进行第一次数据发送) - 服务器返回200 OK响应
GET请求:
请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接,URL的编码格式采用的是ASCII编码。
POST请求:
POST请求会把请求的数据放置在HTTP请求包的包体中。
传输数据的大小:
- 在HTTP规范中,没有对URL的长度和传输的数据大小进行限制。但是在实际开发过程中,对于GET,特定的浏览器和服务器对URL的长度有限制。因此,在使用GET请求时,传输数据会受到URL长度的限制。
- 对于POST,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对POST提交数据大小进行限制,Apache、IIS都有各自的配置。
安全性:
- POST的安全性比GET的高。这里的安全是指真正的安全,而不同于上面GET提到的安全方法中的安全,上面提到的安全仅仅是不修改服务器的数据。比如,在进行登录操作,通过GET请求,用户名和密码都会暴露再URL上,因为登录页面有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因,此时的用户名和密码就很容易被他人拿到了。除此之外,GET请求提交的数据还可能会造成Cross-site request frogery攻击。
效率:
- GET比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中。