3. GET 和 POST 区别怎么回答
GET 和 POST 的区别,是接口测试和网络协议面试中最常被问到的问题之一。很多同学会背:“GET 参数放 URL,POST 参数放 Body;GET 不安全,POST 安全;GET 有长度限制,POST 没有。”这些说法有一定道理,但如果只这么回答,容易被面试官继续追问。测试岗位更应该从接口设计、参数位置、缓存、幂等性、安全风险、抓包分析和项目测试场景来回答。
严格来说,GET 和 POST 都是 HTTP 请求方法。它们的区别不是“一个能传参,一个不能传参”,而是语义和使用场景不同。GET 更偏向获取资源,POST 更偏向提交数据或产生业务动作。测试工程师理解这一点,才能在接口测试中判断请求方法是否合理,设计参数测试、重复提交测试和安全测试。
一、GET 和 POST 的基本区别
1. 语义不同
GET 用于获取资源,比如查询商品列表、查询订单详情、获取用户信息。
POST 用于提交数据,比如登录、创建订单、提交表单、上传文件、支付请求。
语义是最重要的区别。接口设计应该尽量符合语义,便于理解和维护。
2. 参数位置不同
GET 参数通常放在 URL 查询字符串中:
/api/orders?page=1&size=10
POST 参数通常放在请求体中:
{
"username": "tester",
"password": "123456"
}
但这不是绝对的。POST 也可以带 URL 参数,GET 理论上也可以有 Body,只是实际项目中很少这么用。
3. 缓存行为不同
GET 请求更容易被浏览器、代理或网关缓存,因为它语义上是查询资源。
POST 通常不会被默认缓存,因为它可能改变服务端数据。
测试中如果查询接口数据不刷新,要考虑是否存在缓存。
4. 幂等性不同
GET 通常应该是幂等的,也就是多次请求不应该改变服务端状态。
POST 通常可能改变服务端状态,比如创建订单,多次请求可能创建多条数据。
但注意:幂等性是接口设计语义,不是 HTTP 强制保证。即使是 POST,也可以通过业务幂等设计保证重复提交不产生重复数据。
5. 安全性理解要准确
很多人说“GET 不安全,POST 安全”,这不严谨。
GET 参数在 URL 中,更容易出现在浏览器历史、日志、代理记录里,所以不适合传密码、Token、身份证号等敏感信息。
POST 参数在 Body 中,不会直接出现在 URL,但如果使用 HTTP 明文传输,也一样可能被抓包看到。真正保护传输安全的是 HTTPS,不是 POST 本身。
二、测试中怎么判断该用 GET 还是 POST
1. 查询类接口适合 GET
例如:
GET /api/products
GET /api/orders/{id}
GET /api/users/profile
这些接口主要是查询数据,不应该改变服务端状态。
2. 创建或提交类接口适合 POST
例如:
POST /api/login
POST /api/orders
POST /api/payments
POST /api/files/upload
这些接口会提交数据、创建资源或触发业务动作。
3. 修改类接口可以用 PUT/PATCH
虽然本题问 GET 和 POST,但实际接口设计中更新资源常用 PUT 或 PATCH。
测试中如果所有接口都用 POST,也不是绝对错误,但需要看团队接口规范。
三、GET 请求测试重点
1. 参数组合
查询接口通常有分页、筛选、排序参数。测试要覆盖:
- page 为空;
- size 过大;
- 查询关键字为空;
- 排序字段非法;
- 日期范围错误;
- 多条件组合。
2. URL 编码
GET 参数在 URL 中,如果包含中文、空格、特殊字符,需要正确编码。
例如搜索关键字包含 测试 空格、&、?,都要验证。
3. 缓存问题
查询结果不更新时,要考虑浏览器缓存、网关缓存、Redis 缓存。
4. 敏感信息泄露
GET URL 不应包含密码、Token、身份证号等敏感信息。
四、POST 请求测试重点
1. 请求体格式
POST 常用 JSON、form-data、x-www-form-urlencoded。
测试要确认 Content-Type 和实际请求体一致。
2. 必填字段
比如登录接口 username、password;创建订单接口 productId、quantity、addressId。
3. 字段类型
数字传字符串、数组传对象、布尔值传字符串,都可能导致后端解析异常。
4. 重复提交
POST 常用于创建或提交,因此要重点测重复提交。例如:
- 重复创建订单;
- 重复支付;
- 重复提交表单;
- 重复点击按钮。
5. 请求体过大
上传、批量导入、大文本提交时,要测试大小限制和错误提示。
五、项目场景:登录接口为什么用 POST
登录接口通常传用户名和密码。如果用 GET:
/api/login?username=tester&password=123456
密码会出现在 URL 中,可能被浏览器历史、网关日志、服务器访问日志记录,不安全。
所以登录一般用 POST,并且必须使用 HTTPS。
但要注意,POST 不是绝对安全。如果还是 HTTP,抓包仍然能看到 Body 中的密码。因此正确说法是:登录接口应该使用 POST 提交请求体,并通过 HTTPS 保障传输安全。
六、项目场景:查询订单为什么用 GET
查询订单详情通常是:
GET /api/orders/NO10001
它只是读取订单信息,不应该改变订单状态。测试要关注:
- 订单号存在;
- 订单号不存在;
- 查询别人的订单是否越权;
- 未登录是否返回 401;
- 无权限是否返回 403;
- 响应字段是否正确。
GET 请求也需要鉴权,不是查询接口就一定开放。
七、项目场景:创建订单为什么用 POST
创建订单会改变服务端数据,所以适合 POST。
测试重点:
- 商品是否存在;
- 库存是否足够;
- 地址是否有效;
- 优惠券是否可用;
- 重复提交是否幂等;
- 创建成功后数据库是否生成订单;
- 库存是否扣减或锁定。
POST 请求重点不只是参数校验,还要验证业务数据变化。
八、常见误区
1. GET 一定不能有 Body
规范上没有绝对禁止,但实际项目中很少使用 GET Body,很多服务器或代理也可能不支持。因此测试中不要设计依赖 GET Body 的接口。
2. POST 一定比 GET 安全
不严谨。POST 参数不在 URL 中,但如果没有 HTTPS,仍可能被抓包看到。安全要结合 HTTPS、鉴权、权限控制、敏感信息处理。
3. GET 不能传中文
可以传,但需要 URL 编码。测试要验证编码和服务端解析。
4. GET 只用于小数据,POST 用于大数据
参数长度是一个实际限制,但不是最本质区别。本质区别是语义和是否改变服务端状态。
5. POST 可以随便重复提交
POST 常常产生业务动作,重复提交必须测试幂等和防重。
九、面试回答模板
如果面试官问“GET 和 POST 区别”,可以这样回答:
GET 和 POST 都是 HTTP 请求方法,主要区别是语义和使用场景不同。GET 一般用于查询资源,参数通常放在 URL 上,适合订单查询、列表查询这类不改变服务端状态的接口;POST 一般用于提交数据或创建资源,参数通常放在请求体中,适合登录、创建订单、支付、上传文件等场景。GET 请求更容易被缓存,参数也容易出现在浏览器历史和日志中,所以不适合传敏感信息。POST 参数虽然不在 URL 上,但也不代表绝对安全,真正保障传输安全要靠 HTTPS。测试时我会关注请求方法是否符合接口语义,GET 查询参数是否正确编码,POST 的 Content-Type、请求体、必填字段、字段类型和重复提交幂等性是否正确。
十、常见追问
追问:GET 和 POST 哪个更安全?
不能简单说 POST 更安全。GET 参数暴露在 URL 中风险更高,但 POST 如果走 HTTP 明文也不安全。敏感接口应该使用 HTTPS,并避免敏感信息出现在 URL 中。
追问:GET 是否有长度限制?
HTTP 协议本身没有明确规定 GET URL 长度限制,但浏览器、服务器、代理可能有限制,所以大参数不适合放 URL。
追问:POST 能不能被缓存?
默认通常不缓存,但通过特定缓存控制也可能缓存。测试中一般把 GET 作为更容易被缓存的请求关注。
追问:创建订单重复点两次怎么办?
要看后端是否做幂等、防重、库存锁定和订单唯一性控制。POST 接口要重点测重复提交。
十一、简历怎么写
可以写:
熟悉 GET、POST 等 HTTP 请求方法的使用场景,能够根据接口语义设计查询、提交、重复提交、鉴权和参数校验测试用例。
项目化写法:
在订单接口测试中,针对 GET 查询接口验证分页、筛选、越权和缓存问题;针对 POST 创建订单接口验证必填字段、参数类型、库存不足和重复提交幂等性。
十二、练习清单
- 用 Postman 发送 GET 请求;
- 用 Postman 发送 POST JSON 请求;
- 查看 GET 参数在 URL 中的位置;
- 查看 POST Body 和 Content-Type;
- 测试 GET 中文参数编码;
- 测试 POST 必填字段为空;
- 测试重复提交订单;
- 检查登录接口是否使用 POST + HTTPS;
- 判断接口方法是否符合语义;
- 准备 GET 和 POST 面试回答。
GET 和 POST 的区别,不能只背“参数位置不同”。测试回答要结合接口语义、参数测试、缓存、安全、幂等和项目场景来讲。
配套刷题:

