1.设计初衷
- GET:核心目的是获取资源,属于 “查询操作”。遵循 “安全无副作用” 原则 —— 仅读取数据,不修改服务器状态(如查询用户信息、加载图片)。具备幂等性:多次发送相同请求,服务器返回结果一致(不会重复创建 / 修改资源)
- POST:核心目的是提交数据,属于 “写操作”。会修改服务器状态(如注册用户、发布文章),存在副作用。不具备幂等性:多次发送相同请求,可能产生重复效果(如重复提交订单)
2. 数据传输:位置、格式与限制
| 特性 | Get | Post |
|---|---|---|
| 数据位置 | 拼接在 URL 末尾(查询字符串,格式为key=value&key2=value2) | 放在请求体(Body)中,支持多种格式(FormData、JSON、XML 等) |
| 数据长度限制 | 受浏览器 / 服务器限制(多数浏览器 URL 长度上限 2048 字符),HTTP 协议本身无限制 | 无明确长度限制(仅受服务器配置约束),适合传输大量数据 |
| 数据可见性 | 参数暴露在 URL 中,肉眼可直接查看 | 参数隐藏在请求体中,URL 无体现 |
| 数据格式限制 | 仅支持 ASCII 字符,特殊字符需 URL 编码(如空格→%20) | 支持任意字符(包括二进制数据),可直接传输文件、JSON 等复杂数据 |
3. 缓存与历史:可复用 vs 不可复用
- GET:支持浏览器缓存(会被存储在缓存数据库)、可添加为书签、记录在浏览器历史中。优势:重复请求可直接使用缓存,减少服务器压力,提升访问速度。
- POST:默认不被缓存,不会存入浏览器历史,无法添加为书签。原因:POST 是写操作,缓存可能导致重复提交,历史记录可能泄露敏感数据。
4. 安全性:表面安全 vs 相对安全
- GET:安全性低。参数暴露在 URL 中,易被日志记录(服务器日志、代理日志)、网络嗅探捕获,不适合传输敏感数据(密码、令牌、银行卡号)。
- POST:安全性更高(非绝对安全)。参数隐藏在请求体中,不易被直接捕获,但未加密的 POST 数据仍可能被中间人拦截破解。关键提醒:无论 GET 还是 POST,敏感数据都需搭配 HTTPS 加密传输。
5. 其他关键差异
| 特性 | GET | POST |
|---|---|---|
| 浏览器后退 / 刷新 | 无副作用(重复查询) | 可能触发重复提交(需做防重放处理) |
| 请求次数 | 通常一次请求(直接发送请求体) | 可能两次请求(先发送 OPTIONS 预检请求,再发送正式请求) |
| 协议规范 | 建议仅用于查询,不允许携带请求体(部分服务器不支持) | 用于提交数据,可灵活搭配请求体格式 |
| 幂等性 | 幂等(多次请求效果一致) | 非幂等(多次请求可能产生不同结果) |