使用gorilla/mux可构建灵活路由,支持参数解析、HTTP方法限制、子路由及自定义匹配。通过r.NotFoundHandler可处理404错误,结合httptest可进行路由测试。

使用
gorilla/mux可以让你在 Golang 应用中构建更灵活、更强大的路由。它不仅仅是简单的 URL 匹配,还能处理子域名、HTTP 方法、甚至自定义的匹配规则。
gorilla/mux提供了强大的路由功能,让你的 Golang Web 应用更具可维护性和扩展性。
解决方案
-
安装
gorilla/mux
:立即学习“go语言免费学习笔记(深入)”;
首先,你需要获取
gorilla/mux
包。在你的项目目录下,运行以下命令:go get github.com/gorilla/mux
-
基本路由:
package main import ( "fmt" "log" "net/http" "github.com/gorilla/mux" ) func homeHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Welcome Home!") } func main() { r := mux.NewRouter() r.HandleFunc("/", homeHandler) log.Fatal(http.ListenAndServe(":8080", r)) }这段代码创建了一个新的
mux.Router
实例,并将根路径/
映射到homeHandler
函数。 -
带参数的路由:
gorilla/mux
允许你在 URL 中定义参数,并在处理函数中访问它们。func articleHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) articleID := vars["id"] fmt.Fprintf(w, "Article ID: %s\n", articleID) } func main() { r := mux.NewRouter() r.HandleFunc("/articles/{id}", articleHandler) log.Fatal(http.ListenAndServe(":8080", r)) }在这里,
{id}是一个路由变量。你可以通过mux.Vars(r)
获取所有变量,然后使用键名访问特定的变量。 -
HTTP 方法限制:
你可以限制路由只响应特定的 HTTP 方法。
51shop 网上商城系统下载51shop 由 PHP 语言开发, 使用快速的 MySQL 数据库保存数据 ,为中小型网站实现网上电子商务提供一个完美的解决方案.一、用户模块1. 用户注册:用户信息包括:用户ID、用户名、用户密码、性别、邮箱、省份、城市、 联系电话等信息,用户注册后不能立即使用,需由管理员激活账号,才可使用(此功能管理员可设置)2. 登录功能3. 资料修改:用户可修改除账号以后的所有资料4. 忘记密码:要求用
func createHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Creating a new resource...") } func main() { r := mux.NewRouter() r.HandleFunc("/resources", createHandler).Methods("POST") log.Fatal(http.ListenAndServe(":8080", r)) }这个路由只会在收到
POST
请求时被触发。 -
使用子路由:
子路由允许你创建更复杂的路由结构。
func productsHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "All products...") } func productHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) productID := vars["id"] fmt.Fprintf(w, "Product ID: %s\n", productID) } func main() { r := mux.NewRouter() productsRouter := r.PathPrefix("/products").Subrouter() productsRouter.HandleFunc("/", productsHandler) productsRouter.HandleFunc("/{id}", productHandler) log.Fatal(http.ListenAndServe(":8080", r)) }所有以
/products
开头的 URL 都会被路由到productsRouter
,然后根据剩余的路径进行进一步的路由。
如何处理 gorilla/mux
路由中的 404 错误?
当
gorilla/mux无法匹配任何定义的路由时,默认情况下会返回一个标准的 404 页面。你可以通过自定义
NotFoundHandler来修改这个行为。
func notFoundHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNotFound)
fmt.Fprintln(w, "Custom 404 - Page not found!")
}
func main() {
r := mux.NewRouter()
r.HandleFunc("/", homeHandler)
r.NotFoundHandler = http.HandlerFunc(notFoundHandler)
log.Fatal(http.ListenAndServe(":8080", r))
}通过设置
r.NotFoundHandler,你可以指定一个自定义的函数来处理所有未匹配的路由。
gorilla/mux
的高级用法有哪些?
除了基本的路由功能,
gorilla/mux还支持许多高级特性:
- Host 路由: 根据请求的 Hostname 匹配路由。
- Scheme 路由: 根据请求的 Scheme (http 或 https) 匹配路由。
- 自定义匹配器: 你可以编写自己的匹配器函数,实现更复杂的路由逻辑。
-
中间件:
gorilla/mux
可以与中间件集成,实现请求预处理和后处理。
如何测试 gorilla/mux
路由?
测试路由是确保你的应用正常工作的重要部分。你可以使用
net/http/httptest包来模拟 HTTP 请求,并验证路由的行为。
import (
"net/http"
"net/http/httptest"
"testing"
"github.com/gorilla/mux"
)
func TestHomeHandler(t *testing.T) {
r := mux.NewRouter()
r.HandleFunc("/", homeHandler)
req, err := http.NewRequest("GET", "/", nil)
if err != nil {
t.Fatal(err)
}
rr := httptest.NewRecorder()
r.ServeHTTP(rr, req)
if status := rr.Code; status != http.StatusOK {
t.Errorf("handler returned wrong status code: got %v want %v",
status, http.StatusOK)
}
expected := "Welcome Home!\n"
if rr.Body.String() != expected {
t.Errorf("handler returned unexpected body: got %v want %v",
rr.Body.String(), expected)
}
}这个例子展示了如何创建一个模拟的 HTTP 请求,然后使用
r.ServeHTTP方法来测试路由处理函数。










