router 作为联系之前的 Server「http服务器」和 我们编写的 handler「业务处理函数」的桥梁。go-zero 自实现了一套自己的路由系统。首先看看 Server 启动流程与 router 的配合:

基本结构

所以 router 从函数功能上:

Func Name

功能

NewPatRouter

New pattern Router

Handle

把 path 和 开发者自定义的 handler 函数绑定

ServeHTTP

根据传递过来的 Request,匹配之前注册的 URL 和处理函数,找到最匹配的项,进行处理。

「也只有实现了这个函数,才能成为 handler。然后去执行其他的 handler(其中就有开发者自己编写的)」

 









example

简单 mock 一个http请求过程:

func main() {
    r, err := http.NewRequest(http.MethodPost, "http://hello/testname/20",nil)
    if err != nil {
        log.Fatal(err)
        return
    }
    // 1. new Router
    router := router.NewPatRouter()

    // 2. register path, bind handler
    err = router.Handle(http.MethodPost, "/:name/:year", http.HandlerFunc(
        func(w http.ResponseWriter, r *http.Request) {
            v := struct {
                Name     string `path:"name"`
                Year     int    `path:"year"`
                Nickname string `form:"nickname"`
                Zipcode  int64  `form:"zipcode"`
                Location string `json:"location"`
                Time     int64  `json:"time"`
            }{}

            _ = httpx.Parse(r, &v)
            fmt.Println(v)
        }))
    if err != nil {
        log.Fatal(err)
        return
    }
    // 3.0 mock
    rr := httptest.NewRecorder()
    // 3. 开始处理请求,分发请求到不同的 handler 进行处理
    router.ServeHTTP(rr, r)
}

//{testname 20  0  0}