一、核心定义与用途
请求方法 |
核心定义 |
典型用途 |
---|---|---|
GET |
从服务器获取资源,请求参数附加在 URL 中 |
1. 搜索(如百度搜索关键词) |
POST |
向服务器提交资源 / 数据,请求参数放在请求体(Body)中 |
1. 表单提交(如登录、注册) |
二、底层原理:HTTP 请求结构差异
HTTP 请求由「请求行 + 请求头 + 空行 + 请求体」组成,二者核心差异在参数承载方式与请求体使用:
组成部分 |
GET 请求特点 |
POST 请求特点 |
---|---|---|
请求行 |
参数拼接到 URL 后,格式: |
URL 仅含路径,无参数,格式: |
请求头 |
无需指定 |
必须指定 |
请求体(Body) |
空(手动添加也会被多数服务器忽略) |
非空,承载所有请求数据,格式由 |
三、关键区别对比(7 大维度)
对比维度 |
GET 请求 |
POST 请求 |
---|---|---|
数据位置 |
URL 后( |
请求体(Body)中,URL 不可见 |
数据长度 |
受 URL 长度限制(浏览器 / 服务器通常约 2KB~8KB) |
无明确限制,可传大体积数据(如文件) |
数据类型 |
仅支持 ASCII 字符(非 ASCII 需 URL 编码) |
支持任意类型(文本、二进制、JSON 等) |
缓存性 |
可被浏览器 / CDN 缓存(如刷新用缓存) |
默认不缓存,需手动配置 |
安全性 |
数据暴露在 URL(浏览器历史、日志可见) |
数据隐藏在请求体,需配合 HTTPS 才真正安全 |
幂等性 |
幂等(多次请求结果一致,无副作用) |
非幂等(多次请求可能产生不同结果,如重复下单) |
后退 / 刷新 |
刷新无提示,无风险 |
刷新提示 “重新提交”,可能重复触发操作 |
四、数据传递细节
1. GET 请求:URL 参数限制与编码
参数编码:非 ASCII 字符(中文、
@#&
)需 URL 编码(如 “手机”→%E6%89%8B%E6%9C%BA
),否则乱码 / 请求失败。长度限制本质:HTTP 无限制,是浏览器 / 服务器限制(Chrome 约 2KB~8KB,Nginx 默认 4KB)。
参数可见风险:记录在浏览器地址栏、历史记录、服务器日志,绝对不能传敏感数据(密码、手机号)。
2. POST 请求:请求体格式(按 Content-Type 区分)
Content-Type 类型 |
数据格式示例 |
典型用途 |
---|---|---|
|
|
普通表单提交(登录、注册) |
|
含文本参数 + 二进制文件(用 Boundary 分隔) |
文件上传(头像、Excel) |
|
|
前后端分离接口(复杂结构化数据) |
|
|
纯文本传递(极少用) |
长度限制:HTTP 无限制,服务器会配置上限(Nginx 默认 1MB,Spring Boot 默认 10MB,可调整)。
五、实践场景:使用边界
1. 必须用 GET 的场景
缓存依赖:需浏览器 / CDN 缓存(如电商商品列表
?category=3&page=2
),减少服务器压力。书签 / 分享:参数需在 URL 中(如知乎回答页
https://zhihu.com/question/123/answer/456
),支持保存 / 分享。幂等要求:多次请求结果一致(如查用户信息
/api/user?id=123
、查订单/api/order?no=20240815
)。
2. 必须用 POST 的场景
敏感数据:密码、银行卡号等(即使加密也不能放 URL,如登录接口传
password
、支付接口传bankCardNo
)。大体积数据:超过 URL 长度(如 5MB 头像)、二进制文件(如视频)。
非幂等操作:多次请求有副作用(如创建订单、支付扣款、发短信),需后端做 “防重复提交”(加 token)。
六、安全性误区澄清
“POST 比 GET 更安全”:需加前提 —— 未用 HTTPS 时,二者都不安全(GET 抓包看 URL,POST 抓包看请求体);真正安全依赖 HTTPS 加密整个请求。
“GET 不能传复杂数据”:技术上可传数组(
?ids=1&ids=2
),但易超 URL 长度、可读性差,复杂数据(嵌套对象、数组)必须用 POST + JSON。“POST 不会被缓存”:默认不缓存,可手动设响应头(
Cache-Control: max-age=3600
),但仅适用于 “非幂等 POST”(如查固定配置/api/config
),禁止用于创建 / 修改接口。
七、示例对比(直观理解)
示例 1:GET 查商品列表
请求行:
GET /api/goods?category=手机&page=2&pageSize=10 HTTP/1.1
请求体:空
关键特点:URL 含参数,可缓存,幂等,无敏感数据。
示例 2:POST 用户登录(HTTPS 加密)
请求行:
POST /api/user/login HTTP/1.1
请求头:
Content-Type: application/json
请求体:
{"username":"admin123","password":"Abc@123456"}
关键特点:参数在请求体,不缓存,非幂等,敏感数据需加密。
八、核心决策清单(开发时判断步骤)
操作类型:“获取数据”→GET,“提交数据”→POST;
数据特性:敏感 / 超 URL 长度 / 二进制→POST;
场景需求:需缓存 / 分享 / 幂等→GET;
最后检查:敏感接口是否用 HTTPS?非幂等 POST 是否加防重复提交 token?