You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Кафка

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 20:27:02