表象
下表是w3school提供的GET与POST的区别:
GET | POST | |
---|---|---|
后退按钮/刷新 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交) |
书签 | 可收藏为书签 | 不可收藏为书签 |
缓存 | 能被缓存 | 不能缓存 |
编码类型 | application/x-www-form-urlencoded |
application/x-www-form-urlencoded 或 multipart/form-data 。为二进制数据使用多重编码 |
历史 | 参数保留在浏览器历史中 | 参数不会保存在浏览器历史中 |
发送数据 | 通过URL | 通过 request body |
对数据长度的限制 | 当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符) | 无限制 |
对数据类型的限制 | 只允许 ASCII 字符 | 没有限制。也允许二进制数据 |
安全性 | 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分,在发送密码或其他敏感信息时绝不要使用 GET | POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中 |
可见性 | 数据在 URL 中对所有人都是可见的 | 数据不会显示在 URL 中 |
这些“标准答案”其实只能算是GET和POST的表象区别。
本质
GET
和POST
是什么?HTTP
协议中的两种发送请求的方法。HTTP
是什么?HTTP
是基于TCP/IP
的关于数据如何在万维网中通信的协议。HTTP
的传输层是TCP
,也就是说,不管是GET
还是POST
都是通过TCP
传输数据的。GET
和POST
能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。也就是说语法上它们没有区别,都可以在URL中携带参数,在请求主体中携带参数。
那么他们的区别到底在哪里呢?答案是语义,虽然语法上它们完全一样,但是HTTP协议为不同方法规定了不同的语义。
以下是HTTP协议中规定的几种方法在语义上的区别:
方法 | 幂等(多次请求无副作用) | 安全(不改变资源) | 可缓存 | 用法 |
---|---|---|---|---|
GET | 幂等 | 安全 | 是(与缓存相结合的还有条件获取) | 获取URI指定的资源 |
POST | 不幂等 | 不安全 | 否 | 使用服务端管理的标识创建资源;向指定资源提交数据,请求服务器处理,更新部分资源 |
PUT | 幂等 | 不安全 | 否 | 将封闭实体的资源存储在请求的URI之下:资源标识由客户端指定,资源不存在则创建,存在则更新 |
DELETE | 幂等 | 不安全 | 否 | 删除URI指定的资源 |
协议只是期望大家都来遵守的规范,但是协议不等于实现,实践中你可以只用POST实现增删改,甚至用GET实现增删改也没人拦你。
前文所述的表象区别也正是浏览器基于HTTP协议规范,对GET和POST请求做出的不同对待。