开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
chi框架非常小,核心代码甚至只有不到1000行,但是对web中比较重要的环节(路由)进行了很好的封装,方便提供RestApi服务;目前在Golang社区中比较火的框架Caddy也使用到了chi。
chi 安装
考虑到chi的最新版为5.x,故项目通过module初始化后,使用以下命令安装
go get -u github.com/go-chi/chi/v5
快速上手
chi的项目上手很快,核心分为三个步骤:
- 初始化Mux对象,拿到管理路由的结构体
- 针对不同的路由规则定义处理的方法
- 监听特定的端口,并提供相应的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))
})
})