Golang中如何通过net/http库获取HTTP响应的重定向目标URL
Go net/http 获取重定向最终URL的实现方法
核心原理
Go标准库net/http返回的Response结构体内置了Request字段,该字段指向最终响应对应的请求实例,直接取resp.Request.URL即可获取经过所有重定向后的最终地址,和Python requests库的response.url效果完全一致。
代码实现(基于现有逻辑修改)
import ( "net/http" "net/url" "github.com/pkg/browser" // 你用到的browser库 // 其他依赖按需引入 ) func getAuth(endpoint *url.URL) { request, err := http.NewRequest("GET", endpoint.String(), nil) if err != nil { panic(err) } client := &http.Client{} resp, err := client.Do(request) if err != nil { panic(err) } defer resp.Body.Close() // 必须关闭响应体避免资源泄漏 // 直接获取最终重定向URL finalURL := resp.Request.URL.String() // 拉起系统浏览器访问 err = browser.OpenURL(finalURL) if err != nil { panic(err) } // 原有逻辑的header、body读取按需保留即可 // headers := resp.Header // page, _ := ioutil.ReadAll(resp.Body) }
可选:自定义重定向逻辑
如果你需要控制重定向次数、或者记录所有跳转历史URL,可以给http.Client配置CheckRedirect钩子:
var redirectHistory []*url.URL client := &http.Client{ CheckRedirect: func(req *http.Request, via []*http.Request) error { redirectHistory = append(redirectHistory, req.URL) // 最多允许跳转10次,和标准库默认逻辑一致 if len(via) >= 10 { return http.ErrUseLastResponse } return nil }, }
Spotify鉴权场景额外提示
如果你的初始endpoint本身就是Spotify官方的授权页地址,不需要提前发起GET请求,直接调用browser.OpenURL(endpoint.String())打开即可,可省掉一次不必要的网络请求。
内容的提问来源于stack exchange,提问作者Кафка
相关产品推荐
相关产品推荐

