Несовместимые карты ключей из r.URL.Query () - PullRequest
0 голосов
/ 08 апреля 2019

При синтаксическом анализе URL-адресов с использованием r.URL.Query() я получаю противоречивые результаты, и мне было интересно, есть ли у кого-то еще такая же проблема и / или приемлемый обходной путь. Ключи иногда возвращают ?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 голосов
/ 08 апреля 2019

Выяснили виновника - было промежуточное ПО, которое по какой-то причине предварительно обрабатывало запрос и пересылало запросы через прокси.

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 должен быть на самом деле

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