Golang Web 框架 Chi

2,995 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

chi框架非常小,核心代码甚至只有不到1000行,但是对web中比较重要的环节(路由)进行了很好的封装,方便提供RestApi服务;目前在Golang社区中比较火的框架Caddy也使用到了chi。

官方文档:go-chi.io/#/pages/get…

chi 安装

考虑到chi的最新版为5.x,故项目通过module初始化后,使用以下命令安装

go get -u github.com/go-chi/chi/v5

快速上手

chi的项目上手很快,核心分为三个步骤:

  1. 初始化Mux对象,拿到管理路由的结构体
  2. 针对不同的路由规则定义处理的方法
  3. 监听特定的端口,并提供相应的web服务
// 获取 Mux 对象
r := chi.NewRouter()
// 针对根路由 / 编写处理逻辑,返回 Hello World
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
   w.Write([]byte("Hello World!"))
})
// 监听 3000 端口并提供 web 服务
http.ListenAndServe(":3000", r)

中间件

chi封装了多种常用的中间件,同时为自定义中间件提供了封装思路。

框架自带的中间件

框架自身支持了26种中间件,包括basic_auth(身份认证)、compress(响应压缩)、logger(启用日志)、nocache(无缓存)等,涵盖了web开发中绝大多数的使用场景。当需要接入框架自带的中间件时也比较简单,通过r.Use()的方式即可,如下所示,接入日志中间件:

r.Use(middleware.Logger)

引入自定义中间件

可以参考以下方法自定义中间件,数据通过http.Handler进行维护,使用next.ServeHTTP()方法进行传递;在项目中引入该中间件的方式与框架自定义中间件的方式一致,通过r.Use()的方式使用。

// 自定义中间件函数
func chiMiddleware(next http.Handler) http.Handler {
   return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
      w.Write([]byte("Middleware Print\n"))
      next.ServeHTTP(w, r)
   })
}

// 使用 chiMiddleware 中间件
// ... r.Use(chiMiddleware)

路由

在请求路由中,提供了多种http方法的支持;同时,针对请求地址可以方便的进行参数解析、嵌套分组。

请求方法

支持 Head、Get、Post、Put、Delete 等常规的http方法,使用方法如下所示:

// Get 标识当请求方法是get,访问地址是 / 时,进入以下Handle中;
// 同理,当需要支持其他http方法时,修改 Get 为相应的方法名即可
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
   w.Write([]byte("Hello World!"))
})

获取URI中的参数

使用大括号将参数括起来{},通过chi.URLParam()方法解析出地址上面的值

// curl 127.0.0.1:3000/data
// response ==> data
r.Get("/{data}", func(w http.ResponseWriter, r *http.Request) {
   data := chi.URLParam(r, "data")
   w.Write([]byte(data))
})

分组

使用Route进行分组,第一个参数为该分组的前缀地址,第二个参数为以Router为参数的func,通过这层逻辑的设计,可以巧妙的实现分组的多层嵌套。

// curl http://localhost:3000/route/data
// response ==> data
r.Route("/route", func(r chi.Router) {
   r.Get("/{data}", func(w http.ResponseWriter, r *http.Request) {
      data := chi.URLParam(r, "data")
      w.Write([]byte(data))
   })
})