Hertz 入门

Hertz 入门

Hertz[həːts] 是字节 CloudWeGo 团队一个 Golang 微服务 HTTP 框架,在设计之初参考了其他开源框架 fasthttp、gin、echo 的优势, 并结合字节跳动内部的需求,使其具有高易用性、高性能、高扩展性等特点,目前在字节跳动内部已广泛使用。如今越来越多的微服务选择使用 Golang,如果对微服务性能有要求,又希望框架能够充分满足内部的可定制化需求,Hertz 会是一个不错的选择。

Hello World

本节将介绍如何搭建 Hertz 的基础环境。

    1. 创建一个文件夹,文件夹名称为 learn_hertz
    1. 创建 main.go 文件,文件内容如下
go 复制代码
package main

import (
    "context"

    "github.com/cloudwego/hertz/pkg/app"
    "github.com/cloudwego/hertz/pkg/app/server"
    "github.com/cloudwego/hertz/pkg/common/utils"
    "github.com/cloudwego/hertz/pkg/protocol/consts"
)

func main() {
    h := server.Default()

    h.GET("/ping", func(c context.Context, ctx *app.RequestContext) {
        ctx.JSON(consts.StatusOK, utils.H{"message": "pong"})
    })

    h.Spin()
}
    1. 通过 go mod init learn_hertz 命令创建 go.mod 文件
    1. 通过 go mod tidy 下载依赖库
    1. 通过 go build 构建项目,构建后会生成 learn_heartz.exe 文件双击执行后会看到如下信息。
ini 复制代码
2023/12/16 13:06:32.991979 engine.go:668: [Debug] HERTZ: Method=GET    absolutePath=/ping                     --> handlerName=main.main.func1 (num=2 handlers)
2023/12/16 13:06:33.004723 engine.go:396: [Info] HERTZ: Using network library=standard
2023/12/16 13:06:33.005809 transport.go:65: [Info] HERTZ: HTTP server listening on address=[::]:8888
    1. 访问 http://localhost:8888/ping ,可以在浏览器中看到如下效果
null

image-20231216130749035

至此基本功能已经完成。

路由

本节将详细介绍在 Hertz 中如何创建路由以及支持 GET、POST、DELETE、PUT 四种请求的方法。在 Hertz 中,路由的创建通过以下方式进行:

javascript 复制代码
goCopy code
h.GET("路由地址", func(c context.Context, ctx *app.RequestContext) {
    ctx.JSON(consts.StatusBadRequest, utils.H{"message": "error"})
})

在上述代码中,.GET 表示对外提供 GET 请求方式,而后面的函数则用于处理具体的业务逻辑。如果需要处理其他请求类型,可以相应地使用 .POST.DELETE.PUT

示例代码如下:

less 复制代码
goCopy code
h.POST("路由地址", func(c context.Context, ctx *app.RequestContext) {
    // 处理 POST 请求业务逻辑
})

h.DELETE("路由地址", func(c context.Context, ctx *app.RequestContext) {
    // 处理 DELETE 请求业务逻辑
})

h.PUT("路由地址", func(c context.Context, ctx *app.RequestContext) {
    // 处理 PUT 请求业务逻辑
})

如果需要将多个路由统一添加一个前缀,可以使用路由组。以下是一个路由组的示例:

css 复制代码
goCopy code
group := h.Group("/group")
group.GET("路由地址", func(c context.Context, ctx *app.RequestContext) {
    // 处理业务逻辑
})

通过这样的方式,可以更好地组织和管理不同类型的路由,并使代码结构更清晰。希望这些扩展能够更全面地解释如何在 Hertz 中进行路由的创建和管理。

请求参数获取

在 Hertz 中,实现请求参数的获取是一项常见的任务。本节将详细介绍在 Hertz 中如何获取不同类型的请求参数。

路由参数获取

首先,我们来看如何获取路由参数。下面的示例代码定义了一个路由 /hertz/:version,其中 :version 是一个动态的路由参数。在路由处理函数中,通过使用 c.Param("version") 来获取路由参数的值,并将其返回给客户端。

go 复制代码
h.GET("/hertz/:version", func(ctx context.Context, c *app.RequestContext) {
    // 获取路由参数
    version := c.Param("version")
    c.String(consts.StatusOK, "Hello %s", version)
})

