Go Web 示例: 路由(使用gorilla/mux)

简介

Go 的 net/http 包为 HTTP 协议提供了很多功能, 但路由较为复杂。 幸运的是,有一个非常流行的包,它在 Go 社区中以良好的代码质量而闻名。 在本示例中,您将看到如何使用 gorilla/mux 包创建具有命名参数、GET/POST 处理程序和域名限制的路由。

安装 gorilla/mux 包

gorilla/mux 是一个适配 Go 默认 HTTP 路由器的包。 它具有许多功能,可在编写 Web 应用程序时提高生产力。 它还符合 Go 的默认请求处理程序签名 func (w http.ResponseWriter, r *http.Request),因此该包可以与其他 HTTP 库(如中间件或现有应用程序)混合和匹配。 使用 go get 命令从 GitHub 安装包,如下所示:

1
go get -u github.com/gorilla/mux

创建一个新的路由

首先创建一个新的请求路由。 路由是你的 Web 应用程序的主要路由,稍后将作为参数传递给服务器。 它将接收所有 HTTP 连接并将其传递给您将在其上注册的请求处理程序。 你可以像这样创建一个新的路由:

1
r := mux.NewRouter()

注册请求处理程序

一旦你有了一个新的路由器,你就可以像往常一样注册请求处理程序。 唯一的区别是,不是调用 http.HandleFunc(...),而是像这样在路由器上调用 HandleFunc:r.HandleFunc(...)

URL 参数

gorilla/mux 路由器的最大优势是能够从请求 URL 中提取片段。 例如,这是你应用程序中的 URL:

1
/books/go-programming-blueprint/page/10

此 URL 有两个动态段: 书名 slug (go-programming-blueprint) 页 (10) 要让请求处理程序与上面提到的 URL 匹配,请在 URL 模式中用占位符替换动态段,如下所示:

1
2
3
4
r.HandleFunc("/books/{title}/page/{page}", func(w http.ResponseWriter, r *http.Request) {
    // get the book
    // navigate to the page
})

最后一件事是从这些段中获取数据。 该包带有函数 mux.Vars(r),它将 http.Request 作为参数并返回段的映射。

1
2
3
4
5
func(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    vars["title"] // the book title slug
    vars["page"] // the page
}

设置 HTTP 服务器的路由

有没有想过 http.ListenAndServe(":80", nil) 中的 nil 是什么? 它是 HTTP 服务器的主路由器的参数。 默认为nil,表示使用net/http包的默认路由。 要使用您自己的路由器,请将 nil 替换为路由器 r 的变量

1
http.ListenAndServe(":80", r)

示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
    "fmt"
    "net/http"

    "github.com/gorilla/mux"
)

func main() {
    r := mux.NewRouter()

    r.HandleFunc("/books/{title}/page/{page}", func(w http.ResponseWriter, r *http.Request) {
        vars := mux.Vars(r)
        title := vars["title"]
        page := vars["page"]

        fmt.Fprintf(w, "You've requested the book: %s on page %s\n", title, page)
    })

    http.ListenAndServe(":80", r)
}

gorilla/mux 路由器的特点

方法

将请求处理程序限制为特定的 HTTP 方法。

1
2
3
4
r.HandleFunc("/books/{title}", CreateBook).Methods("POST")
r.HandleFunc("/books/{title}", ReadBook).Methods("GET")
r.HandleFunc("/books/{title}", UpdateBook).Methods("PUT")
r.HandleFunc("/books/{title}", DeleteBook).Methods("DELETE")

主机名&子域名

将请求处理程序限制为特定的主机名或子域。

1
r.HandleFunc("/books/{title}", BookHandler).Host("www.mybookstore.com")

协议

将请求处理程序限制为 http/https。

1
2
r.HandleFunc("/secure", SecureHandler).Schemes("https")
r.HandleFunc("/insecure", InsecureHandler).Schemes("http")

路径前缀和子路由

将请求处理程序限制为特定的路径前缀。

1
2
3
bookrouter := r.PathPrefix("/books").Subrouter()
bookrouter.HandleFunc("/", AllBooks)
bookrouter.HandleFunc("/{title}", GetBook)

本文翻译自:https://gowebexamples.com/routes-using-gorilla-mux/

updatedupdated2021-06-102021-06-10
Load Comments?