在 Java 里做 API 接口版本化,常见做法大致可以分为 URL 路径、请求参数、Header、Content-Type、子域名 几种方式。下面按实用程度给你梳理一下,并附 Java(Spring Boot 为主)示例。
方式:把版本写在 URL 中
示例:
/api/v1/users
/api/v2/users
@RestController
@RequestMapping("/api/v1/users")
public class UserV1Controller {
@GetMapping
public String getUsers() {
return "v1 users";
}
}
@RestController
@RequestMapping("/api/v2/users")
public class UserV2Controller {
@GetMapping
public String getUsers() {
return "v2 users";
}
}
✅ 优点:
❌ 缺点:
方式:通过参数区分版本
/api/users?version=1
@GetMapping("/users")
public String getUsers(@RequestParam int version) {
if (version == 1) return "v1";
if (version == 2) return "v2";
throw new IllegalArgumentException();
}
✅ 优点:URL 不变
❌ 缺点:
方式:通过请求头区分
GET /users
Accept: application/vnd.myapi.v1+json
或
X-API-Version: 1
@GetMapping(value = "/users", headers = "X-API-Version=1")
public String v1() {
return "v1";
}
@GetMapping(value = "/users", headers = "X-API-Version=2")
public String v2() {
return "v2";
}
✅ 优点:
❌ 缺点:
Accept: application/vnd.company.app-v1+json
@GetMapping(
value = "/users",
produces = "application/vnd.company.app-v1+json"
)
public String v1() { return "v1"; }
适合 对外公开 API(如开放平台)
v1.api.example.com/users
v2.api.example.com/users
适合:
Spring 6 提供了 API Versioning
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping
@ApiVersion(1)
public String v1() { return "v1"; }
@GetMapping
@ApiVersion(2)
public String v2() { return "v2"; }
}
(需 Spring 6 / Spring Boot 3)
| 场景 | 推荐方式 |
|---|---|
| 内部系统 | URL 路径 /api/v1 |
| 对外开放 API | Header / Accept |
| 微服务 | 子域名 |
| 简单项目 | URL 路径 |
最佳实践:
如果你愿意,我也可以帮你:
你现在的项目用的是 Spring Boot 几?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。