欢迎阅读我的文章!更多精彩内容,欢迎关注:
• B站主页
小枫Geek
• 微信公众号Procode  


        在很多 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 /usersGET /orders/1001GET /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 /usersPOST /ordersPOST /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/listPOST /user/detailPOST /user/delete

这种设计的问题:

1.破坏 HTTP 语义

2.无法使用缓存

3.接口不直观

看到 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 /usersGET /users/1GET /orders?page=1GET /report/sales

使用 POST 的场景

  • 创建数据

  • 执行业务操作

  • 复杂查询条件

例如:

POST /usersPOST /ordersPOST /orders/searchPOST /login

6、一个简单的接口设计示例

假设一个用户系统。

推荐接口设计:

查询用户列表

GET /users?page=1

查询用户详情

GET /users/1

创建用户

POST /users

更新用户

PUT /users/1

删除用户

DELETE /users/1

如果项目只使用 GET / POST,也可以:

GET  /usersGET  /users/{id}POST /usersPOST /users/updatePOST /users/delete

7、一个简单判断方法

当你设计 Spring Boot 接口时,可以问自己一个问题:

这个请求会不会改变服务器数据?

如果答案是:不会改变,用 GET

如果答案是:可能改变,用 POST

小结

        在 Spring Boot 开发中,GET 与 POST 的核心区别其实只有一句话:GET 用于查询,POST 用于提交。

进一步理解就是:

方法

作用

是否修改数据

GET

查询资源

POST

提交数据

可能

当接口遵循 HTTP 语义时,系统会带来很多好处:

  • 接口更直观

  • API 更规范

  • 更容易维护

  • 更符合 REST 设计

        接口设计就像城市规划。 如果一开始道路规划清晰,城市会越长越漂亮; 如果一开始随便修路,几年之后整个系统就会变成一团乱麻。

-END-

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