我尝试使用golang的http
客户端从服务器获取响应。
我希望通过go执行的请求应与以下curl
命令相同:
curl --data "fulladdress=22280+S+209th+Way%2C+Queen+Creek%2C+AZ+85142" 'http://www.homefacts.com/hfreport.html'
我已编写了等效的go代码,并尝试使用名为curl-to-go的优质服务,该服务为上述curl
请求生成以下go代码:
// Generated by curl-to-Go: https://mholt.github.io/curl-to-go
body := strings.NewReader(`fulladdress=22280+S+209th+Way%2C+Queen+Creek%2C+AZ+85142`)
req, err := http.NewRequest("POST", "http://www.homefacts.com/hfreport.html", body)
if err != nil {
// handle err
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
resp, err := http.DefaultClient.Do(req)
if err != nil {
// handle err
}
defer resp.Body.Close()
问题是我在curl
命令和go代码之间不断得到不同的响应。 curl
命令返回此响应正文:
<html><head><meta http-equiv="refresh" content="0;url=http://www.homefacts.com/address/Arizona/Maricopa-County/Queen-Creek/85142/22280-S-209th-Way.html"/></head></html>
这是预期的结果。但是,go代码返回的长度为HTML
,这不是预期的结果。
我已尝试将--verbose
添加到curl
命令以复制其所有标题,因此我通过go代码添加了以下标题:
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req.Header.Set("User-Agent", "curl/7.51.0")
req.Header.Set("Accept", "*/*")
req.Header.Set("Content-Length", "56")
但仍然没有快乐,go代码的输出仍然不同于curl
。
有关如何获得相同curl
响应的任何想法吗?
答案 0 :(得分:1)
感谢@u_mulder指出我正确的方向。默认情况下,默认的go http
客户端似乎遵循重定向标头,而curl
则没有。
以下是更新后的代码,可在go和curl
之间生成相同的结果:
body := strings.NewReader(`fulladdress=22280+S+209th+Way%2C+Queen+Creek%2C+AZ+85142`)
req, err := http.NewRequest("POST", "http://www.homefacts.com/hfreport.html", body)
if err != nil {
// handle err
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
client := &http.Client{
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
},
}
resp, err := client.Do(req)
if err != nil {
// handle err
}
defer resp.Body.Close()