Golang Go语言中 gorilla/mux 怎么实现 /{locale}/hi 和 /hi 指向同一个路由
实现 URL 级的多语言路由
想实现全局有个默认语言比如中间件判断 accept-language 。设置 ctx 。
然后访问 /hi 就显示默认语言(mux.Vars()[locale]等于"",而不是 hi) 访问 /en/hi 就强制显示成 en 语言。
gorilla 可以实现自定义 matcher 吗?或者有其他路由组件能支持吗?
Golang Go语言中 gorilla/mux 怎么实现 /{locale}/hi 和 /hi 指向同一个路由
以标准库为例:<br>package main<br><br>import (<br> "fmt"<br> "net/http"<br>)<br><br>func main() {<br> mux := http.NewServeMux()<br> mux.HandleFunc("/hi", Language)<br> mux.HandleFunc("/{lang}/hi", Language)<br><br> http.ListenAndServe(":9999", mux)<br>}<br><br>func Language(w http.ResponseWriter, r *http.Request) {<br> lang := r.PathValue("lang")<br> if lang == "" {<br> lang = r.Header.Get("Accept-Language")<br> }<br><br> fmt.Println(lang)<br> w.Write([]byte(lang))<br>}<br>
更多关于Golang Go语言中 gorilla/mux 怎么实现 /{locale}/hi 和 /hi 指向同一个路由的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
有个方案,可以中间件获取到 locale 后,重定向到 /{locale}/hi
这样还是定义了两个路由。。
那要是有十几个一两百个路由呢。比如 /{locale}/product/{title} 访问 /product/a-b-c-d-e 也要要求能匹配到路由
go<br> var global = http.NewServeMux()<br> var mux1 = http.NewServeMux()<br> mux1.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {<br> <br> })<br> global.Handle("/", mux1)<br> global.Handle("/{locale}/", mux1)<br> http.ListenAndServe("", global)<br>
这样试下
这个思路真的是。。。。我试试
貌似也不行。
go<br>var langs = map[string]bool{<br> "cn": true,<br> "en": true,<br> "jp": true,<br> "ru": true,<br>}<br><br>func main() {<br> var global = http.NewServeMux()<br> var mux = http.NewServeMux()<br><br> mux.HandleFunc("/api/asd", func(w http.ResponseWriter, r *http.Request) {<br> fmt.Println("hello asadsdd")<br> fmt.Fprintf(w, "hello format")<br> })<br><br> global.Handle("/{locale}/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {<br> fmt.Println(r.PathValue("locale"))<br> if lng := r.PathValue("locale"); langs[lng] {<br> http.StripPrefix("/"+lng, mux).ServeHTTP(w, r)<br> } else {<br> mux.ServeHTTP(w, r)<br> }<br> }))<br><br> http.ListenAndServe(":12345", global)<br>}<br>
➜ curl http://localhost:12345/en/api/asd
hello format%
➜ curl http://localhost:12345/cn/api/asd
hello format%
➜ curl http://localhost:12345/api/asd
hello format%
➜ curl http://localhost:12345/ad/api/asd
404 page not found
看效果是满足了的
在 Go 语言中,使用 gorilla/mux
路由库可以很方便地实现 URL 路径的灵活匹配。要实现 /{locale}/hi
和 /hi
指向同一个路由,可以通过在路由定义中使用变量和可选的路径段来实现。
以下是一个示例代码,展示了如何实现这一功能:
package main
import (
"fmt"
"net/http"
"github.com/gorilla/mux"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
locale := vars["locale"]
if locale == "" {
locale = "default" // 或者使用其他默认值
}
fmt.Fprintf(w, "Hello in locale: %s!\n", locale)
}
func main() {
r := mux.NewRouter()
// 定义 /{locale}/hi 路由
r.HandleFunc("/{locale:[a-zA-Z_-]+}/hi", helloHandler).Methods("GET")
// 定义 /hi 路由,通过重定向或直接处理
r.HandleFunc("/hi", func(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "/default/hi", http.StatusMovedPermanently)
// 或者直接调用 helloHandler(w, r) 使用默认值
}).Methods("GET")
http.Handle("/", r)
http.ListenAndServe(":8080", nil)
}
在这个示例中,/hi
会被重定向到 /default/hi
,你也可以选择直接在 /hi
的处理函数中调用 helloHandler
并传递一个默认值。这样可以确保 /hi
和 /{locale}/hi
都能被正确处理。