我目前正在使用 Go 写一些和 REST API 交互软件。我试着查询 REST API 端点返回 HTTP 302 重定向和指向资源 URI 的 HTTP Location 标头。" N9 }5 n" M D+ B! _5 Q R: d
我试着用我的 Go 脚本来获取 HTTP Location 标头供以后处理。4 |# Y. v8 L, x* r9 U7 ~$ ?
这是我目前为实现这一功能所做的: ! O: L/ J: T; S) N
package mainimport ( "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()}) w4 |( p- y" _# V, R
这对我来说有点像黑客。通过覆盖http.Client‘sCheckRedirect我基本上被迫使用 函数HTTP 重定向视为错误(不是)。 & ~5 L- Q: o' `我已经看到其他地方建议使用 HTTP 传输而不是 HTTP 客户端-但我不知道如何做这项工作,因为我需要 HTTP 客户端,因为我需要使用 HTTP 基本身份验证与此 REST 通信应用程序接口。/ K2 N& i1 d0 J! G
你们中的任何人都可以告诉我使用基本身份验证 HTTP 请求方法-不遵循重定向-不涉及抛出错误和错误处理?2 r5 r( s' W9 F- D$ x G
( _- O$ u6 t* k8 r 解决方案: $ p* C& I* f8 z9 ]7 w3 P+ w7 b
现在有更简单的解决方案:5 K/ g0 f1 B3 u
[code]client := &http.Client{ CheckRedirect: func(req *http.Request,via []*http.Request) error return http.ErrUseLastResponse}code]这样,http包自动知道:啊,我不应该遵循任何重定向,但不会出错。源代码中的注释: 5 F6 }) H! O7 s, W2 b如果 作为一种特殊情况CheckRedirect 返回 ErrUseLastResponse,返回最新响应,其主体未关闭,并带有 nil 错误。