GET or POST ?

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的区别