在Go中,可以使用net/http包来进行HTTP请求,并通过设置一个Client的Jar属性来自动处理HTTP响应中的Cookie。
package main
import (
"fmt"
"net/http"
"net/http/cookiejar"
)
func main() {
// 创建一个带有Cookie支持的HTTP客户端
cookieJar, _ := cookiejar.New(nil)
client := http.Client{
Jar: cookieJar,
}
// 发送GET请求
req, _ := http.NewRequest("GET", "http://example.com", nil)
resp, _ := client.Do(req)
// 输出响应头中的所有Cookie
for _, cookie := range resp.Cookies() {
fmt.Printf("Name: %s, Value: %s\n", cookie.Name, cookie.Value)
}
}
补充
如何让跳转的链接同样携带之前的查询参数
package main
import (
"fmt"
"net/http"
"net/http/cookiejar"
)
// 自定义的 CheckRedirect 函数
func retryOnRedirect(req *http.Request, via []*http.Request) error {
if len(via) >= 10 { // 避免过多的重定向导致无限循环
return fmt.Errorf("太多重定向")
}
// 在每次重定向前检查是否有查询参数需要添加
if len(via) > 0 {
lastRequest := via[len(via)-1]
redirectURL := req.URL
// 判断上一个请求和当前重定向的 URL 是否相同 也可以改成自己想要的判断逻辑
if lastRequest.URL.Host == redirectURL.Host && lastRequest.URL.Path == redirectURL.Path {
// 将上一个请求的查询参数添加到当前重定向的 URL 中
query := lastRequest.URL.Query()
redirectURL.RawQuery = query.Encode()
}
}
// 同样除了上面用jar的方法,这里也可以保持原有请求中的 cookie 缺点是,无法保存响应中的cookies
for _, cookie := range via[0].Cookies() {
req.AddCookie(cookie)
}
return nil
}
func main() {
// 创建一个带有Cookie支持的HTTP客户端
cookieJar, _ := cookiejar.New(nil)
client := http.Client{
Jar: cookieJar,
CheckRedirect: retryOnRedirect,
}
// 发送GET请求
req, _ := http.NewRequest("GET", "http://example.com", nil)
resp, _ := client.Do(req)
// 输出响应头中的所有Cookie
for _, cookie := range resp.Cookies() {
fmt.Printf("Name: %s, Value: %s\n", cookie.Name, cookie.Value)
}
}