这是我参与青训营伴学笔记创作活动
的第2篇笔记
前言
Hertz是Golang微服务器HTTP框架,具有高易用性、高性能、高扩展性、多协议支持和网络层切换等特点,默认集成了字节跳动自研的Netpoll高性能网络库。
基础功能
简单实用
使用Hertz需要确保Golang开发环境已经搭建完成,为了保障兼容性和稳定性,要求Golang版本不低于1.15 以课程demo为例:
package main
import(
"context"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
)
func main(){
h := server.New()
// 将对应的路由注册到server上,POST是方法,"/sis"是url,
h.POST("/sis", func(c context.Context, ctx *app.RequestContext) {
ctx.Data(200, "text/plain; charset=utf-8", []byte("OK")) // 业务逻辑
})
h.Spin()
}
需要注意这里替换成了"github.com/cloudwego/hertz/pkg/app"、"github.com/cloudwego/hertz/pkg/app/server"
,用老师上课讲的那串报错。
然后执行go mod init hertz_demo
用于生成go.mod文件,执行go mod tidy
用于整理并拉取依赖。
然后执行go run main.go
开启端口,在Postman软件上如下配置,点击send即可
使用hz自动生成代码
hz是Hertz框架提供的用于生成代码的命令行工具,用于生成Hertz项目的脚手架
- 安装hz
go install github.com/cloudwego/hertz/cmd/hz@latest
- 生成/编写示例代码
在当前目录下创建hertz文件夹,
cd hertz
进入该文件夹 执行hz new -module hertz_demo
生成代码, 整理&拉取依赖
go mod init //由于前面已经生成了mod.go,这里不需要init了
go mod tidy
然后使用go build main.go router_gen.go router.go
命令编译,需要注意的是这里3个go文件都有main函数,所以需要一起编译。
然后使用./hertz_demo.exe
运行该程序
2023/08/10 20:36:16.871308 engine.go:617: [Debug] HERTZ: Method=GET absolutePath=/ping --> handlerName=hertz_demo/biz/handler.Ping (num=2 handlers)
2023/08/10 20:36:16.882486 engine.go:389: [Info] HERTZ: Using network library=standard
2023/08/10 20:36:16.885040 transport.go:65: [Info] HERTZ: HTTP server listening on address=[::]:8888
请求方式
-
基础路由: Hertz 支持丰富的路由类型用于实现复杂的功能,包括静态路由、参数路由、通配路由。路由的优先级为静态路由 > 命名路由 > 通配路由
- 静态路由
r.GET("/getName") r.GET("/getAge")
- 参数路由:Hertz 支持使用
:name
这样的命名参数设置路由,并且命名参数只匹配单个路径段。r.GET("/user/:name/:age")
- 通配路由(用的比较少):Hertz 支持使用
*path
这样的通配参数设置路由,并且通配参数会匹配所有内容。如果我们设置/src/*path
路由,匹配情况如下r.GET("/src/*")
-
路由组
v1 := r.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")
})
}
- 中间件:
自定义中间件:
中间件可以在指定路由组组时声明,或使用Use声明使用。
v1 := r.Group("/v1", middleware.Jwt())
v1.Use(middleware.Jwt())
创建中间件:
func Jwt() app.HandlerFunc {
return func(ctx context.Context, c *app.RequestContext) {
// pre-handle
// ...
c.Next(ctx)
}
}
终止中间件:
c.Abort
c.AbortWithMsg
c.AbortWlthStats