1. 定义
GET 和 POST 是 HTTP 协议中两种发送请求的方法。
HTTP 是基于 TCP/IP 的关于数据如何在万维网中通信的协议。
HTTP 的底层是 TCP/IP,所以 GET 和 POST 这两种方法的底层也是 TCP/IP。也就是说,GET 和 POST 都是 TCP 链接,它们能做的事情是一样的。
在万维网的世界里,TCP 就是汽车,用来运输数据。但是无论大件小件,紧急非紧急的都用一样的汽车,一样的速度来运输,效率会很低下。
这个时候,HTTP 协议(交管部门)诞生了,它给汽车运输设置了不同的服务类别,有 GET、POST、PUT、DELETE 等。
当执行 GET 请求时,把货物(数据)放到小汽车的车顶上(url 中),当然也可以在后备箱里(request body)塞大件(这样很吃力)。
当执行 POST 请求时,把货物(数据)放到货车的车厢里(request body),当然也可以放车顶(url)上(傻傻傻)。
此外,汽车是分属于不同运输公司(不同的浏览器和服务器)的,运输公司在 HTTP 协议的基础上,也对汽车运输货物(数据)进行了限制,比如 GET 方法运输数据时,大小是有限制的,大多数浏览器通常将 url 限制在 2k 个字节内,大多数服务器将 url 限制在 64k 字节内;另外,如果你在小汽车后备箱塞了大件,有的服务器会帮你卸货,有的就不会,所以最好还是按规定来。
总结:GET 和 POST 本质上是 TCP 链接,并无差别。但是 HTTP 协议以及浏览器/服务器对它们进行了分工和限制,就导致它们在功能和用途上有差别。
2. 具体比较
GET | POST | |
---|---|---|
回退、刷新 | 无害 | 数据会被重复提交 |
缓存 | 能被缓存 | 不能被缓存 |
书签 | 能收藏为书签 | 不能收藏为书签 |
历史记录 | 参数保留在历史记录中 | 参数不会保存在历史记录中 |
对长度限制 | 有限制 | 无限制 |
数据类型 | 只允许 ASCII 字符 | 没有限制,二进制也允许 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded或者multipart/form-data。为二进制数据使用多重编码 |
安全性 | 数据在 URL 中,对所有人可见,安全性差。在发送密码和敏感信息时绝对不要用 | 数据在请求体中,不会保存在缓存和记录中,安全性强 |
本文参考:
【1】 99%的人都理解错了HTTP中GET与POST的区别