我正在尝试从http://freemusicarchive.org下载曲目。一般来说,您可以通过附加/下载到轨道URL来下载文件,轨道URL通过重定向到S3上的资产进行响应。
要查看重定向,请将此链接放在此处: http://www.wheregoes.com/retracer.php
我可以使用如下代码获取重定向位置:
req, err := http.NewRequest("GET", url, nil)
errHndlr(err)
transport := http.Transport{}
resp, err := transport.RoundTrip(req)
defer resp.Body.Close()
errHndlr(err)
redirect := resp.Header.Get("Location")
我已经通过将重定向链接打印到控制台并将其复制/粘贴到我的浏览器中来验证重定向链接,但是当我在同一个URL上调用http.Get时,我从AWS收到“SignatureDoesNotMatch”错误。
如果有人能够提供有关此处出现问题的见解,我将非常感激。
答案 0 :(得分:5)
想出来。在处理URL时,将unicode解析为纯文本。我需要使用request.URL.Opaque。
此处有更多信息:https://stackoverflow.com/a/17322831/733860
问题与unicode有关。在我的命令中有一个%2F(在我原来的问题中没有显示)Go转换为/应该保留为%2F(cURL正确地将其保留为%2F)。将%2F更改为%252F解决了问题。
在创建新的HTTP请求时,Go似乎会将您的unicode解析回纯文本,因此如果您在提交给HTTP请求初始化程序的URL中有%3D,它会将其转换为=。我认为一个明显的解决方案是将%253D放入URL中,但显然Go中存在一个错误,它将%3D转换为=但不是%25转换为%。我不得不使用不透明的URL请求(request.Url.Opaque)来解决这个问题。