字节赫兹 框架教程 二 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

相关文章
|
8月前
|
安全 中间件
字节赫兹 框架教程 一请求上下文之请求(三)
字节赫兹 框架教程 一请求上下文之请求
87 0
|
27天前
|
数据格式 Python
【嵌入式】波特率9600,发送8个字节需要多少时间,如何计算?
波特率9600,发送 `01 03 00 00 00 04 44 09` (8字节) 需要多少时间,如何计算?
71 7
|
8月前
|
编解码 算法 异构计算
m基于CCSDS标准的LDPC编码器的FPGA实现,包含testbench,码长1024,码率0.5
在Vivado 2019.2中进行的LDPC码仿真展示了算法的良好效果。LDPC码是一种1962年由Gallager提出的稀疏校验矩阵线性分组码,利用Tanner图表示编码解码结构。CCSDS标准定义的LDPC(1024,512)码具有准循环结构,适用于空间通信,其编码通过填充信息比特和校验节点的线性组合实现。Verilog代码示例展示了TEST_encoder_top模块,用于控制LDPC编码过程,包括时钟、复位信号处理和中间数据读取。
114 1
计算机中的单位转化及二进制的计算方法
计算机中的单位转化及二进制的计算方法
|
8月前
|
编解码 算法 索引
m基于码率兼容打孔LDPC码ms最小和译码算法的LDPC编译码matlab误码率仿真
m基于码率兼容打孔LDPC码ms最小和译码算法的LDPC编译码matlab误码率仿真
70 0
|
8月前
字节赫兹 框架教程 二 Routers(2)
字节赫兹 框架教程 二 Routers
95 0
|
8月前
|
网络协议 中间件 Unix
字节赫兹 框架教程 一 Engine
字节赫兹 框架教程 一 Engine
153 0
|
8月前
字节赫兹 框架教程 一请求上下文之请求(二)
字节赫兹 框架教程 一请求上下文之请求
63 0
|
8月前
|
存储 安全 中间件
字节赫兹 框架教程 一请求上下文之请求(一)
字节赫兹 框架教程 一请求上下文之请求
72 0
|
传感器 芯片
模拟量与数字量区别
模拟量与数字量区别
201 0