我正在编写一个可以接受POST或GET的处理程序。因此,我希望能够说:
http://host/query?parm1=value&parm2=value
我假设Gorilla mux会给我:
{
"parm1": "value",
"parm2": "value
}
但mux.Vars(r)
为空。我知道使用.Query("key", "value"
会使参数成为必需参数,这不是我想要的。我错过了什么?
答案 0 :(得分:4)
从评论中可以看出,基本答案是“这不是mux的目的”。 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")
答案 1 :(得分:0)
如果你有一个像下面这样的 Handler 函数,那么你可以使用这两种方法中的任何一种来提取查询字符串值(这里是它的 {param1})。
方法 1. 它遍历查询字符串并打印键和值。
方法二,直接使用mux Router对象提取值。
// 用于处理请求的路由器,查询字符串传入 {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)
}