字节赫兹 框架教程 二 Routers(1)

简介: 字节赫兹 框架教程 二 Routers

路由

路由注册

Hertz 提供了 GET、POST、PUT、DELETE、ANY 等方法用于注册路由。

方法 介绍
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 main
import (
  "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()
}

路由组

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

示例代码:

package main
import (
  "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()
}

在路由组中使用中间件

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

示例代码 1:

package main
import (
  "context"
  "github.com/cloudwego/hertz/pkg/app"
  "github.com/cloudwego/hertz/pkg/app/middlewares/server/basic_auth"
  "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"))
  // use middleware
  v1 := h.Group("/v1", basic_auth.BasicAuth(map[string]string{"test": "test"}))
  v1.GET("/ping", func(c context.Context, ctx *app.RequestContext) {
    ctx.String(consts.StatusOK,"ping")
  })
  h.Spin()
}

示例代码 2:

package main
import (
  "context"
  "github.com/cloudwego/hertz/pkg/app"
  "github.com/cloudwego/hertz/pkg/app/middlewares/server/basic_auth"
  "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")
  // use `Use` method
  v1.Use(basic_auth.BasicAuth(map[string]string{"test": "test"}))
  v1.GET("/ping", func(c context.Context, ctx *app.RequestContext) {
    ctx.String(consts.StatusOK,"ping")
  })
  h.Spin()
}

路由类型

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

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

命名参数路由

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

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

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

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

示例代码:

package main
import (
  "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"))
  // This handler will match: "/hertz/version", but will not match : "/hertz/" or "/hertz"
  h.GET("/hertz/:version", func(ctx context.Context, c *app.RequestContext) {
    version := c.Param("version")
    c.String(consts.StatusOK, "Hello %s", version)
  })
  h.Spin()
}


字节赫兹 框架教程 二 Routers(2)https://developer.aliyun.com/article/1391748

相关文章
|
数据采集 监控 JavaScript
网站流量日志分析 —数据采集—页面埋点 JavaScript 收集数据|学习笔记
快速学习网站流量日志分析—数据采集—页面埋点 JavaScript 收集数据
1062 0
网站流量日志分析 —数据采集—页面埋点 JavaScript 收集数据|学习笔记
|
6月前
|
安全 小程序 JavaScript
OAuth2.0四种授权模式
OAuth2四种授权模式简介:授权码模式最安全,适用于第三方登录;简化模式无授权码,token直接返回,适合无后端场景;密码模式需用户共享账号信息,仅限高度信任服务;客户端模式为服务间调用,无需用户参与。
|
消息中间件 存储 大数据
聊一聊几款主流消息队列之间的差异,我们应该如何选择
聊一聊几款主流消息队列之间的差异,我们应该如何选择
1123 2
|
移动开发 Android开发 Swift
|
SQL JSON Go
Go - 基于 GORM 获取当前请求所执行的 SQL 信息
Go - 基于 GORM 获取当前请求所执行的 SQL 信息
527 3
|
SQL 安全 前端开发
Sourcecodester Fantastic Blog CMS v1.0 SQL 注入(CVE-2022-28512)
Sourcecodester Fantastic Blog CMS v1.0 SQL 注入(CVE-2022-28512)
|
Go 开发者
如何使用 Golang 实现继承:详细指南
【8月更文挑战第31天】
1469 0
|
监控 安全 算法
简单来看看什么是侧信道攻击
简单来看看什么是侧信道攻击
1181 0