diff --git a/rest/server.go b/rest/server.go index 0046712c..57d6434e 100644 --- a/rest/server.go +++ b/rest/server.go @@ -4,6 +4,7 @@ import ( "crypto/tls" "log" "net/http" + "path" "github.com/tal-tech/go-zero/core/logx" "github.com/tal-tech/go-zero/rest/handler" @@ -161,6 +162,22 @@ func WithNotAllowedHandler(handler http.Handler) RunOption { return WithRouter(rt) } +// WithPrefix adds group as a prefix to the route paths. +func WithPrefix(group string) RouteOption { + return func(r *featuredRoutes) { + var routes []Route + for _, rt := range r.routes { + p := path.Join(group, rt.Path) + routes = append(routes, Route{ + Method: rt.Method, + Path: p, + Handler: rt.Handler, + }) + } + r.routes = routes + } +} + // WithPriority returns a RunOption with priority. func WithPriority() RouteOption { return func(r *featuredRoutes) { diff --git a/rest/server_test.go b/rest/server_test.go index 811e9ee4..30c2383b 100644 --- a/rest/server_test.go +++ b/rest/server_test.go @@ -213,6 +213,25 @@ func TestMultiMiddlewares(t *testing.T) { }, m) } +func TestWithPrefix(t *testing.T) { + fr := featuredRoutes{ + routes: []Route{ + { + Path: "/hello", + }, + { + Path: "/world", + }, + }, + } + WithPrefix("/api")(&fr) + var vals []string + for _, r := range fr.routes { + vals = append(vals, r.Path) + } + assert.EqualValues(t, []string{"/api/hello", "/api/world"}, vals) +} + func TestWithPriority(t *testing.T) { var fr featuredRoutes WithPriority()(&fr)