GET和POST的请求的区别
GET 和 POST 是 HTTP 请求的两种基本方法。
最直观的区别就是 GET 把参数包含在 URL 中,POST 通过 request body 传递参数。
GET 在浏览器回退时是无害的,而 POST 会再次提交请求。
GET 产生的 URL 地址可以被 Bookmark ,而 POST 不可以。
GET 请求会被浏览器主动 cache,而 POST 不会,除非手动设置。
GET 请求只能进行 url 编码,而 POST 支持多种编码方式。
GET 请求参数会被完整保留在浏览器历史记录里,而 POST 中的参数不会被保留。
GET 请求在 URL 中传送的参数是有长度限制的(2K 个字节),而 POST 没有。
对参数的数据类型,GET 只接受 ASCII 字符,而 POST 没有限制。
GET 比 POST 更不安全,因为参数直接暴露在 URL 上,所以不能用来传递敏感信息。
GET 参数通过 URL 传递,POST 放在 Request body 中。
GET 产生一个 TCP 数据包,POST 产生两个 TCP 数据包。
对于 GET 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据);
而对于 POST,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)。
因为 POST 需要两步,时间上消耗的要多一点,看起来 GET 比 POST 更有效。
因此 Yahoo 团队有推荐用 GET 替换 POST 来优化网站性能。但这是一个坑,跳入需谨慎。
GET 与 POST 都有自己的语义,不能随便混用。
据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的 TCP 在验证数据包完整性上,有非常大的优点。
并不是所有浏览器都会在 POST 中发送两次包,Firefox 就只发送一次。
HTTP 只是个行为准则,而 TCP 才是 GET 和 POST 怎么实现的基本。
HTTP 是基于 TCP/IP 的关于数据如何在万维网中如何通信的协议。
HTTP 的底层是 TCP/IP。所以 GET 和 POST 的底层也是 TCP/IP,也就是说,GET/POST 都是 TCP 链接。GET 和 POST 能做的事情是一样一样的。你要给 GET 加上 request body,给 POST 带上 url 参数,技术上是完全行的通的。
如果在 GET 请求的 request body 里添加了数据,不同服务器会有不同的处理方式,有的会读取,有的忽略。
所以,虽然 GET 可以带 request body,也不能保证一定能被接收到。