# API 版本分流接入指南(`api-header`) ## 目标 - 通过请求头 `api-header` 动态选择不同 Handler(如 `001Handler` / `002Handler`)。 - 让旧 App 无需升级仍可走旧逻辑,新 App 通过版本头走新逻辑。 ## 当前规则 - 仅识别请求头:`api-header` - 严格版本格式:`x.y.z` 或 `vx.y.z` - 仅当 `api-header > 1.0.0` 时走新逻辑(V2) - 其余情况(缺失/非法/`<=1.0.0`)走旧逻辑(V1) 相关代码: - 版本解析:`pkg/apiversion/version.go` - 版本注入中间件:`internal/middleware/apiVersionMiddleware.go` - 通用分流器:`internal/middleware/apiVersionSwitchHandler.go` ## 新接口接入步骤(推荐) ### 1) 实现两个 Handler ```go func FooV1Handler(svcCtx *svc.ServiceContext) gin.HandlerFunc { return func(c *gin.Context) { // 旧逻辑(001) } } func FooV2Handler(svcCtx *svc.ServiceContext) gin.HandlerFunc { return func(c *gin.Context) { // 新逻辑(002) } } ``` ### 2) 在路由中挂分流器 ```go group.POST("/foo", middleware.ApiVersionSwitchHandler( foo.FooV1Handler(serverCtx), foo.FooV2Handler(serverCtx), )) ``` 完成后,无需在业务代码里手写 `api-header` 判断。 ## 客户端调用示例 ### 旧逻辑(V1) ```bash curl -X POST 'https://example.com/v1/common/foo' \ -H 'Content-Type: application/json' \ -d '{"x":1}' ``` ### 新逻辑(V2) ```bash curl -X POST 'https://example.com/v1/common/foo' \ -H 'Content-Type: application/json' \ -H 'api-header: 1.0.1' \ -d '{"x":1}' ``` ## 测试建议(最小集) - 无 `api-header`:命中 V1 - `api-header: 1.0.0`:命中 V1 - `api-header: 1.0.1`:命中 V2 - `api-header: abc`:命中 V1 可参考测试: - `internal/middleware/apiVersionSwitchHandler_test.go` ## 适用建议 - 差异较小:优先在 V2 中复用现有逻辑,减少重复代码。 - 差异较大:拆分 V1/V2 各自逻辑,避免分支污染。 - 上线顺序:先发后端分流能力,再逐步让客户端加 `api-header`。