从零开始Go语Ⅷ-框架P3 | 青训营笔记

123 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第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"
    }
}

待整理后持续更新