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

标签 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
            }
        }
}

测试网址: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]]

最佳答案

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

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, "&")
}

关于go - 来自 r.URL.Query() 的键映射不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55576657/

相关文章:

json - Golang map : How to strip out empty fields automatically

go - Go 无法接收以太网帧

go - 如何为滚动文件系统日志配置 uber-go/zap 记录器?

go - "http.FileServer(http.Dir...))"不能在单独的包中工作

go - http.Get 返回协议(protocol)不可用错误

pointers - 如何检测golang中的结构指针是否为nil?

http - Golang - 劫持参数

go - 不同的内容类型与httptest和curl

go - web.Request 结构的字段状态未在 Golang 中正确克隆