通过以下命令可以测试该路由:

bash 复制代码
curl http://localhost:8888/hertz/v1.0

返回信息将是:

复制代码
Hello v1.0

Form 表单参数获取

接下来,我们看如何获取来自 Form 表单的参数。下面的示例代码定义了一个路由 /form,并在路由处理函数中使用 ctx.GetPostForm("age") 来获取 Form 表单中名为 "age" 的参数。

css 复制代码
h.POST("/form", func(c context.Context, ctx *app.RequestContext) {
    age, _ := ctx.GetPostForm("age")
    ctx.JSON(consts.StatusOK, utils.H{"age": age})
})

通过以下命令可以测试该路由:

rust 复制代码
curl --location 'http://localhost:8888/form' \
--form 'age="10"'

返回信息将是:

json 复制代码
{"age":"10"}

QueryString 参数获取

在 Hertz 中,获取 QueryString 参数也是很简单的。下面的示例代码定义了一个路由 /hertz,并使用 c.Query("version") 来获取 QueryString 参数的值。

go 复制代码
h.GET("/hertz", func(ctx context.Context, c *app.RequestContext) {
    // 获取 QueryString 参数
    version := c.Query("version")
    c.String(consts.StatusOK, "Hello %s", version)
})

通过以下命令可以测试该路由:

bash 复制代码
curl http://localhost:8888/hertz\?version\=123

返回信息将是:

复制代码
Hello 123

Body 参数获取

最后,我们来看如何从请求的 Body 中获取参数。下面的示例代码定义了一个路由 /body,并使用 c.Bind(&p) 来将请求的 JSON 数据绑定到一个结构体中。

go 复制代码
h.POST("/body", func(ctx context.Context, c *app.RequestContext) {
    type Person struct {
       Age  int    `json:"age"`
       Name string `json:"name"`
    }
    var p Person
    err := c.Bind(&p)
    if err != nil {
       c.String(consts.StatusBadRequest, "bind error: %s", err.Error())
       return
    }
    c.JSON(consts.StatusOK, utils.H{"p": p})
})

通过以下命令可以测试该路由:

css 复制代码
curl --location 'http://localhost:8888/body' \
--header 'Content-Type: application/json' \
--data '{
    "age":10,
    "name":"zhangsan"
}'

返回信息将是:

css 复制代码
{"p":{"age":10,"name":"zhangsan"}}

通过这些示例,有助于更好地理解在 Hertz 中如何获取不同类型的请求参数。

.hljs.code__pre::before { position: initial; padding: initial; content: ''; display: block; height: 25px; background-color: transparent; background-image: url("doocs.oss-cn-shenzhen.aliyuncs.com/img/123.svg"); background-position: 14px 10px; background-repeat: no-repeat; background-size: 40px; } .hljs.code__pre { padding: 0!important; } .hljs.code__pre code { display: -webkit-box; padding: 0.5em 1em 1em; overflow-x: auto; text-indent: 0; }

本文使用 文章同步助手 同步

相关推荐
啾啾Fun1 小时前
精粹汇总:大厂编程规范(持续更新)
后端·规范
yt948322 小时前
lua读取请求体
后端·python·flask
IT_10242 小时前
springboot从零入门之接口测试!
java·开发语言·spring boot·后端·spring·lua
汪子熙2 小时前
在 Word 里编写 Visual Basic 调用 DeepSeek API
后端·算法·架构
寻月隐君3 小时前
手把手教你用 Solana Token-2022 创建支持元数据的区块链代币
后端·web3·github
代码丰3 小时前
使用Spring Cloud Stream 模拟生产者消费者group destination的介绍(整合rabbitMQ)
java·分布式·后端·rabbitmq
烛阴4 小时前
Cheerio DOM操作深度指南:轻松玩转HTML元素操作
前端·javascript·后端
Hello.Reader4 小时前
在多云环境透析连接ngx_stream_proxy_protocol_vendor_module
后端·python·flask
西洼工作室5 小时前
Spring Boot常用依赖大全:从入门到精通
java·spring boot·后端
北i5 小时前
IOT集群扩容实践:问题剖析与解决策略
后端·物联网·kafka