我正在使用Go编写一些与REST API交互的软件。我试图查询的REST API端点返回一个HTTP 302重定向,以及一个指向资源URI的HTTP Location头。
我正在尝试使用我的Go脚本获取HTTP Location头以供后续处理。
以下是我当前为实现此功能所做的操作:
这对我来说感觉有点像是一个 hack。通过覆盖
我看到其他一些地方建议使用 HTTP 传输而不是 HTTP 客户端 - 但我不确定如何使其工作,因为我需要 HTTP 客户端以便使用 HTTP 基本身份验证来与此 REST API 通信。
你们中有人能告诉我一种在不跟随重定向的情况下进行基本身份验证的 HTTP 请求的方法吗?这不涉及抛出错误和错误处理。
我正在尝试使用我的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()
}
这对我来说感觉有点像是一个 hack。通过覆盖
http.Client
的 CheckRedirect
函数,我本质上被迫将 HTTP 重定向视为错误(而它们并不是错误)。我看到其他一些地方建议使用 HTTP 传输而不是 HTTP 客户端 - 但我不确定如何使其工作,因为我需要 HTTP 客户端以便使用 HTTP 基本身份验证来与此 REST API 通信。
你们中有人能告诉我一种在不跟随重定向的情况下进行基本身份验证的 HTTP 请求的方法吗?这不涉及抛出错误和错误处理。