解锁 Hertz 路由:构建高效 API 的魔法钥匙

news/2025/2/25 9:31:09/文章来源:https://www.cnblogs.com/guangdelw/p/18735494

路由注册

Hertz 提供了 GETPOSTPUTDELETEANY 等方法用于注册路由。

方法 介绍
Hertz.GET 用于注册 HTTP Method 为 GET 的方法
Hertz.POST 用于注册 HTTP Method 为 POST 的方法
Hertz.DELETE 用于注册 HTTP Method 为 DELETE 的方法
Hertz.PUT 用于注册 HTTP Method 为 PUT 的方法
Hertz.PATCH 用于注册 HTTP Method 为 PATCH 的方法
Hertz.HEAD 用于注册 HTTP Method 为 HEAD 的方法
Hertz.OPTIONS 用于注册 HTTP Method 为 OPTIONS 的方法
Hertz.Handle 这个方法支持用户手动传入 HTTP Method 用来注册方法,当用于注册普通的 HTTP Method 方法时和上述的方法作用是一致的,并且这个方法同时也支持用于注册自定义 HTTP Method 方法
Hertz.Any 用于注册所有 HTTP Method 方法
Hertz.StaticFile/Static/StaticFS 用于注册静态文件
package mainimport ("context""github.com/cloudwego/hertz/pkg/app""github.com/cloudwego/hertz/pkg/app/server""github.com/cloudwego/hertz/pkg/protocol/consts"
)func main() {h := server.Default(server.WithHostPorts("127.0.0.1:8080"))// 当访问/时,允许以列表的形式显示文件夹的文件,这个文件夹就是 ./ 目录h.StaticFS("/", &app.FS{Root: "./", GenerateIndexPages: true})h.GET("/get", func(ctx context.Context, c *app.RequestContext) {c.String(consts.StatusOK, "get")},)h.POST("/post", func(ctx context.Context, c *app.RequestContext) {c.String(consts.StatusOK, "post")},)h.PUT("/put", func(ctx context.Context, c *app.RequestContext) {c.String(consts.StatusOK, "put")},)h.DELETE("/delete", func(ctx context.Context, c *app.RequestContext) {c.String(consts.StatusOK, "delete")},)h.PATCH("/patch", func(ctx context.Context, c *app.RequestContext) {c.String(consts.StatusOK, "patch")},)h.HEAD("/head", func(ctx context.Context, c *app.RequestContext) {c.String(consts.StatusOK, "head")},)h.OPTIONS("/options", func(ctx context.Context, c *app.RequestContext) {c.String(consts.StatusOK, "options")},)h.Any("/ping_any", func(ctx context.Context, c *app.RequestContext) {c.String(consts.StatusOK, "any")},)h.Handle("LOAD", "/load", func(ctx context.Context, c *app.RequestContext) {c.String(consts.StatusOK, "load")},)h.Spin()
}

当访问 127.0.0.1:8080/ 时

路由组

Hertz 提供了路由组 ( Group ) 的能力,用于支持路由分组的功能,同时中间件也可以注册到路由组上。

package mainimport ("context""github.com/cloudwego/hertz/pkg/app""github.com/cloudwego/hertz/pkg/app/server""github.com/cloudwego/hertz/pkg/protocol/consts"
)func main() {h := server.Default(server.WithHostPorts("127.0.0.1:8080"))v1 := h.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")},)v2 := h.Group("/v2")v2.PUT("/put", func(ctx context.Context, c *app.RequestContext) {c.String(consts.StatusOK, "put")},)v2.DELETE("/delete", func(ctx context.Context, c *app.RequestContext) {c.String(consts.StatusOK, "delete")},)h.Spin()
}

产生的路由

