路由前缀
概述
在 go-zero 中,我们通过 api 语言来声明 HTTP 服务,然后通过 goctl 生成 HTTP 服务代码,在之前我们系统性的介绍了 API 规范。
在 HTTP 服务开发中,路由前缀需求是非常常见的,比如我们通过路由来区分版本,或者通过路由来区分不同的服务,这些都是非常常见的需求。
路由前缀
假设我们有一个用户服务,我们需要通过路由来区分不同的版本,我们可以通过 api 语言来声明路由前缀:
https://example.com/v1/usershttps://example.com/v2/users
在上文路由中,我们通过版本 v1 和 v2 来区分了 /users 路由,我们可以通过 api 语言来声明路由前缀:
syntax = "v1"type UserV1 {Name string `json:"name"`}type UserV2 {Name string `json:"name"`}@server (prefix: /v1)service user-api {@handler usersv1get /users returns ([]UserV1)}@server (prefix: /v2)service user-api {@handler usersv2get /users returns ([]UserV2)}
在上文中,我们通过在 @server 中来通过 prefix 关键字声明了路由前缀,然后通过 @handler 来声明了路由处理函数,这样我们就可以通过路由前缀来区分不同的版本了。
下面简单看一下生成的路由代码:
func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {server.AddRoutes([]rest.Route{{Method: http.MethodGet,Path: "/users",Handler: usersv1Handler(serverCtx),},},rest.WithPrefix("/v1"),)server.AddRoutes([]rest.Route{{Method: http.MethodGet,Path: "/users",Handler: usersv2Handler(serverCtx),},},rest.WithPrefix("/v2"),)}
在上文中,我们可以看到,我们声明的 prefix 其实在生成代码后通过 rest.WithPrefix 来声明了路由前缀,这样我们就可以通过路由前缀来区分不同的版本了。