首页 > 解决方案 > net/url 包根据请求查询参数添加换行符

问题描述

我正在调用 Songkick 的 API,将 API 密钥和页码参数编码如下:

    Url, err := url.Parse("https://api.songkick.com")
    Url.Path += "/api/3.0/metro_areas/" + myArea + "/calendar.json"
    parameters := url.Values{}
    parameters.Add("apikey", myApiKey)
    parameters.Add("page", myPage)
    Url.RawQuery = parameters.Encode()

    req, err := http.NewRequest("GET", Url.String(), nil)

一切都很好,只是它在我的 apiKey 参数中添加了一个额外的 %0A ,结果查询如下所示: http://api.songkick.com/api/3.0/metro_areas/28714/calendar.json?apikey=myKey%0A&page=12

我一直在关注net/url包中的代码,但我不知道为什么会这样。这可能发生的唯一地方是在转义函数中的 switch case shouldEscape(c, mode)内,但是阅读文档,它不应该是我的情况。

有人对此有提示吗?

只有当我在基于图像golang:latest的Docker 容器中运行它时才会发生这种情况。如果我从本地 PC 运行它,它工作正常。

这就是我读取文件的方式:

bs, err := ioutil.ReadFile("apiKeyFile.txt")

if err != nil {
    fmt.Println("Error:", err)
    os.Exit(1)
}

return string(bs)

标签: go

解决方案


该值myApiKey有一个换行符,并且该换行符编码在查询字符串中。

通过删除不需要的换行符来解决问题。这可以通过使用bytes.TrimSpace从文件数据中修剪前导和尾随空格来完成。

bs, err := ioutil.ReadFile("apiKeyFile.txt")
if err != nil {
    fmt.Println("Error:", err)
    os.Exit(1)
}
return string(bytes.TrimSpace(bs))

推荐阅读