我正在尝试重复使用Go使用cURL执行的一些http请求。
在第一个请求中,我得到名为“ yandexuid”的cookie:
$ curl --cookie-jar jar --output /dev/null \
https://oauth.yandex.ru/...&client_id=ID
然后我使用身份验证数据进行POST:
$ curl -v --cookie jar --cookie-jar jar \
--data 'login=LOGIN' \
--data 'passwd=PASS' \
--data 'twoweeks=no' \
--data 'retpath=https://oauth.yandex.ru/...type=token' \
https://passport.yandex.ru/auth?...&mode=qr
它返回许多新的cookie,将在下一步中使用。
当我尝试使用Go进行操作时,第一部分工作正常:cookie“ yandexuid”出现,并将其附加到下一个请求。但是第二个请求不返回cookie。服务器在重定向页面上回复我,其中显示:“ 请求处理错误。发生了错误。要正确登录到Yandex,您需要在浏览器设置中启用cookie。”
我的Go代码:
type Client struct {
HTTPClient *http.Client
CookieJar []http.Cookie
}
func (c* Client) AddCookies(cookies []*http.Cookie) {
for _, f := range cookies {
c.CookieJar = append(c.CookieJar, *f)
}
}
func (c *Client) Request(method string, request string, body io.Reader) *http.Response {
req, err := http.NewRequest(method, request, body)
for _, f := range c.CookieJar {
req.AddCookie(&f) //attach cookies saving in Client structure
}
req.Header.Set("X-Org-id", CompanyID)
req.Header.Set("Cache-Control", "no-cache")
resp, err := c.HTTPClient.Do(req)
return resp
}
func main() {
// first request
_url := fmt.Sprintf(https://oauth.yandex.ru/...&client_id=%s, ClientID)
resp := c.Request("GET", _url, nil)
c.AddCookies(resp.Cookies()) // getting cookies from respond and saving it in Client structure
// second request
PostData := strings.NewReader("login="+email+"&passwd="+pass+"&twoweeks=no&retpath=https://oauth.yandex.ru/...type=token")
resp = c.Request("POST", "https://passport.yandex.ru/auth?...&mode=qr", PostData)
}
cURL和我的Go请求之间有什么区别?我知道我对Cookie做错了,因此服务器认为用户的浏览器未保存Cookie。