Hertz | 青训营笔记

70 阅读2分钟

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

Hertz介绍

Hertz是Golang的微服务HTTP框架,设计之初参考了gin、echo、fasthttp

安装Hertz

go install github.com/cloudwego/hertz/cmd/hz@latest

使用hz -v可以检验是否安装成功

快速构建Hertz项目

利用hz new初始化项目之后会生成以下文件结构

.
├── biz
│   ├── handler
│   │   └── ping.go
│   └── router
│       └── register.go
├── go.mod
├── main.go
├── router.go
└── router_gen.go

Hertz处理请求

Query(),获取路径参数(例如http://localhost:8080/test?name=test),得到test

func Person(ctx context.Context, c *app.RequestContext) {
	name := c.Query("name")
	c.JSON(200, utils.H{
		"data": name,
	})
}

Param()获取路径参数(例如http://localhost:8080/test/12?name=test) 路由注册 r.GET("/test/:age", hello.HelloPerson) c.Param("age")得到12

获取请求体

func PersonInfo(ctx context.Context, c *app.RequestContext) {
   type Person struct {
      Age  int    `json:"age"`
      Name string `json:"name"`
   }
   body, err := c.Body()
   if err != nil {
      panic(err)
   }
   var p Person
   if err := json.Unmarshal(body, &p); err != nil {
      panic(err)
   }
   c.JSON(200, utils.H{
      "person": p,
   })
}

参数绑定

参数绑定可以非常优雅的完成请求参数映射到结构体与请求参数的验证,hertz除了提供api获取参数信息,还提供了参数绑定功能,帮助我们直接将请求参数绑定到结构体上并校验参数的合法性。

func PersonBind(ctx context.Context, c *app.RequestContext) {
   type person struct {
      Age  int    `path:"age" json:"age"`    // 从路径中获取参数
      Name string `query:"name" json:"name"` // 从query中获取参数
      City string `json:"city"`              // 从body中获取参数
   }
   var p person
   if err := c.BindAndValidate(&p); err != nil {
      panic(err)
   }
   c.JSON(200, utils.H{
      "person": p,
   })
}

路由

Hertz 提供了 GET、POST、PUT、DELETE、ANY 等方法用于注册路由。同时还提供了路由组( Group )的能力,用于支持路由分组的功能,同时中间件也可以注册到路由组上。Hertz支持丰富的路由类型用于实现复杂的功能,包括静态路由、参数路由、通配路由。 路由的优先级:静态路由 > 命名路由 > 通配路由 通过使用 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"
)
 
funcmain(){
	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()
}