引言

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]+ 是一个正则表达式,匹配一个或多个数字。

总结