当前位置: 首页 > 面试题库 >

如何使Go HTTP客户端不自动跟随重定向?

慕凌
2023-03-14
问题内容

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

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

这是我目前为实现此功能正在做的事情:

package main

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

var BASE_URL = "https://api.stormpath.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(STORMPATH_API_KEY_ID, STORMPATH_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.ClientCheckRedirect功能,我实际上被迫将HTTP重定向视为错误(不是)。

我已经看到其他一些地方建议使用HTTP传输而不是HTTP客户端-但由于需要HTTP Client,因为我需要使用HTTP Basic
Auth与该REST通信,因此我不确定如何使此工作有效API。

你们中的任何人都可以告诉我一种通过基本身份验证发出HTTP请求的方法-不遵循重定向-不涉及引发错误和错误处理吗?

谢谢。


问题答案:

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

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

这样,http程序包会自动知道:“啊,我不应该执行任何重定向”,但不会引发任何错误。从源代码中的注释中:

作为一种特殊情况,如果CheckRedirect返回ErrUseLastResponse,则返回最近的响应,且其主体未关闭,并返回nil错误。



 类似资料:
  • 我在我的squarespace站点上使用了一些HTML&CSS来创建一个自定义的跟随光标。我只想有一个浮动的圆圈,没有实际的光标显示。我已经得到了它的工作,但当我的网站滚动跟随光标没有移动的页面滚动,只是卡在顶部。 这只会导致follow光标完全停止随鼠标移动而移动,在页面中心变成静态的。 将HTML&CSS注入到squarespace站点以创建自定义跟随光标: null null

  • 我的Spring Boot应用程序在同一台服务器上广播了一个RTMP流。 例如,它可以使用 rtmp://localhost/livestream 这是一个视频直播流,从RED5服务器播放。我想将这个直播流重定向到任何试图请求它的客户端。 例如: 这种行为是必要的,这样我就可以控制何时可以访问RTMP流,因为它将是实时的24小时,但只能在其中一些中访问。我将把这个逻辑放在我的上。 如何设置Spri

  • 问题内容: 我不明白为什么Java 不遵循从HTTP到HTTPS URL的HTTP重定向。我使用以下代码在https://httpstat.us/上获取页面: 该程序的输出为: 对http://httpstat.us/301的请求返回以下(缩短的)响应(这似乎绝对正确!): 不幸的是,Java HttpURLConnection不遵循重定向! 问题答案: 仅当重定向使用相同的协议时,才遵循重定向。

  • 我有一个简单的udp客户机/服务器程序。 如果客户端正在失去连接,或者服务器正在重新启动,客户端不会自动重新连接。我总是要手动重启客户端。 这是我的客户端套接字配置:

  • 问题内容: 我正在与socket.io聊天应用程序,我想用我的自定义客户端ID,而不是默认的(,)。连接时是否有任何发送自定义标识符的方式,或仅使用某种方式来跟踪每个ID的自定义名称?谢谢! 问题答案: 您可以在服务器上创建一个数组,并在其上存储自定义对象。例如,您可以存储Socket.io创建的ID和每个客户端发送到服务器的自定义ID: 在此示例中,您需要从每个客户端调用 storeClient