go中http如何解决跳转自动携带cookie的问题
在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)
}
}
本文来自博客园,作者:厚礼蝎,转载请注明原文链接:https://www.cnblogs.com/guangdelw/p/17559352.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律