Go Web编程入门:路由

举报
宇宙之一粟 发表于 2022/05/16 10:50:46 2022/05/16
【摘要】 引言Go 的 net/http 包为 HTTP 协议提供了很多功能。它做得不好的一件事是复杂的请求路由,例如将请求 url 分割成单个参数。幸运的是,有一个非常流行的包,它在 Go 社区中以良好的代码质量而闻名。在此示例中,您将看到如何使用 gorilla/mux 包创建具有命名参数、GET/POST 处理程序和域限制的路由。安装 gorilla/mux 包gorilla/mux 是一个适配...

引言

Go 的 net/http 包为 HTTP 协议提供了很多功能。它做得不好的一件事是复杂的请求路由,例如将请求 url 分割成单个参数。

幸运的是,有一个非常流行的包,它在 Go 社区中以良好的代码质量而闻名。在此示例中,您将看到如何使用 gorilla/mux 包创建具有命名参数、GET/POST 处理程序和域限制的路由。

  1. 安装 gorilla/mux

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

go get -u github.com/gorilla/mux
  1. 创建新路由

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

r := mux.NewRouter()
  1. 注册请求处理程序

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


  1. URL 参数

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

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

此 URL 有两个动态段:

  • 书名 slug (go-programming-blueprint)

  • 页 (10)

要让请求处理程序与上面提到的 URL 匹配,您可以使用 URL 模式中的占位符替换动态段,如下所示:

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 作为参数并返回段的映射。

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 的变量。

http.ListenAndServe(":80", r)

代码(用于复制/粘贴)

这是完整的代码,您可以使用它来尝试在此示例中学到的东西。

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 路由器的特点。

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

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")
  1. Schemes

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

r.HandleFunc("/secure", SecureHandler).Schemes("https")
r.HandleFunc("/insecure", InsecureHandler).Schemes("http")
  1. 路径前缀和子路由器

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

bookrouter := r.PathPrefix("/books").Subrouter()
bookrouter.HandleFunc("/", AllBooks)
bookrouter.HandleFunc("/{title}", GetBook)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。