如何让 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 客户端不自动遵循重定向? 的相关文章

  • nsq 无法通过连接到 nsqlookupd 来消费消息

    我尝试使用 docker compose 来运行 nsq docker compose yml如下 version 3 services nsqlookupd image nsqio nsq command nsqlookupd ports
  • 在 IntelliJ IDEA 中运行。多个文件和错误未定义:数据

    我想使用 IntelliJ IDE 社区版编写代码GO Go语言 我安装了正确的插件 并安装了构建应用程序所需的所有工具 我的应用程序包含以下两个文件 每个都在目录中 事件服务器 Main go Data go 如果我想使用 Run Ctl
  • bash 将输出重定向到文件,但结果不完整

    重定向命令输出的问题已经被问过很多次了 但是我有一个奇怪的行为 我使用的是 bash shell debian 版本 4 3 30 1 release 并尝试将输出重定向到文件 但并非所有内容都记录在文件中 我尝试运行的 bin 文件是 l
  • HTTP部分上传、断点续传的标准方法

    我正在开发 http 客户端 服务器框架 并寻找处理部分上传的正确方法 与使用带有 Range 标头的 GET 方法进行下载相同 但是 HTTP PUT 并不打算恢复 据我所知 PATCH 方法不接受 Range 标头 有没有办法通过 HT
  • 使用 testify 模拟接口方法两次,输入和输出不同

    如何在 golang 测试中模拟接口方法两次 例如 type myCache interface Get key string data interface error type service struct cache myCache f
  • 如何在C#中执行Go函数

    有没有办法从 C 执行 Go 函数 例如 对于 Python 我会使用 Ironpython 我知道我可以生成一个进程来执行 Go 脚本 但如果可能的话 我真的不想回退到这样的解决方案 Google 搜索没有显示任何内容 那么有什么方法可以
  • R 脚本自动化时的不同结果

    以下命令对 pdf 文件执行 Ghostscript 这pdf file变量包含该 pdf 的路径 bbox lt system paste C gs gs8 64 bin gswin32c exe sDEVICE bbox dNOPAUS
  • 在golang中获取TTFB(第一个字节的时间)值

    我正在尝试获取 TTFB 值和 Connect 值 c exec Command curl w Connect time connect TTFB time starttransfer Total time time total o dev
  • 是否可以修改 $_SESSION 变量?

    恶意用户是否可以将 SESSION 在 php 中 变量设置为他想要的任何值 很大程度上取决于您的代码 有一点非常明显 SESSION username REQUEST username
  • Go 无法推断赋值中的类型:“non-name on left side of :=”

    该片段按预期工作play golang org p VuCl OKMav http play golang org p VuCl OKMav i 10 next 11 prev i i next 然而这个几乎相同的片段给出了non name
  • 用于 RESTful 轨道应用程序的简单面包屑

    是否有任何辅助方法 除了默认 Rails 面包屑导航 http wiki rubyonrails org rails pages Breadcrumbs 为特定页面动态生成面包屑导航 而无需在 RESTful 应用程序中传递琐碎的参数 也就
  • 错误“binary.Write:无效类型”是什么意思?

    下面显示的代码 我创建了一个结构类型并希望将其编码为二进制 但它显示binary Write invalid type main Stu错误 我读过一些类似的代码 但我找不到为什么我的代码不起作用 type Stu struct Name
  • ExpressJS - DELETE 请求后 res.redirect

    我一直在寻找如何执行此操作 我正在尝试在发出删除请求后重定向 这是我正在使用的代码没有重定向 exports remove function req res var postId req params id Post remove id p
  • 使用 JWT 创建 PostMan GET 请求

    我是 PostMan 的新手 通常我使用curl 这是获得 JTW 的一个 curl X POST H X Requested With XMLHttpRequest H Content Type application json H Ca
  • 从 HTTP 登录到 HTTPS

    我的网站默认使用 HTTP 我确实有一个启用 HTTPS 的证书 但只有其上的某些区域强制建立安全连接 登录是通过 Ajax 处理的 我想开始使用 SSL 即使请求来自 HTTP 我尝试强制请求的地址具有 HTTPS 并且它完美地回复 然而
  • 在 python 中将变量传递给重定向上的模板

    我对 Python 比较陌生 所以请原谅任何幼稚的问题 我的主页有 2 个输入 一个用于 产品 一个用于 电子邮件 当用户单击 提交 时 他们应该被发送到 success 其中会显示 您已请求 产品 您将通过 电子邮件 收到通知 我试图找出
  • .htaccess 如果 URL 错误,请执行某些操作

    我正在做我的个人CMS http en wikipedia org wiki Content management system 我想在其中使用很酷 友好 的 URL 这是我的 htaccess 文件代码 RewriteEngine on
  • 为什么 websocket 需要使用 HTTP 进行打开握手?为什么不能成为一个独立的协议呢?

    Websocket 的设计方式是 通过使其握手成为有效的 HTTP 升级请求 其服务器可以与 HTTP 服务器共享端口 我对这个设计理念存有疑问 无论如何 WebSocket 协议都是一个独立的基于 TCP 的协议 为什么我们需要这个 HT
  • 重定向并保留我的图标

    我想知道当您单击 facebook 上的链接时 facebook 重定向如何保留其 favicon 并使用 FB favicon 打开新选项卡 我想知道如何实现这一点 它不是 iframe 所以我怎么能做这样的事情 我应该从哪里开始 当重定
  • 我应该避免在 golang 中使用单例包吗?

    现在我有一个包裹store包含以下内容 package store var db Database func Open url string error open db connection func FindAll model inter

随机推荐

  • 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