【问题标题】:how to correctly pattern match with routers handleFunc?如何正确地与路由器handleFunc进行模式匹配?
【发布时间】:2015-03-24 22:43:31
【问题描述】:

我正在使用 gorilla web toolkit 和 golang,并且有以下代码

func test(w http.ResponseWriter, r *http.Request) {
    fmt.Println("test was called ..")
}

func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())
    mx := mux.NewRouter()
    mx.HandleFunc(?, test)
    http.ListenAndServe(":8080", mx)
} 

我的服务器将提供一个带有表单的 html 文档,该表单将执行获取请求并发送“/?id={something}”。如何在 mx.HandleFunc 中设置模式以匹配查询以便调用测试?

我试过了:

"/?id={something}, 
"/?id=", 
mx.HandleFunc("/", test).Queries("id")
mx.HandleFunc("/", test).Methods("POST") 

(最后一个我更改了相应的页面代码,以便表单代替发布)。

【问题讨论】:

    标签: go gorilla


    【解决方案1】:

    当使用.Queries() 时,你需要给它一个键和一个值,比如:

    mx.HandleFunc("/", test).Queries("id", "value")
    

    您也可以使用模式作为值,例如:

    mx.HandleFunc("/", test).Queries("id", "{id:[0-9]+}")
    

    详情请看这里:http://godoc.org/github.com/gorilla/mux#Route.Queries

    【讨论】:

    • 我已经阅读了 godoc,并尝试了这个:mx.HandleFunc("/", test).Queries("id", "bar")。我从请求中打印 r.URL.String(),并得到“/?id=bar”,但它只转到 frontPage-func (mx.HandleFunc(“/”,frontPage)。我希望它会调用test() 因为它是一个查询,或者两者都是 test() 一个 frontPage() 因为它符合两种模式..
    • 啊,我想我知道发生了什么。问题在于 handleFuncs 的排序。我首先有默认大小写“/”(它也匹配(并捕获)“/?id="))所以通过改变它的工作顺序,无论如何谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 2015-04-29
    • 2023-03-17
    • 1970-01-01
    • 2021-06-13
    相关资源
    最近更新 更多