如何让 Go HTTP 客户端不自动遵循重定向?

2023-12-19

我目前正在用 Go 编写一些与 REST API 交互的软件。我尝试查询的 REST API 端点返回 HTTP 302 重定向以及指向资源 URI 的 HTTP Location 标头。

我正在尝试使用 Go 脚本来获取 HTTP Location 标头以供稍后处理。

以下是我目前为实现此功能所做的事情:

package main

import (
        "errors"
        "fmt"
        "io/ioutil"
        "net/http"
)

var BASE_URL = "https://api.example.com/v1"
var STORMPATH_API_KEY_ID = "xxx"
var STORMPATH_API_KEY_SECRET = "xxx"

func noRedirect(req *http.Request, via []*http.Request) error {
        return errors.New("Don't redirect!")
}

func main() {

        client := &http.Client{
            CheckRedirect: noRedirect
        }
        req, err := http.NewRequest("GET", BASE_URL+"/tenants/current", nil)
        req.SetBasicAuth(EXAMPLE_API_KEY_ID, EXAMPLE_API_KEY_SECRET)

        resp, err := client.Do(req)

        // If we get here, it means one of two things: either this http request
        // actually failed, or we got an http redirect response, and should process it.
        if err != nil {
            if resp.StatusCode == 302 {
                fmt.Println("got redirect")
            } else {
                panic("HTTP request failed.")
            }
        }
        defer resp.Body.Close()

}

这对我来说有点像黑客。通过重写http.Client's CheckRedirect函数,我基本上被迫将 HTTP 重定向视为错误(但事实并非如此)。

我已经看到其他几个地方建议使用 HTTP 传输而不是 HTTP 客户端 - 但我不确定如何实现这一点,因为我需要 HTTP 客户端,因为我需要使用 HTTP 基本身份验证来与此 REST 进行通信API。

你们中的任何人都可以告诉我一种使用基本身份验证发出 HTTP 请求的方法(而不遵循重定向),并且不涉及抛出错误和错误处理吗?


现在有一个更简单的解决方案:

client := &http.Client{
    CheckRedirect: func(req *http.Request, via []*http.Request) error {
        return http.ErrUseLastResponse
    },
}

这样,http包自动知道:“啊,我不应该遵循任何重定向”,但不会抛出任何错误。从源码中的注释来看:

作为一种特殊情况,如果 CheckRedirect 返回 ErrUseLastResponse, 然后返回最新的响应及其正文 未关闭,并且出现零错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 Go HTTP 客户端不自动遵循重定向? 的相关文章

