我使用gorilla-mux路由我的网址,但我发现了一个难点:
我的客户端更喜欢带斜杠的网址而不是传统的查询字符串。我的意思是:
域/处理/过滤器1 / VAL1 /过滤器2 / VAL2 ...
而不是
域/处理程序过滤器1 = VAL1&安培;过滤器2 = val2的...
重要问题: 使用查询字符串时,'变量'订单并不重要,如果没有错误的路由或NotFound,它们中的任何一个都可能丢失。
使用查询字符串时,' vars'的顺序并不重要,如果没有错误的路由,我可能会错过任何一个 此刻,我正在编写一个排列算法,该算法创建了用于处理具有相同功能的URL的排列。
有更好的方法吗?
答案 0 :(得分:0)
我写了一个" url生成器"为了我的需要
<强> https://github.com/daniloanp/SlashedQueryUrls 强>
它非常简单和天真,但它为我工作。
使用的一个很好的例子是我的回归:
package main
import (
"fmt"
"github.com/daniloanp/muxUrlGen"
"github.com/gorilla/mux"
"net/http"
)
func HandleUrlsWithFunc(rtr *mux.Router, urls []string, handler func(w http.ResponseWriter, r *http.Request)) {
for _, url := range urls {
rtr.HandleFunc(url, handler)
}
}
func echoVars(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
fmt.Fprintln(w, r.URL.String(), "\n\n")
for k, i := range mux.Vars(r) {
fmt.Fprintln(w, k, ": ", i)
}
}
func main() {
var url string
var urls []string
rtr := mux.NewRouter()
url = "/handl/v1/{v}/v2/{v'}"
rtr.HandleFunc(url, echoVars)
// The above code works by we cannot missing any var OR Even
// Using "long notation"
urls = muxUrlGen.GetUrlVarsPermutations("/handlLong/v1/{v:[0-9]+}/v2/{v'}", true)
HandleUrlsWithFunc(rtr, urls, echoVars)
// Using "long notation" and Optional vars
urls = muxUrlGen.GetUrlVarsPermutations("/handlLongOptional/v1/{v}?/v2/{v'}?", true)
HandleUrlsWithFunc(rtr, urls, echoVars)
// Using "short notation"
urls = muxUrlGen.GetUrlVarsPermutations("/handlShort/{v1}/{v2}", false)
HandleUrlsWithFunc(rtr, urls, echoVars)
// Using "short notation" and Optional vars
urls = muxUrlGen.GetUrlVarsPermutations("/handlShortOptional/{v1}?/{v2}?", false)
HandleUrlsWithFunc(rtr, urls, echoVars)
http.Handle("/", rtr)
fmt.Println("Server running at http://127.0.0.1:8080")
http.ListenAndServe(":8080", nil)
}
谢谢大家。