http строка запроса: знак вопроса становится% 3 - PullRequest
0 голосов
/ 19 марта 2019

Попытка добавить к существующей строке запроса, но '?' который продолжает строку запроса заменяется на «% 3»

 server := "server.com"
 endpoint:= "/buildWithParameters?token=<top_secret>" 

// concat server and build job
    u, err := url.Parse(server)
    u.Path = path.Join(u.Path, endpoint)
    endpoint := u.String()

    // since we are appending to existing querystring, request is needed for parsing
    req, err := http.NewRequest("POST", endpoint, nil)
    if err != nil {
        return fmt.Errorf("Error creating post request: (%v)", err)
    }

    // read existing query string
    q := req.URL.Query()


    q.Add("key", "value")

    req.URL.RawQuery = q.Encode()


    log.Println(req.URL.String())

Вывод:

https://server.com/job/jobbyjob/buildWithParameters%3Ftoken=<top_secret>?key=value

Ответы [ 3 ]

3 голосов
/ 19 марта 2019

Это потому, что вы добавляете строку запроса к пути, поэтому библиотека правильно экранирует ? для создания действительного URL. Если вы хотите, чтобы token=<top_secret> рассматривался как часть запроса, вам нужно добавить его в запрос:

endpoint:= "/buildWithParameters" 

// ... 

q.Add("token", "<top_secret>")
0 голосов
/ 19 марта 2019

Вы создаете его с помощью url.Parse, затем добавляете строку запроса к пути (который он обрабатывает правильно, экранируя его).Если вы делаете это наоборот (создайте свой полный URL-адрес, а затем проанализируете его), он может выполнить свою работу:

server := "server.com"
endpoint := "/buildWithParameters?token=<top_secret>" 

// concat server and build job
u, err := url.Parse(path.Join(server, endpoint))
0 голосов
/ 19 марта 2019

Как указывал @Flimzy, именно эта проблема была вызвана библиотекой Path.Разрешен следующий метод base.ResolveReference ():

// concat server and build job
u, err := url.Parse(server)
u.Path = path.Join(u.Path, endpoint)
endpoint := u.String()

заменен на:

// concat server and build job
base, err := url.Parse(server)
endpoint, err := url.Parse(endpoint)
endpoint = base.ResolveReference(endpoint)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...