随机推荐

  • MySQL 是否有相当于 PostgreSQL array_to_string 的工具

    我正在尝试找到与 PostgreSQL 函数等效的 MySQLarray and 数组到字符串并遇到了这个帖子 https stackoverflow com questions 4326868 equivalent to postgres
  • sed 中的贪婪

    I want ereg rat dog cat 成为 preg match rat dog cat 为了实现这一目标 我做了 echo ereg rat dog cat sed s ereg preg match 1 2 g 但是 这个正则
  • AWS Lambda S3 GET/POST - SignatureDoesNotMatch 错误

    我的 Lambda node js 函数已经启动并运行了大约 6 个月 没有出现任何问题 该函数只是获取一个对象并将其从一个存储桶复制到另一个存储桶 今天 我开始得到 SignatureDoesNotMatch 我们计算的请求签名不匹配 与
  • sed 仅删除第一个模式匹配

    我想匹配两个模式之间的一组数据并删除该数据和开始 结束模式 但仅限于模式的第一次出现 所以如果这是测试数据 PATTERNSTART LINE1 LINE2 LINE3 PATTERNEND PATTERNSTART LINE1 LINE2
  • Python:如何从加拿大的 shapefile 创建分区统计图?

    我的目标是创建一个等值线地图 https en wikipedia org wiki Choropleth map加拿大的Python 假设我有一本字典 其中的值涉及加拿大每个省 地区 myvalues Alberta 1 0 Britis
  • ios 10+、Swift 3+ - 无法从 Singleton 实例中消除 UIAlertController

    我创建了一个覆盖层 以便在对服务器运行异步数据抓取时运行 以便用户在数据抓取完成之前不会继续按 UI 中的按钮 我已将该函数放入全局单例类中 并在传递布尔值时调用它来表示是否要显示或隐藏 我可以让它显示 但我无法让它隐藏 这是代码 clas
  • Solr 使用 copyField 突出显示

    我有一个 solr 实例 在索引时我在文本正文上使用 copyField 将其通过两个不同的分析器 我想突出显示这两个字段 因此我将这两个字段设置为stored true 这使得索引的文本存储变得臃肿 我认为这些数据是重复的 So 1 有没
  • DatePickerDialog 主题为 Holo Light?

    如何获得具有 Holo Light 主题的 DatePickerDialog 当创建一个DatePickerDialog如下 DatePickerDialog dpd new DatePickerDialog new ContextThem
  • 使用 jQuery 检查特定类的所有输入是否为空

    我正在尝试检查某个类的所有输入字段是否为空 现在我有以下代码 HTML
  • 如何设置 BLE 通告数据包的设备名称字段

    我使用 API 来构建广告数据包 我通过true to setIncludeDeviceName AdvertiseData data new AdvertiseData Builder setIncludeDeviceName true
  • 在php中模糊搜索数组

    在我搜索之后 我发现了如何对a进行模糊搜索string 但我有一个字符串数组 search a gt laptop b gt screen 我从 MySQL 数据库中检索到的 是否有任何 php 类或函数可以对单词数组进行模糊搜索 或者至少
  • Json 日期到 Java 日期并返回 Json 日期

    我在这里查看了所有可能的答案 但我很难弄清楚这件事 我在字符串中有 Json 日期 我想在不损失时间的情况下转换为 Java 日期 我还想从 Java Date 转换为 Json Date 字符串 这是我所拥有的 String jsonDa
  • 如何从图中获取顶点 ID

    请考虑以下事项 library igraph id lt c 1 2 A B name lt c 02 653245 03 4542342 Peter Mary category lt c digit digit char char fro
  • Scala 中有双向映射之类的东西吗?

    我想链接 2 列唯一标识符 并且能够通过第二列值获取第一列值以及通过第一列值获取第二列值 就像是 Map 1 lt gt one 2 lt gt two 3 lt gt three Scala中有这样的设施吗 实际上我需要更多 3 列 用于
  • 添加滚动视图会使应用程序崩溃

    我的任务是为情人节创建一个应用程序 我正在制作一个情书生成器 我只能使用一项活动 因此我创建了一个文本视图 将可见性设置为消失 这封情书有点长 所以我想要滚动视图 添加该内容会使应用程序崩溃 请帮忙
  • javascript中对象串联的问题

    我在连接java脚本中的对象时遇到问题 例如 var firstObj firstObj info sam kam var secObj secObj info ram dam 我需要的输出 firstObj info sam kam ra
  • ValueError:Python 中 float() 的文字无效

    To all 我很好奇是否有人可以帮助我理解错误 ValueError float 的无效文字 当我将文本文件传递到列表然后尝试将此列表转换为浮点值时 我得到了这个信息 a open input txt r lines a readline
  • 使用react-chartjs-2显示每个切片的饼图数据值

    我正在制作一个饼图 并且正在努力显示每个切片的饼图数据值 由于我的应用程序是用 React js 编写的 因此我使用react chartjs 2 我找到了这个针对chart js的解决方案并尝试实现 但它不适用于react chartjs
  • 使用动态规划进行硬币找零

    我一直在使用动态规划来解决硬币找零问题 我尝试创建一个数组 fin 其中包含该索引所需的最小硬币数量 然后打印它 我编写了一段代码 我认为应该给出正确的输出 但我不明白为什么它没有给出准确的答案 例如 对于输入 4 3 1 2 3 4是要找
  • 如何让 Go HTTP 客户端不自动遵循重定向?

    我目前正在用 Go 编写一些与 REST API 交互的软件 我尝试查询的 REST API 端点返回 HTTP 302 重定向以及指向资源 URI 的 HTTP Location 标头 我正在尝试使用 Go 脚本来获取 HTTP Loca