go中http如何解决跳转自动携带cookie的问题

发布时间 2023-07-17 10:45:21作者: 厚礼蝎

在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)
	}
}