Router-路由请求
Introduction
Go 语言中的 net/http
包对于 HTTP 协议提供许多功能。一方面对于像分段 URL 请求到单个参数是复杂不是十分好。幸运的是这里有一个非常受欢迎包来做这些,在 Go 社区中以高质量闻名。通过这个例子你将会看到如何使用 gorilla/mux
包来创建使用命名参数路由,处理 GET/POST 和限制作用域。
安装 gorilla/mux
包
gorilla/mux
包 它适配 Go 语言默认的 HTTP 路由。当写 web 应用时它有许多特性来增加生产力。它同样兼容GO语言默认请求处理特性 func (w http.ResponseWriter, r *http.Request)
,所以 包能够混合和匹配其他HTTP 包像 middleware 或者已经有的应用。使用 go get
命令去安装包 从 GitHub 像这样:
go get -u github.com/gorilla/mux
创建一个新路由
首先创建一个请求路由。这个路由作为你应用的主要路由和稍后将作为参数传给服务。它将会接收所有HTTP 连接和通过请求处理来注册在上面。你将创建一个新路由像这样:
r := mux.NewRouter()
注册一个请求处理(Handler)
一旦你有一个新路由你能像往常一样注册处理请求。它而不是调用 http.HandleFunc(...)
,你调用 HandleFunc
在你路由像这样:
r.HandleFunc(...)
.
URL 参数
gorilla/mux
提供最大力量是从请求 URL 分段提取能力。 一个例子,这是一个 URL 在你的应用:
/books/go-programming-blueprint/page/10
这个路由有两个动态分段:
slug 书标题(go-programming-blueprint)
Page (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
作为参数和返回 map 分段。
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
中的默认路由。使用自己的路由时,利用路由 r
变量来替换 nil
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
路由特性
方法
限制请求处理的 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")
域名&子域
限制访问请求的域名或子域
r.HandleFunc("/books/{title}", BookHandler).Host("www.mybookstore.com")
Schemes
限制访问请求是 http/https.
r.HandleFunc("/secure", SecureHandler).Schemes("https")
r.HandleFunc("/insecure", InsecureHandler).Schemes("http")
路径前缀或子路径
限制访问请求的特殊路径前缀
bookrouter := r.PathPrefix("/books").Subrouter()
bookrouter.HandleFunc("/", AllBooks)
bookrouter.HandleFunc("/{title}", GetBook)