引言
httprouter简介
安装
go get -u github.com/julienschmidt/httprouter
httprouter核心概念
路由结构
type Route struct {
Pattern string
Handler http.Handler
}
其中,Pattern 是路由模式,Handler 是处理请求的函数。
路由注册
使用New()函数创建一个新的路由器实例,并使用Handle()方法注册路由:
router := httprouter.New()
router.Handle("GET", "/user/:id", GetUserHandler)
这里,/user/:id 是一个参数路由,:id 是一个动态参数。
路由匹配
处理函数
处理函数接收三个参数:请求对象、请求参数和响应写入器。例如:
func GetUserHandler(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
id := ps.ByName("id")
// 处理请求
}
httprouter实战技巧
1. 使用命名路由
使用命名路由可以提高代码的可读性和可维护性:
router.GET("/user/:id", namedHandler("getUser", GetUserHandler))
然后,您可以在其他地方引用命名路由:
router.GET("/profile", getUserHandler("getUser"))
2. HTTP方法
您可以使用Methods()方法路由支持的HTTP方法:
router.Handle("GET", "/user/:id", GetUserHandler, httprouter.Methods("GET"))
3. 使用中间件
中间件可以用于处理所有请求,例如日志记录、认证等:
func LoggingMiddleware(next httprouter.Handle) httprouter.Handle {
return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
// 日志记录
next(w, r, ps)
}
}
router.Use(LoggingMiddleware)
4. 路由级参数解析
您可以在路由处理函数中直接访问参数:
func GetUserHandler(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
id := ps.ByName("id")
// 使用id进行操作
}
5. 使用正则表达式
router.POST("^/user/([0-9]+)$", GetUserHandler)
这里,[0-9]+ 是一个正则表达式,匹配一个或多个数字。