这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
内容概括
- Hertz 安装&项目创建
- Hertz 的路由配置
- Hertz Handler 的编写
- 参数绑定与校验
详细知识
Hertz 是一个 Golang 微服务 HTTP 框架,下面使用hertz v0.5.1为例介绍其用法。
0. 官方文档:www.cloudwego.io/zh/docs/her…
- 官方代码示例:github.com/cloudwego/h…
安装&配置
安装hertz:
go install github.com/cloudwego/hertz/cmd/hz@latest
创建项目:
hz new -mod $ModuleName # 和Kitex一样,在$GOPATH下可不指定 ModuleName
go mod tidy
生成的项目目录结构大致如下:
.
├── biz
│ ├── handler
│ │ └── ping.go
│ └── router
│ └── register.go
├── go.mod
├── go.sum
├── main.go
├── router_gen.go
└── router.go
路由与处理器
服务端通过定义路由(router)来分类处理接收到的请求,建议在项目根目录下router.go中的customizedRegister()函数中定义路由。
一个简单的 GET 路由示例如下:
r.GET("/ping", handler.Ping)
Hertz 支持静态路由、参数路由和通配路由。静态路由即全字符匹配,如上述示例所示;参数路由指形如/cat/:name的路由,匹配到的参数可用于后续处理;通配路由指形如/image/*path的路由。其优先级顺序为静态路由 > 命名路由 > 通配路由。
Hertz 提供了路由分组的功能,通过Group()生成分组,如:
userR := r.Group("/user")
adminR := r.Group("admin")
userR.GET("/info", handler.user.GetInfo)
adminR.GET("/info", handler.admin.GetInfo)
- 除了常见的
GET、POST、PUT、DELETE等请求方式,Hertz还提供了Handle来自定义请求方式,Any()来注册所有请求方式,StaticFile/Static/StaticFS来注册静态文件。- 使用匿名函数注册路由时,若需要处理器名称,需要使用形如
GETEX()的路由注册函数来指定处理器名称。- Hertz 提供了
NoRoute与NoMethod方法用于全局处理 HTTP 404 与 405 请求,使用NoRoute需开启WithHandleMethodNotAllowed
Hertz 注册路由时传入的函数即为用于处理业务的处理器(Handler),一个简单的处理器函数如下所示:
func Ping(ctx context.Context, c *app.RequestContext) {
c.JSON(consts.StatusOK, utils.H{
"message": "pong",
})
}
参数获取与校验
Hertz 使用go-tagexpr进行参数校验,可使用RequestContext.BindAndValidate()对参数进行绑定和校验,也可调用单独的方法进行绑定或校验。
- go-tagexpr 的项目地址:github.com/bytedance/g…
- 参数校验语法:github.com/bytedance/g…
首先要定义用于接收参数的结构体,如:
type request struct {
ver int `path:"version"`
id int `query:"id"`
}
用于绑定的 tag 包括path、form、query、header、json、raw_body,校验参数写在vd参数中
本文若有不足之处,欢迎纠正(≧^.^≦)喵~
我的其他笔记,可在掘金或 Github( github.com/DoudiNCer/I… )阅读