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)

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~