使用大猩猩 mux 检索可选的查询变量?

Retrieve optional query variables with gorilla mux?

我正在编写一个可以接受 POST 或 GET 的处理程序。因此,我想要能够说的选项:

http://host/query?parm1=value&parm2=value

我假设 Gorilla mux 会给我:

{
    "parm1": "value",
    "parm2": "value
}

但是 mux.Vars(r) 是空的。我知道使用 .Query("key", "value" 会使参数成为强制参数,这不是我想要的。我错过了什么?

正如评论中所反映的那样,基本答案是 "that's not what mux is for"。 mux 非常擅长拆分 URL 的 path 部分,并将组件转换为变量。举一个假设的例子,一个提供国家信息的调用可能有一个看起来像这样的规范:

country/{code}

并接受如下所示的呼叫:

http://myhost/country/DE

您将获得 code 参数的值,如下所示:

code := mux.Vars(r)["code"]

如果您想传递查询变量,则不要使用 mux。直接从请求中获取它们。所以给定替代查询语法:

http://myhost/country?code=DE

你会做:

code := r.URL.Query().Get("code")

如果您有如下所示的处理程序函数,那么您可以使用两种方法中的任何一种来提取查询字符串值(此处为 {param1})。

方法 1. 它遍历查询字符串并打印键和值。

方法2.直接使用mux Router对象提取值。

// 处理请求的Rounter,传入{param1}变量的查询字符串

router.HandleFunc("/viewdemo/{param1}", GetDemoDetail).Methods("GET")


func GetData(response http.ResponseWriter, request *http.Request) {
// iterate throguth the object and extract key and value
    for k, v := range mux.Vars(request) {
        fmt.Printf("key=%v, value=%v", k, v)
    }

//Use the mux router to extract the value of query string {param1}
    params := mux.Vars(request)
    objid := params["param1"]
    fmt.Println("Query string key value", objid)
}