路由
路由注册
Hertz 提供了 GET、POST、PUT、DELETE、ANY 等方法用于注册路由。
方法 | 介绍 |
Hertz.GET | 用于注册 HTTP Method 为 GET 的方法 |
Hertz.POST | 用于注册 HTTP Method 为 POST 的方法 |
Hertz.DELETE | 用于注册 HTTP Method 为 DELETE 的方法 |
Hertz.PUT | 用于注册 HTTP Method 为 PUT 的方法 |
Hertz.PATCH | 用于注册 HTTP Method 为 PATCH 的方法 |
Hertz.HEAD | 用于注册 HTTP Method 为 HEAD 的方法 |
Hertz.OPTIONS | 用于注册 HTTP Method 为 OPTIONS 的方法 |
Hertz.Handle | 这个方法支持用户手动传入 HTTP Method 用来注册方法,当用于注册普通的 HTTP Method 方法时和上述的方法作用是一致的,并且这个方法同时也支持用于注册自定义 HTTP Method 方法 |
Hertz.Any | 用于注册所有 HTTP Method 方法 |
Hertz.StaticFile/Static/StaticFS | 用于注册静态文件 |
实例代码:
package main import ( "context" "github.com/cloudwego/hertz/pkg/app" "github.com/cloudwego/hertz/pkg/app/server" "github.com/cloudwego/hertz/pkg/protocol/consts" ) func main(){ h := server.Default(server.WithHostPorts("127.0.0.1:8080")) h.StaticFS("/", &app.FS{Root: "./", GenerateIndexPages: true}) h.GET("/get", func(ctx context.Context, c *app.RequestContext) { c.String(consts.StatusOK, "get") }) h.POST("/post", func(ctx context.Context, c *app.RequestContext) { c.String(consts.StatusOK, "post") }) h.PUT("/put", func(ctx context.Context, c *app.RequestContext) { c.String(consts.StatusOK, "put") }) h.DELETE("/delete", func(ctx context.Context, c *app.RequestContext) { c.String(consts.StatusOK, "delete") }) h.PATCH("/patch", func(ctx context.Context, c *app.RequestContext) { c.String(consts.StatusOK, "patch") }) h.HEAD("/head", func(ctx context.Context, c *app.RequestContext) { c.String(consts.StatusOK, "head") }) h.OPTIONS("/options", func(ctx context.Context, c *app.RequestContext) { c.String(consts.StatusOK, "options") }) h.Any("/ping_any", func(ctx context.Context, c *app.RequestContext) { c.String(consts.StatusOK, "any") }) h.Handle("LOAD","/load", func(ctx context.Context, c *app.RequestContext) { c.String(consts.StatusOK, "load") }) h.Spin() }
路由组
Hertz 提供了路由组 ( Group ) 的能力,用于支持路由分组的功能,同时中间件也可以注册到路由组上。
示例代码:
package main import ( "context" "github.com/cloudwego/hertz/pkg/app" "github.com/cloudwego/hertz/pkg/app/server" "github.com/cloudwego/hertz/pkg/protocol/consts" ) func main(){ h := server.Default(server.WithHostPorts("127.0.0.1:8080")) v1 := h.Group("/v1") v1.GET("/get", func(ctx context.Context, c *app.RequestContext) { c.String(consts.StatusOK, "get") }) v1.POST("/post", func(ctx context.Context, c *app.RequestContext) { c.String(consts.StatusOK, "post") }) v2 := h.Group("/v2") v2.PUT("/put", func(ctx context.Context, c *app.RequestContext) { c.String(consts.StatusOK, "put") }) v2.DELETE("/delete", func(ctx context.Context, c *app.RequestContext) { c.String(consts.StatusOK, "delete") }) h.Spin() }
在路由组中使用中间件
如下示例在路由组中使用 BasicAuth 中间件。
示例代码 1:
package main import ( "context" "github.com/cloudwego/hertz/pkg/app" "github.com/cloudwego/hertz/pkg/app/middlewares/server/basic_auth" "github.com/cloudwego/hertz/pkg/app/server" "github.com/cloudwego/hertz/pkg/protocol/consts" ) func main() { h := server.Default(server.WithHostPorts("127.0.0.1:8080")) // use middleware v1 := h.Group("/v1", basic_auth.BasicAuth(map[string]string{"test": "test"})) v1.GET("/ping", func(c context.Context, ctx *app.RequestContext) { ctx.String(consts.StatusOK,"ping") }) h.Spin() }
示例代码 2:
package main import ( "context" "github.com/cloudwego/hertz/pkg/app" "github.com/cloudwego/hertz/pkg/app/middlewares/server/basic_auth" "github.com/cloudwego/hertz/pkg/app/server" "github.com/cloudwego/hertz/pkg/protocol/consts" ) func main() { h := server.Default(server.WithHostPorts("127.0.0.1:8080")) v1 := h.Group("/v1") // use `Use` method v1.Use(basic_auth.BasicAuth(map[string]string{"test": "test"})) v1.GET("/ping", func(c context.Context, ctx *app.RequestContext) { ctx.String(consts.StatusOK,"ping") }) h.Spin() }
路由类型
Hertz 支持丰富的路由类型用于实现复杂的功能,包括静态路由、参数路由 (命名参数、通配参数)。
路由的优先级:静态路由 > 命名参数路由 > 通配参数路由
命名参数路由
Hertz 支持使用 :name 这样的命名参数设置路由,并且命名参数只匹配单个路径段。
如果我们设置/user/:name路由,匹配情况如下
路径 | 是否匹配 |
user/gordon | 匹配 |
/user/you | 匹配 |
/user/gordon/profile | 不匹配 |
/user/ | 不匹配 |
通过使用 RequestContext.Param 方法,我们可以获取路由中携带的参数。
示例代码:
package main import ( "context" "github.com/cloudwego/hertz/pkg/app" "github.com/cloudwego/hertz/pkg/app/server" "github.com/cloudwego/hertz/pkg/protocol/consts" ) func main(){ h := server.Default(server.WithHostPorts("127.0.0.1:8080")) // This handler will match: "/hertz/version", but will not match : "/hertz/" or "/hertz" h.GET("/hertz/:version", func(ctx context.Context, c *app.RequestContext) { version := c.Param("version") c.String(consts.StatusOK, "Hello %s", version) }) h.Spin() }
字节赫兹 框架教程 二 Routers(2)https://developer.aliyun.com/article/1391748