我正在尝试使用BasicAuth执行简单的HTTP get。问题是响应不断返回“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处理这样一个简单请求的方式不同?
编辑:我通过将网址传递给exec.Command("curl", url).Output()
来实现。显然,这不是我希望的原生解决方案,但它现在有效。
答案 0 :(得分:2)
问题与unicode有关。我的命令中有一个%2F
(我的原始问题中没有显示)Go转换为/
本应保留为%2F
(cURL正确地将其保留为{{1} }})。将%2F
更改为%2F
解决了问题。
在创建新的HTTP请求时,Go似乎会将您的unicode解析回纯文本,因此如果您在提交给HTTP请求初始化程序的URL中有%252F
,它会将其转换为{{1 }}。我认为一个明显的解决方案是将%3D
放入网址,但显然Go中存在将=
转换为%253D
而非%3D
转换为{{1}的错误}}。我不得不使用不透明的URL请求(=
)来解决这个问题。
答案 1 :(得分:0)
你说curl命令正常工作,但如果你有最新的卷曲(我的是7.22.0)。请求将是这样的:
curl url --verbose
GET / HTTP / 1.1
User-Agent: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"
。似乎不对。