这是我参与「第五届青训营 」笔记创作活动的第6天
教程:www.cloudwego.io/zh/docs/her…
基本使用
- 安装
go install github.com/cloudwego/hertz/cmd/hz@latest
- 生成代码 hz new
- 整理 & 拉取依赖
go mod tidy
路由
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 | 用于注册静态文件 |
路由组
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()
}
路由类型
Hertz 支持丰富的路由类型用于实现复杂的功能,包括静态路由、参数路由、通配路由。
路由的优先级:静态路由 > 命名路由 > 通配路由
参数绑定
支持的 tag
| go tag | 说明 |
|---|---|
| path | 绑定 url 上的路径参数,相当于 hertz 路由{:param}或{*param}中拿到的参数。例如:如果定义的路由为: /v:version/example,可以把 path 的参数指定为路由参数:path:"version",此时,url: http://127.0.0.1:8888/v1/example,可以绑定path参数"1" |
| form | 绑定请求的 body 内容。content-type -> multipart/form-data 或 application/x-www-form-urlencoded,绑定 form 的 key-value |
| query | 绑定请求的 query 参数 |
| header | 绑定请求的 header 参数 |
| json | 绑定请求的 body 内容 content-type -> application/json,绑定 json 参数 |
| raw_body | 绑定请求的原始 body(bytes),绑定的字段名不指定,也能绑定参数。(注:raw_body 绑定优先级最低,当指定多个 tag 时,一旦其他 tag 成功绑定参数,则不会绑定 body 内容。) |
| vd | 参数校验,校验语法 |
参数绑定优先级
path > form > query > cookie > header > json > raw_body
中间件
Hertz中间件的种类是多种多样的,简单分为两大类:
-
服务端中间件
-
客户端中间件
实现
// 方式一
func MyMiddleware() app.HandlerFunc {
return func(ctx context.Context, c *app.RequestContext) {
// pre-handle
// ...
c.Next(ctx)
}
}
// 方式二
func MyMiddleware() app.HandlerFunc {
return func(ctx context.Context, c *app.RequestContext) {
c.Next(ctx) // call the next middleware(handler)
// post-handle
// ...
}
}
中间件会按定义的先后顺序依次执行,如果想快速终止中间件调用,可以使用以下方法,注意当前中间件仍将执行。
-
Abort():终止后续调用 -
AbortWithMsg(msg string, statusCode int):终止后续调用,并设置 response中body,和状态码 -
AbortWithStatus(code int):终止后续调用,并设置状态码