Golang HTTP GET请求返回404

时间:2013-04-17 15:09:24

标签: curl get go

我正在尝试使用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()来实现。显然,这不是我希望的原生解决方案,但它现在有效。

2 个答案:

答案 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"。似乎不对。