curl – Golang HTTP GET请求返回404

我试图用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]日期:[Wed,17 Apr 2013 15:01:33 GMT]连接:服务器:[MoneyWorks_Datacentre / 6.1.3 Win -x86 REST / 6.1.3] Cache-Control:[no-store,no-cache,must-revalidate] Expires:[Wed,2013年4月17日15:01:33 GMT]] 0xf8400e3920 -1 [] true map [] 0xf8400aa000}

Golang的HTTP函数有什么独特之处,与cURL处理这样一个简单请求的方式不同?

编辑:我通过将URL传递给exec.Command(“curl”,url).Output()来实现它.显然,这不是我希望的原生解决方案,但它现在有效.

最佳答案 这个问题与unicode有关.在我的命令中有一个/(在我的原始问题中没有显示)Go转换为/应该保留为/(cURL正确地将其保留为/).更改/到%2F解决了问题.

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

点赞