在很多 Spring Boot 项目中,开发接口时最常见的问题之一就是:什么时候该用 GET,什么时候该用 POST?
从表面上看,这只是 HTTP 请求方式的选择。但在真实开发中,如果没有清晰的边界,接口设计会慢慢变得混乱,比如:
- 查询接口用 POST
- 删除接口用 GET
- 复杂查询参数塞在 URL 里
- 所有接口全部用 POST
这些写法短期内似乎“能用就行”,但从系统设计角度来看,其实已经偏离了 HTTP 语义设计原则。本文就从实际开发经验出发,聊一聊 Spring Boot 中 GET 和 POST 的使用边界。
1. HTTP 方法的语义本质
HTTP 协议在设计时,并不是随便定义几个请求方式。每一种方法都对应一种 语义(Semantic)。
最常见的两种:
- GET: 用于 获取资源(Read)
- POST: 用于 提交数据(Create / Process)
简单理解:
GET = 查询数据
POST = 提交数据
这看起来很简单,但真正的关键在于两个概念:
安全性(Safe)
幂等性(Idempotent)

2. GET 的核心特点
1、GET 是安全方法(Safe)
安全方法意味着:请求不会改变服务器状态。
例如:
GET /users
GET /orders/1001
GET /products?page=1
这些请求只是读取数据。
服务器执行 1 次或 100 次,系统状态不会发生变化。
2、GET 是幂等的
幂等的意思是:
执行一次 和 执行多次
结果相同
例如:
GET /users/1
请求 10 次,返回的数据是一样的。
3、GET 参数在 URL 中
GET 的参数通常通过 URL 传递:
/users?id=1
/orders?page=1&size=10
在 Spring Boot 中通常这样写:
@GetMapping("/users")
public List<User> list(@RequestParam Integer page,
@RequestParam Integer size) {
...
}
4、GET 请求可以被缓存
浏览器和 CDN 可以缓存 GET 请求:
GET /news
如果内容没变化,可以直接返回缓存结果。
这也是为什么 查询接口推荐使用 GET。

3. POST 的核心特点
POST 通常用于 提交数据。
典型场景:
例如:
POST /users
POST /orders
POST /login
Spring Boot 写法:
@PostMapping("/users")
public Long create(@RequestBody UserCreateDTO dto) {
...
}
1、POST 不具备幂等性
POST 可能产生副作用。
例如:
POST /orders
执行一次:创建一个订单。
执行两次:可能创建两个订单。
因此 POST 默认是 非幂等 的。
2、POST 参数在 Request Body 中
POST 通常通过 JSON 传递复杂参数:
{
"name": "Tom",
"age": 20
}
Spring Boot 接收:
@RequestBody UserDTO dto
这种方式非常适合:

4. Spring Boot 开发中的常见错误
真实项目中,经常看到几种错误用法。
错误一:所有接口都用 POST
很多团队为了“简单”,所有接口统一写成:
POST /user/list
POST /user/detail
POST /user/delete
这种设计的问题:
- 破坏 HTTP 语义
- 无法使用缓存
- 接口不直观
看到 URL 根本不知道接口用途。
错误二:删除接口用 GET
例如:
GET /user/delete?id=1
这其实非常危险。
因为:浏览器可能会 预加载 GET 请求。甚至爬虫访问时,也可能触发删除操作。
正确写法应该是:
DELETE /users/1
如果只用 GET / POST,也应该:
POST /users/delete
错误三:复杂查询仍然使用 GET
例如:
GET /orders?startTime=...&endTime=...&status=...&type=...
参数非常多,URL 会变得很长。
浏览器 URL 长度一般限制:
约 2000 字符
这时候更适合:
POST /orders/search
通过 JSON 传递查询条件。

5. GET 与 POST 的实际使用边界
在 Spring Boot 实战中,可以遵循一个简单规则。
使用 GET 的场景
例如:
GET /users
GET /users/1
GET /orders?page=1
GET /report/sales
使用 POST 的场景
例如:
POST /users
POST /orders
POST /orders/search
POST /login

6. 一个简单的接口设计示例
假设一个用户系统。
推荐接口设计:
查询用户列表
GET /users?page=1
查询用户详情
GET /users/1
创建用户
POST /users
更新用户
PUT /users/1
删除用户
DELETE /users/1
如果项目只使用 GET / POST,也可以:
GET /users
GET /users/{id}
POST /users
POST /users/update
POST /users/delete

7. 一个简单判断方法
当你设计 Spring Boot 接口时,可以问自己一个问题:
这个请求会不会改变服务器数据?
如果答案是:不会改变,用 GET
如果答案是:可能改变,用 POST


在 Spring Boot 开发中,GET 与 POST 的核心区别其实只有一句话:GET 用于查询,POST 用于提交。
进一步理解就是:
| 方法 |
作用 |
是否修改数据 |
| GET |
查询资源 |
否 |
| POST |
提交数据 |
可能 |
当接口遵循 HTTP 语义时,系统会带来很多好处:
- 接口更直观
- API 更规范
- 更容易维护
- 更符合 REST 设计
接口设计就像城市规划。如果一开始道路规划清晰,城市会越长越漂亮;如果一开始随便修路,几年之后整个系统就会变成一团乱麻。遵循基础的 HTTP 协议规范,是构建清晰、可维护 API 的第一步。如果你对更多后端设计规范和实践感兴趣,欢迎在 云栈社区 进行交流探讨。
