来自r.URL.Query()的键映射不一致

时间:2019-04-08 15:16:03

标签: go go-http

使用r.URL.Query()解析URL时,我得到的结果不一致,并且想知道其他任何人是否有相同的问题和/或可行的解决方法。键有时返回?keyName而不是keyName,所以我经常对两个值都做keys.Get

func(w http.ResponseWriter, r *http.Request) {
        keys := r.URL.Query()
        lat := keys.Get("lat")
        if lat == "" {
                // r.URL.Query sometimes comes back with ?lat instead of lat for some reason...
            lat = keys.Get("?lat")
            if lat == "" {
                            // error here
            }
        }

        lng := keys.Get("lng")
        if lng == "" {
            lng = keys.Get("?lng")
            if lng == "" {
                            // error here
            }
        }
}

测试URL:http://localhost:3000/?lng=-75.7572111845&type=property

电流输出

2019/04/08 10:59:27 map[lat:[39.5040840724] lng:[-75.7572111845]]
2019/04/08 10:59:28 map[?lat:[39.5040840724] lng:[-75.7572111845]]
2019/04/08 10:59:29 map[lat:[39.5040840724] lng:[-75.7572111845]]
2019/04/08 10:59:30 map[lat:[39.5040840724] lng:[-75.7572111845]]
2019/04/08 10:59:31 map[lat:[39.5040840724] ?lng:[-75.7572111845]]

预期

2019/04/08 10:59:27 map[lat:[39.5040840724] lng:[-75.7572111845]]
2019/04/08 10:59:28 map[lat:[39.5040840724] lng:[-75.7572111845]]
2019/04/08 10:59:29 map[lat:[39.5040840724] lng:[-75.7572111845]]
2019/04/08 10:59:30 map[lat:[39.5040840724] lng:[-75.7572111845]]
2019/04/08 10:59:31 map[lat:[39.5040840724] lng:[-75.7572111845]]

1 个答案:

答案 0 :(得分:0)

找出了罪魁祸首-出于某种原因,中间件正在预处理查询并通过代理转发请求。

func (h *Handler) proxy(w http.ResponseWriter, r *http.Request, uri *url.URL) {
    params := r.URL.Query()
    proxy := httputil.ReverseProxy{Director: func(proxyRequest *http.Request) {
        proxyRequest.URL.Scheme = uri.Scheme
        proxyRequest.URL.Host = uri.Host
        proxyRequest.URL.Path = uri.Path
        proxyRequest.Body = r.Body
        proxyRequest.URL.RawQuery = paramsToString(params)
    }}
    proxy.ServeHTTP(w, r)
}

func paramsToString(m url.Values) string {
    keys := make([]string, 0, len(m))
    for k := range m {
        keys = append(keys, k+"="+m[k][0])
    }
    return "?" + strings.Join(keys, "&")
}

proxyRequest.URL.RawQuery需要原始查询,而不是带有?的查询; paramsToString函数实际上就是这个

func paramsToString(m url.Values) string {
    keys := make([]string, 0, len(m))
    for k := range m {
        keys = append(keys, k+"="+m[k][0])
    }
    return strings.Join(keys, "&")
}