下面的代码我尝试了几种方法使用cookie jar等都无济于事,这是最简单的例子:
还尝试了这个Go HTTP客户端不返回cookie
,结果相同。
如果你运行代码在浏览器中可以看到只有一个饼,但有几个
var url = "http://www.apple.com"
func main() {
//Create Client
client := http.Client{}
//Create Varible
// Create Request
req, _ := http.NewRequest("GET", url, nil)
resp, err := client.Do(req) //send request
if err != nil {
return
}
cookies := resp.Cookies() //save cookies
// Create New Request
resp, err = client.Do(req) //send request
if err != nil {
return
}
fmt.Println("------------------------------------------------")
for _, cookie := range cookies {
fmt.Println(cookie)
}
}
您正在对http://www.apple.com
的文档进行单个请求;对此的响应将是一个HTML文件和一些标头。完整的响应将取决于许多因素(如您的位置和请求头),但对我来说,这返回一个cookie:
set-cookie: geo=NZ; path=/; domain=.apple.com
这就是你的Go应用程序所做的。
浏览器发出相同的请求,但随后处理返回的HTML;作为这个过程的一部分,浏览器将请求相当多的文件(css
,js
,svg
,png
,woff2
等)。对这些请求的响应可能包括cookie。如果您在浏览器中打开开发人员工具(通常是F12)并在刷新页面之前选择网络选项卡,您可以看到这一点。
例如,当我打开页面请求的文件之一是https://www.apple.com/shop/experience-meta
,对此的响应包括五个cookie (as_dc
,as_pcts
,as_xs
,dssf
和dssid2
)。这就是你看到的额外cookie的来源(好吧,有可能,以前访问的cookie也已经存在了)。
如果您想在Go中检索所有这些cookie,您将需要解析HTML(包括运行任何包含的JavaScript)并请求其他文件。但请注意,即使你这样做,你的结果可能会有所不同(取决于你发送的请求头和苹果考虑的任何其他因素)。
我不确定apple.com的具体情况。但是很多网站在给你访问/cookie之前会考虑一些事情。例如,您正在使用的浏览器,您的头和其他。您可以尝试添加一些头,如User-Agent、Accept等。还要确保你所做的事情不违反苹果的ToS。希望这对你有帮助!