dongyan5706 2019-04-08 15:16
浏览 204
已采纳

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

When parsing URLs using r.URL.Query(), I am getting inconsistent results and was wondering if anyone else has had the same issue and/or a viable workaround. Keys sometimes return ?keyName instead of keyName so often i'll do keys.Get on both values.

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

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

Current Outputs

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]]

Expected

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条回答 默认 最新

  • dongqiu3254 2019-04-08 16:29
    关注

    Figured out the culprit- there was a middleware that was preprocessing the query and forwarding requests through a proxy for some reason.

    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 expects the raw query, not a query with ?; the paramsToString func should actually be this

    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, "&")
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题