在 Java 里做 API 接口版本化,常见做法可以按「URL、请求头、参数、媒体类型、代码组织」几个维度来设计。下面系统讲一下主流方案和示例。
方式:在路径中带版本号
/api/v1/users
/api/v2/users
@RestController
@RequestMapping("/api/v1/users")
public class UserV1Controller {
@GetMapping
public List<UserV1> list() { ... }
}
@RestController
@RequestMapping("/api/v2/users")
public class UserV2Controller {
@GetMapping
public List<UserV2> list() { ... }
}
✅ 优点
❌ 缺点
/api/users?version=1
/api/users?version=2
@GetMapping("/users")
public Object list(@RequestParam int version) {
if (version == 1) return userService.listV1();
return userService.listV2();
}
✅ 简单
❌ 不推荐大型系统(URL 不清晰)
GET /api/users
Accept: application/vnd.myapi.v1+json
或
GET /api/users
X-API-Version: 2
@GetMapping(value = "/users", headers = "X-API-Version=1")
public List<UserV1> listV1() { ... }
@GetMapping(value = "/users", headers = "X-API-Version=2")
public List<UserV2> listV2() { ... }
✅ 优点
❌ 缺点
Accept: application/vnd.company.user.v1+json
常配合 Spring HATEOAS / Spring Content Negotiation
✅ 专业
❌ 复杂度高
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiVersion {
int value();
}
@RestController
@RequestMapping("/users")
public class UserController {
@ApiVersion(1)
@GetMapping
public Object v1() { ... }
@ApiVersion(2)
@GetMapping
public Object v2() { ... }
}
通过 HandlerInterceptor 或 RequestMappingHandlerMapping 解析版本。
✅ 适合中大型系统
✅ 可统一控制
controller
├── v1
│ └── UserController.java
├── v2
│ └── UserController.java
dto
├── v1
│ └── UserDTO.java
├── v2
│ └── UserDTO.java
或
api
├── UserApiV1
├── UserApiV2
✅ 推荐组合
✅ 版本原则
| 方式 | 直观性 | REST 风格 | 推荐度 |
|---|---|---|---|
| URL | ⭐⭐⭐⭐ | ⭐⭐ | ✅✅✅ |
| Header | ⭐⭐ | ⭐⭐⭐⭐ | ✅✅ |
| 参数 | ⭐⭐⭐ | ⭐ | ❌ |
| 注解 | ⭐⭐⭐ | ⭐⭐⭐ | ✅✅✅ |
如果你用的是 Spring Boot / Spring Cloud / 微服务 / Gateway,我可以给你一份完整版本化方案模板(含拦截器、Swagger、网关路由)。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。