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

我目前正在用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错误。

以上是 如何使Go HTTP客户端不自动跟随重定向? 的全部内容, 来源链接: utcz.com/qa/398010.html

回到顶部