这是我参与「第五届青训营」伴学笔记创作活动的第8天
前言
Go框架三件套第三部分,祝大家新年快乐,万事胜意。
Hertz
入手
安装Hertz命令行工具
go install github.com/cloudwego/hertz/cmd/hz@latest
验证Hertz工具是否安装成功,执行下面指令
hz -v
新建一个Hertz项目
进入到$GOPATH下面,新建src文件夹,创建hertz_demo作为项目的根目录
cd $GOPATH
mkdir src
cd src
mkdir hertz_demo
cd hertz_demo
执行hz new初始化项目,项目初始化后,hertz会自动创建对应项目文件,文件结构如下
.
├── biz
│ ├── handler
│ │ └── ping.go
│ └── router
│ └── register.go
├── go.mod
├── main.go
├── router.go
└── router_gen.go
运行Hertz项目 执行go mod tidy整理项目 启动hertz
Hertz获取请求参数
Query参数
通过c.Query获取路径参数
func Person(ctx context.Context, c *app.RequestContext) {
name := c.Query("name")
c.JSON(200, utils.H{
"data": name,
})
}
输出:
{"data":"erik"}
路径参数
通过c.Param获取路径参数
func HelloPerson(ctx context.Context, c *app.RequestContext) {
name := c.Query("name")
age := c.Param("age")
c.JSON(200, utils.H{
"age": age,
"name": name,
})
}
路由注册
r.GET("/person/:age", hello.HelloPerson)
请求:
{
"age": "12",
"name": "erik"
}
获取请求Body
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,
})
}
curl
curl --location --request POST 'localhost:8888/person_info' \
--header 'Content-Type: application/json' \
--data-raw '{
"age":12,
"name":"erik"
}'
{
"person": {
"age": 12,
"name": "erik"
}
}
表单参数
func PersonForm(ctx context.Context, c *app.RequestContext) {
age, _ := c.GetPostForm("age")
name, _ := c.GetPostForm("name")
c.JSON(200, utils.H{
"age": age,
"name": name,
})
}
curl --location --request POST 'localhost:8888/person_form' \
--form 'name="erik"' \
--form 'age="12"'
{
"age": "12",
"name": "erik"
}
文件上传&文件下载
func PersonUpload(ctx context.Context, c *app.RequestContext) {
fileHeader, err := c.FormFile("file")
if err != nil {
panic(err)
}
open, err := fileHeader.Open()
if err != nil {
panic(err)
}
// 读取文件到字节数组
fileRaw, err := ioutil.ReadAll(open)
if err != nil {
panic(err)
}
// 将读取到的文件写入到响应
_, err = c.Write(fileRaw)
if err != nil {
panic(err)
}
}
curl --location --request POST 'localhost:8888/person_upload' \
--form 'file=@"/img.jpeg"'
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,
})
}
curl
curl --location --request POST 'http://localhost:8888/person_bind/12?name=erik' \
--header 'Content-Type: application/json' \
--data-raw '{
"city":"BeiJing"
}'
{
"person": {
"age": 12,
"name": "erik",
"city": "BeiJing"
}
}
待整理后持续更新