查看“Go网络编程-Routing (using gorilla/mux)”的源代码
←
Go网络编程-Routing (using gorilla/mux)
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
Go语言中的net/http包为HTTP协议提供了许多功能。然而,它在处理复杂的请求路由方面表现得并不是很好,比如将请求URL分割成单个参数。幸运的是,有一个在Go社区中因其良好代码质量而广受欢迎的包可以解决这个问题。在这个例子中,你将看到如何使用gorilla/mux包创建带有命名参数、GET/POST处理器和域名限制的路由。 <br> <span id="安装gorillamux包"></span> == 安装gorilla/mux包 == gorilla/mux是一个适配Go默认HTTP路由器的包。它具有许多功能,可以提高编写Web应用程序时的生产力。它也符合Go默认的请求处理器签名func (w http.ResponseWriter, r *http.Request),因此该包可以与其他HTTP库(如中间件或现有应用程序)混合使用。可以使用go get命令从GitHub安装该包,如下所示: <syntaxhighlight lang="shell">go get -u github.com/gorilla/mux</syntaxhighlight> <br> == 创建一个新的路由器 == 首先创建一个新的请求路由器。路由器是Web应用程序的主要路由器,稍后将作为参数传递给服务器。它将接收所有HTTP连接,并将其传递给你将在其上注册的请求处理器。你可以像这样创建一个新的路由器: <syntaxhighlight lang="go">r := mux.NewRouter()</syntaxhighlight> <br> == 注册请求处理器 == 一旦你有了一个新的路由器,你就可以像往常一样注册请求处理器。唯一的区别是,不是调用http.HandleFunc(…),而是在你的路由器上调用HandleFunc,像这样:r.HandleFunc(…)。 <br> <span id="url参数"></span> == URL参数 == gorilla/mux路由器的最大优势是能够从请求URL中提取片段。例如,这是你应用程序中的一个URL: <syntaxhighlight lang="html">/books/go-programming-blueprint/page/10</syntaxhighlight> <br> 这个URL有两个动态片段: * 书籍标题slug(go-programming-blueprint) * 页面(10) <br> 要让请求处理器匹配上述URL,你需要在URL模式中使用占位符替换动态片段,如下所示: <syntaxhighlight lang="go">r.HandleFunc("/books/{title}/page/{page}", func(w http.ResponseWriter, r *http.Request) { // get the book // navigate to the page })</syntaxhighlight> <br> 最后一步是从这些片段中获取数据。该包提供了一个函数mux.Vars(r),它接受http.Request作为参数,并返回一个片段的映射。 <syntaxhighlight lang="go">func(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) vars["title"] // the book title slug vars["page"] // the page }</syntaxhighlight> <br> <span id="设置http服务器的路由器"></span> == 设置HTTP服务器的路由器 == 你是否曾经想知道http.ListenAndServe(“:80”, nil)中的nil是什么意思?它是HTTP服务器主路由器的参数。默认情况下,它是nil,意味着使用net/http包的默认路由器。要使用你自己的路由器,请用你的路由器变量r替换nil。 <syntaxhighlight lang="go">http.ListenAndServe(":80", r)</syntaxhighlight> <br> == 完整代码 == <syntaxhighlight lang="go">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) }</syntaxhighlight> <br> <span id="gorillamux路由器的特点"></span> == gorilla/mux路由器的特点 == === 方法 === 将请求处理器限制为特定的HTTP方法。 <syntaxhighlight lang="go">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")</syntaxhighlight> <br> === 主机名和子域名 === 将请求处理器限制为特定的主机名或子域名。 <syntaxhighlight lang="go">r.HandleFunc("/books/{title}", BookHandler).Host("www.mybookstore.com")</syntaxhighlight> <br> === 协议 === 将请求处理器限制为http/https。 <syntaxhighlight lang="go">r.HandleFunc("/secure", SecureHandler).Schemes("https") r.HandleFunc("/insecure", InsecureHandler).Schemes("http")</syntaxhighlight> <br> === 路径前缀和子路由器 === 将请求处理器限制为特定的路径前缀。 <syntaxhighlight lang="go">bookrouter := r.PathPrefix("/books").Subrouter() bookrouter.HandleFunc("/", AllBooks) bookrouter.HandleFunc("/{title}", GetBook)</syntaxhighlight> <br>
返回至“
Go网络编程-Routing (using gorilla/mux)
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
基础知识
正则表达式
Markdown
分布式
项目管理
系统集成项目管理基础知识
云原生
Docker
云原生安全
云原生词汇表
十二因素应用
Kubernetes
音频处理
音频合成
Edge-tts
CMS系统
Docsify
VuePress
Mediawiki
自动生成
Marp
CI/CD
GitLab
设计
颜色
平面设计
AI
数字人
操作系统
GNU/Linux
数据库
Mysql
工具
链入页面
相关更改
特殊页面
页面信息