Web 三件套之 Hertz

229 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天

内容概括

  • Hertz 安装&项目创建
  • Hertz 的路由配置
  • Hertz Handler 的编写
  • 参数绑定与校验

详细知识

  Hertz 是一个 Golang 微服务 HTTP 框架,下面使用hertz v0.5.1为例介绍其用法。

0. 官方文档:www.cloudwego.io/zh/docs/her…

  1. 官方代码示例: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)
  1. 除了常见的GETPOSTPUTDELETE等请求方式,Hertz还提供了Handle来自定义请求方式,Any()来注册所有请求方式,StaticFile/Static/StaticFS来注册静态文件。
  2. 使用匿名函数注册路由时,若需要处理器名称,需要使用形如GETEX()的路由注册函数来指定处理器名称。
  3. Hertz 提供了 NoRouteNoMethod 方法用于全局处理 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()对参数进行绑定和校验,也可调用单独的方法进行绑定或校验。

  1. go-tagexpr 的项目地址:github.com/bytedance/g…
  2. 参数校验语法:github.com/bytedance/g…

  首先要定义用于接收参数的结构体,如:

type request struct {
	ver int `path:"version"`
	id  int `query:"id"`
}

  用于绑定的 tag 包括pathformqueryheaderjsonraw_body,校验参数写在vd参数中

本文若有不足之处,欢迎纠正(≧^.^≦)喵~
我的其他笔记,可在掘金或 Github( github.com/DoudiNCer/I… )阅读