Hertz学习 | 青训营笔记

316 阅读2分钟

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

教程:www.cloudwego.io/zh/docs/her…

基本使用

  1. 安装
go install github.com/cloudwego/hertz/cmd/hz@latest
  1. 生成代码 hz new
  2. 整理 & 拉取依赖
go mod tidy

路由

Hertz 提供了 GETPOSTPUTDELETEANY 等方法用于注册路由

方法介绍
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):终止后续调用,并设置状态码

Client

生态