来自cURL和Golang POST的不同回应 - 无法理解为什么

时间:2017-02-12 08:32:47

标签: curl go

我尝试使用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响应的任何想法吗?

1 个答案:

答案 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()