2025/02/23 15:02:29.967989 engine.go:669: [Debug] HERTZ: Method=GET    absolutePath=/v1/get                   --> handlerName=main.main.func1 (num=2 handlers)
2025/02/23 15:02:29.974073 engine.go:669: [Debug] HERTZ: Method=POST   absolutePath=/v1/post                  --> handlerName=main.main.func2 (num=2 handlers)
2025/02/23 15:02:29.974073 engine.go:669: [Debug] HERTZ: Method=PUT    absolutePath=/v2/put                   --> handlerName=main.main.func3 (num=2 handlers)
2025/02/23 15:02:29.974073 engine.go:669: [Debug] HERTZ: Method=DELETE absolutePath=/v2/delete                --> handlerName=main.main.func4 (num=2 handlers)

在路由组中使用中间件

如下示例在路由组中使用中间件。

示例代码

package mainimport ("context""github.com/cloudwego/hertz/pkg/app""github.com/cloudwego/hertz/pkg/app/server""github.com/cloudwego/hertz/pkg/common/hlog""github.com/cloudwego/hertz/pkg/protocol/consts"
)// 自定义中间件
func exampleMiddleware() app.HandlerFunc {return func(ctx context.Context, c *app.RequestContext) {// 在 Next 中的函数执行之前打印日志hlog.Info("print before...")// 使用 Next 使得路由匹配的函数执行c.Next(ctx)// 在 Next 中的函数执行之后打印日志hlog.Info("print after...")}
}func main() {h := server.Default(server.WithHostPorts("127.0.0.1:8080"))// use 中间件v1 := h.Group("/v1", exampleMiddleware())v1.GET("/ping", func(ctx context.Context, c *app.RequestContext) {hlog.Info("print in handler...")c.String(consts.StatusOK, "ping")},)h.Spin()
}

相当于

package mainimport ("context""github.com/cloudwego/hertz/pkg/app""github.com/cloudwego/hertz/pkg/app/server""github.com/cloudwego/hertz/pkg/common/hlog""github.com/cloudwego/hertz/pkg/protocol/consts"
)func exampleMiddleware() app.HandlerFunc {return func(ctx context.Context, c *app.RequestContext) {// 在 Next 中的函数执行之前打印日志hlog.Info("print before...")// 使用 Next 使得路由匹配的函数执行c.Next(ctx)// 在 Next 中的函数执行之后打印日志hlog.Info("print after...")}
}func main() {h := server.Default(server.WithHostPorts("127.0.0.1:8080"))v1 := h.Group("/v1")// use 中间件v1.Use(exampleMiddleware())v1.GET("/ping", func(ctx context.Context, c *app.RequestContext) {c.String(consts.StatusOK,"ping")})h.Spin()
}

路由类型

Hertz 支持丰富的路由类型用于实现复杂的功能,包括静态路由、参数路由 (命名参数、通配参数)。

路由的优先级:静态路由 > 命名参数路由 > 通配参数路由

静态路由

就是非常普通的路由

h.GET("/get", func(ctx context.Context, c *app.RequestContext) {c.String(consts.StatusOK, "get")},)

这里的 "/get" 就是静态路由

命名参数路由

Hertz 支持使用 :name 这样的命名参数设置路由,并且命名参数只匹配单个路径段

如果我们设置 /user/:name 路由,匹配情况如下

路径 是否匹配
/user/gordon 匹配
/user/you 匹配
/user/gordon/profile 不匹配
/user/ 不匹配

通过使用 RequestContext.Param 方法,我们可以获取路由中携带的参数。

示例代码:

package mainimport ("context""github.com/cloudwego/hertz/pkg/app""github.com/cloudwego/hertz/pkg/app/server""github.com/cloudwego/hertz/pkg/protocol/consts"
)func main() {h := server.Default(server.WithHostPorts("127.0.0.1:8080"))// 此处理程序将匹配: "/hertz/version", 但不会匹配 : "/hertz/" or "/hertz" or "/hertz/version/xxx"h.GET("/hertz/:version", func(ctx context.Context, c *app.RequestContext) {version := c.Param("version")c.String(consts.StatusOK, "Hello %s", version)},)h.Spin()
}

通配参数路由

Hertz 支持使用 *path 这样的通配参数设置路由,并且通配参数会匹配所有内容

如果我们设置 /src/*path 路由,匹配情况如下

路径 是否匹配
/src/ 匹配
/src/somefile.go 匹配
/src/subdir/somefile.go 匹配

通过使用 RequestContext.Param 方法,我们可以获取路由中携带的参数。

示例代码:

package mainimport ("context""github.com/cloudwego/hertz/pkg/app""github.com/cloudwego/hertz/pkg/app/server""github.com/cloudwego/hertz/pkg/protocol/consts"
)func main() {h := server.Default(server.WithHostPorts("127.0.0.1:8080"))// 然而,这一个将匹配 "/hertz/v1/" 和 "/hertz/v2/send"h.GET("/hertz/:version/*action", func(ctx context.Context, c *app.RequestContext) {version := c.Param("version")action := c.Param("action")message := version + " is " + actionc.String(consts.StatusOK, message)},)h.Spin()
}

使用匿名函数与装饰器注册路由

在使用匿名函数或装饰器注册路由时,如果我们使用 RequestContext.HandlerName() 获取 handler 名称则会获取到错误的名称。

这里需要使用 Hertz 提供的 GETEXPOSTEXPUTEXDELETEEXHEADEXAnyEXHandleEX 方法并手动传入 handler 名称注册路由,使用 app.GetHandlerName 获取 handler 名称。

示例代码:

package mainimport ("context""github.com/cloudwego/hertz/pkg/app""github.com/cloudwego/hertz/pkg/app/server""github.com/cloudwego/hertz/pkg/protocol/consts"
)func main() {h := server.Default()h.AnyEX("/ping", func(ctx context.Context, c *app.RequestContext) {c.String(consts.StatusOK, app.GetHandlerName(c.Handler()))}, "ping_handler",)h.Spin()
}

获取路由注册信息

Hertz 提供了 Routes 获取注册的路由信息供用户使用。

func (engine *Engine) Routes() (routes RoutesInfo)

Routes 函数返回一个按 HTTP 方法划分的包含路由信息(HTTP 方法名,路由路径,请求处理函数名)的切片。

路由信息结构:

// RouteInfo represents a request route's specification which contains method and path and its handler.
type RouteInfo struct {Method      string   // http methodPath        string   // url pathHandler     string   // handler nameHandlerFunc app.HandlerFunc
}// RoutesInfo defines a RouteInfo array.
type RoutesInfo []RouteInfo

示例代码:

package mainimport ("context""github.com/cloudwego/hertz/pkg/app""github.com/cloudwego/hertz/pkg/app/server""github.com/cloudwego/hertz/pkg/common/hlog""github.com/cloudwego/hertz/pkg/common/utils""github.com/cloudwego/hertz/pkg/protocol/consts"
)func main() {h := server.Default()h.GET("/ping", func(ctx context.Context, c *app.RequestContext) {c.JSON(consts.StatusOK, utils.H{"ping": "pong"})},)routeInfo := h.Routes()for _, route := range routesInfo {hlog.Info(route.Handler, route.Path, route.Method)}h.Spin()
}

NoRoute 与 NoMethod 使用

Hertz 提供了 NoRouteNoMethod 方法用于全局处理 HTTP 404 与 405 请求。

当使用 NoMethod 时需要与 WithHandleMethodNotAllowed 配合使用。

示例代码:

package mainimport ("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(server.WithHandleMethodNotAllowed(true))h.POST("/ping", func(ctx context.Context, c *app.RequestContext) {c.JSON(consts.StatusOK, utils.H{"ping": "pong"})})// set NoRoute handlerh.NoRoute(func(ctx context.Context, c *app.RequestContext) {c.String(consts.StatusOK, "no route")})// set NoMethod handlerh.NoMethod(func(ctx context.Context, c *app.RequestContext) {c.String(consts.StatusOK, "no method")})h.Spin()
}

经测试,只有NoRoute有效,NoMethod无效

重定向尾斜杠

Hertz 在默认情况下会根据请求 path 末尾的 / 自动进行转发。

如果 router 中只有 /foo/,那么请求 /foo 会被自动重定向到 /foo/;

如果 router 中只有 /foo,那么 /foo/ 会被重定向到 /foo。

这样的请求除 GET 以外的请求方法都会触发 307 Temporary Redirect 状态码,而 GET 请求会触发 301 Moved Permanently 状态码。

可以在配置中取消,如下:

package mainimport "github.com/cloudwego/hertz/pkg/app/server"func main() {h := server.New(server.WithRedirectTrailingSlash(false))...
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/889431.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

No.1 VS code

1、认识 VS code 2、快速创建一个.html 文件 1)新建文件:test.html 2)英文状态下输入一个“!”,回车; 3)在body中输入“我的第一个网页”; 4)运行:从文件夹中找到创建的这个文件,双击打开(以后讲其他运行方式) 3、VSCode 快捷键 1)! + 回车:快速创建一个html…

太阳花

import turtle from turtle import * color(red , yellow) begin_fill() while True: forward(200) right(170) if abs( pos() ) < 1: break end_fill() done() turtle.fd(100)

前端主流构建工具

本文首发博客网站,由于图片和格式解析问题,可前往阅读原文随着前端开发复杂度的提升,构建工具在开发流程中扮演着越来越重要的角色。这些工具可以帮助开发者实现代码的打包、优化、转译、模块化处理等功能,从而提升开发效率和用户体验。本文将以当前主流的前端构建工具为核…

DeepSeek “源神”启动!「GitHub 热点速览」

​上周,DeepSeek 官方宣布将陆续发布 5 个开源项目。本周一开源社区就迎来了首发之作——FlashMLA!该项目开源后,不到一天 Star 数已突破 6k,并且还在以惊人的速度持续飙升。GitHub 地址:github.com/deepseek-ai/FlashMLAFlashMLA 是一个针对 Hopper GPU 优化的高效 MLA(…

读DAMA数据管理知识体系指南04数据治理(上)

读DAMA数据管理知识体系指南04数据治理(上)1. 数据治理 1.1. Data Governance, DG1.1.1. 定义是在管理数据资产过程中行使权力和管控,包括计划、监控和实施1.1.2. 数据治理职能是指导所有其他数据管理领域的活1.1.3. 目的是确保根据数据管理制度和最佳实践正确地管理数据1.1…

Virtual Box设置桥接模式

一、硬件 1.查看宿主机ip cmd命令:ipconfig 无线局域网适配器 WLAN:连接特定的 DNS 后缀 . . . . . . . :IPv6 地址 . . . . . . . . . . . . : 保密本地链接 IPv6 地址. . . . . . . . : fe80::f087:44c8:88bc:b041%11IPv4 地址 . . . . . . . . . . . . : 192.168.43.149子网…

【NuGet攻略】C#开发者必备技能:构建发布开发工具包

来源 https://mp.weixin.qq.com/s/YqKTdyLXuODBLxnhar52Xg 2025年02月22日 17:44 广东前言 在 C# 开发领域里,构建代码库,分享与使用可复用代码的机制是十分必要的,它可以提高开发效率。通常,我们把可复用代码打包后的文件称为包(Package)。 在 .NET 中,通过使用 NuGet…

【2025穿越时空 怀旧经典】VMware Workstation Pro助你重返WindowsXP,让怀旧不再是空谈!

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注使用VMware Workstation Pro 虚拟机安装XP系统 让你瞬间回到黄金年代准备WindowsXP ISO镜像文件 大家…

【2025最新】VMware Workstation Pro 虚拟机配置与安装VMware Tools 感受它的强大~

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注安装VMware Tools VMware Tools是什么 VMware Tools是VMware虚拟机中自带的一种增强工具,它提供了一…

【2025最新】 神奇!VMware Workstation Pro虚拟机还原与删除功能,让你轻松应对各种场景!

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注删除虚拟机 删除虚拟机其实很简单,首先选择你要删除的虚拟机, 然后鼠标右键, 选择移除即可! 如图但这…

VMware Workstation Pro 虚拟机基础配置教程,方便你的神操作!

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注VMware Workstation Pro 基本配置与操作 在我们安装好VMware之后,接下来我们可以对VMware做一个基本的…