4

我正在尝试使用 BasicAuth 执行简单的 HTTP 获取。问题是响应不断返回“404”,即使我可以将 URL 复制并粘贴到命令行 cURL 请求中并且它工作正常:

const url string = "http://1.2.3.4:6710/REST/command"
const username string = "..."
const password string = "..."

fmt.Printf("\n%v\n", url)

client := &http.Client{}

req, _ := http.NewRequest("GET", url, nil)
req.SetBasicAuth(username, password)
req.Proto = "HTTP/1.0"
req.ProtoMinor = 0

resp, _ := client.Do(req)

fmt.Printf("\n%v\n", resp)

defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)   

fmt.Printf("\n%v\n\n", string(body))

因此,您可以看到我正在url立即打印出我的 - 这是同一行文本,如果我将其复制到命令行 cURL 请求中,则一切正常。

我的请求响应是

&{404 Not Found 404 HTTP/1.0 1 0 map[Pragma:[no-cache] Date:[Wed, 17 Apr 2013 15:01:33 GMT] Connection:[close] Server:[MoneyWorks_Datacentre/6.1.3 Win-x86 REST/6.1.3] Cache-Control:[no-store, no-cache, must-revalidate] Expires:[Wed, 17 Apr 2013 15:01:33 GMT]] 0xf8400e3920 -1 [] true map[] 0xf8400aa000}

golang 的 HTTP 函数有什么独特之处与 cURL 处理如此简单的请求的方式不同吗?

编辑:我通过将 URL 传递给exec.Command("curl", url).Output(). 显然这不是我希望的本机解决方案,但它现在有效。

4

2 回答 2

3

这个问题与 unicode 有关。我的命令中有一个%2F(未显示在我的原始问题中),Go 转换为/应该保留为%2F(cURL 正确地将其保留为%2F)。更改%2F%252F解决问题。

似乎在创建新的 HTTP 请求时,Go 会将您的 unicode 解析回纯文本,因此如果您%3D在提交给 HTTP 请求初始化程序的 URL 中有它会将其转换为=. 我认为一个明显的解决方案是放入%253DURL,但显然 Go 中有一个错误会转换%3D=但不会转换%25%. 我不得不使用不透明的 URL 请求 ( request.Url.Opaque) 来解决这个问题。

于 2013-06-26T14:23:57.237 回答
0

你说 curl 命令可以正常工作,但如果你有最新的 curl(我的是 7.22.0)。请求将是这样的:

curl url --verbose

获取/HTTP/1.1

用户代理:curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3

主机:myhost.com

接受:/

但是您正在设置req.Proto = "HTTP/1.0". 似乎不对。

于 2013-05-18T06:27:33.317 回答