Go Web编程入门:路由
引言
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 库(如中间件或现有应用程序)混合和加工。使用 go get 命令从 GitHub 安装包,如下所示:
go get -u github.com/gorilla/mux
创建新路由
首先创建一个新的请求路由器。路由器是您的 Web 应用程序的主路由器,稍后将作为参数传递给服务器。它将接收所有 HTTP 连接并将其传递给您将在其上注册的请求处理程序。您可以像这样创建一个新路由器:
r := mux.NewRouter()
注册请求处理程序
一旦你有了一个新的路由器,你就可以像往常一样注册请求处理程序。唯一的区别是,不是调用 http.HandleFunc(...)
,而是在路由器上调用 HandleFunc
,如下所示:r.HandleFunc(...)
。
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 slugvars["page"] // the page
}
设置 HTTP 服务器的路由器
有没有想过 http.ListenAndServe(":80", nil)
中的 nil 是什么?它是 HTTP 服务器的主路由器的参数。默认为 nil,表示使用 net/http 包的默认路由器。要使用您自己的路由器,请将 nil 替换为您的路由器 r 的变量。
http.ListenAndServe(":80", r)
代码(用于复制/粘贴)
这是完整的代码,您可以使用它来尝试在此示例中学到的东西。
package mainimport ("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)
最后,来一波【福利】,关注我:
免费领取 云服务器、免费做网站
Go Web编程入门:路由相关推荐
- go web编程入门教程
想了解下区块链相关的东西,从头开始学习go 语法实在是耐不下心,稍微看了下 还是直接做web来学吧,主要材料如下 尚硅谷GoWeb教程 go web编程快速入门 go语言标准库 web应用的流程如图所 ...
- Java Web 编程入门知识
Java SE 的内容基本都讲完了. 但是 Java一般用于网络编程, 就是所谓的web编程. Java SE讲的基本上都是本地程序的内容. 而Java web编程需要在两个程序中传输数据, 以后就是 ...
- Go Web 编程 (一) - 快速入门
1.应用场景 基于go, 编写web项目, 替换PHP的实现方案. 2.学习/操作 1. 文档 快速入门:创建第一个 Go Web 应用 | 快速入门 | Go Web 编程 2. 整理输出 2.1 ...
- Python编程入门实战:打造你的第一个Web应用
简介 欢迎来到本篇博客--"Python编程入门实战:打造你的第一个Web应用".无论你是一个初学者,还是有一些编程基础的开发者,我相信你都可以在这篇文章中收获知识和启发. Pyt ...
- 《jQuery与JavaScript入门经典》——第 1 章 动态Web编程简介 1.1理解Web服务器浏览器范式...
本节书摘来自异步社区<jQuery与JavaScript入门经典>一书中的第1章,第1.1节,作者:[美]Brad Dayley著,更多章节内容可以访问云栖社区"异步社区&quo ...
- 开心档开发入门网之C++ Web 编程
C++ Web 编程 什么是 CGI? 公共网关接口(CGI),是一套标准,定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的. CGI 规范目前是由 NCSA 维护的,NCSA 定义 CG ...
- linux c语言 ppt,linux操作系统下c语言编程入门.ppt
linux操作系统下c语言编程入门.ppt Linux操作系统下C语言编程入门 CNT Linux操作系统简介基础知识进程介绍文件操作时间概念消息管理线程操作网络编程Linux下C开发工具介绍 一 L ...
- 脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手
转自即时通讯网:http://www.52im.net/ 1.引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道"三次"和&quo ...
- Go Web编程--应用ORM
上篇文章中我们在使用的开发环境中增加了 MySQL容器,然后介绍了使用 database/sql标准库结合数据库驱动包进行数据库操作的方法.不过它们是相对偏底层的软件包.实际开发经常会使用一些在它的基 ...
最新文章
- ADB常用命令简洁版整理
- PyTorch 入门实战
- 各大公司容器云的技术栈对比
- npm全局环境变量配置及解决VsCode使用时遇到的问题
- 为什么大家更愿意使用MyBatis,读完源码我知道了…
- 使用SourceTree
- 正则表达式中,[\s\S]*
- 图解ThreadLocal核心原理
- angular环境配置
- 【读书笔记《Android游戏编程之从零开始》】8.Android 游戏开发常用的系统控件(系统控件常见问题)
- 现代软件工程 第十五章 【稳定和发布阶段】练习与讨论
- 制作自启动的MSDN简体中文版和英文版win98ISO镜像
- 可解释人工智能XAI
- 剑指Offer读书笔记(持续更新中)
- 猎聘、BOSS、智联、前程无忧这几个招聘网站我都用过
- 飞鹅云打印机api接口asp版,asp源码对接飞鹅云小票打印机
- ReacNative:报错Cannot add a child that doesn’t have a YogaNode to a parent without a measure function!
- 云片:批量发送超级短信示例
- JSF标签详解(全)
- ubuntu与centos哪个更适合做服务器。