【问题标题】:Golang: how to make http client not following redirects?Golang:如何使 http 客户端不遵循重定向?
【发布时间】:2016-12-01 11:27:01
【问题描述】:

我想使用具有以下特性的 http 客户端进行 http 调用:

  • 不遵循重定向(只需获取第一次调用的完整响应,返回 302 重定向代码)
  • 能够接收 cookie

因此,我正在寻找使用 http.Client 而不是 trasport.RoundTrip 的解决方案

我该怎么做?

【问题讨论】:

  • 如何存储 cookie 与如何检查重定向响应是一个完全不同的问题。
  • 是的,这就是棘手的部分。我可以使用 transport.RoundTrip 而不是 http 客户端获得单一响应,但我也在寻找可以检索 cookie 的解决方案。
  • 使用 http.Client 时 CookieJar 不起作用,但在第一次重定向时停止?
  • 是的,我正在尝试找出如何不让客户端进行重定向。

标签: http go session-cookies http-redirect


【解决方案1】:
    client := &http.Client{
        CheckRedirect: func(req *http.Request, via []*http.Request) error {
            return http.ErrUseLastResponse
        },
    }

根据https://pkg.go.dev/net/http#Client.CheckRedirect

【讨论】:

    【解决方案2】:

    如果您使用http.Client,您可以选择使用CheckRedirect field

    此字段采用自定义函数,如果初始请求收到错误,则该函数可以处理任何重定向。

    一个简单的例子可能是这样的:

    client: &http.Client{
        CheckRedirect: func(req *http.Request, via []*http.Request) error {
            return errors.New("something bad happened") // or maybe the error from the request
        },
    }
    

    您还可以返回 http.ErrUseLastResponse error,它返回最近的响应,其正文未关闭。

    【讨论】:

    • 太棒了!您能否提供任何示例代码,以便在响应 302 的情况下不遵循重定向?
    • @DanieleB - 我已经更新了我的答案以展示一个简单的实现。
    • 谢谢,但我不太确定应该如何使用它。我想要的是:1)客户端不应该遵循重定向; 2)我将能够获得重定向网址; 3) CookieJar 会像往常一样工作
    • @DanieleB: CheckRedirect 返回的错误是“标志”
    • 我刚刚实现了它,效果很好!我也意识到甚至可以修改以下重定向的请求,从而更改重定向的 url。好东西!
    猜你喜欢
    • 2012-07-27
    • 2018-05-11
    • 2012-11-09
    • 2014-03-13
    • 2018-05-19
    • 2015-03-01
    • 2012-07-03
    • 2019-05-10
    • 2020-07-02
    相关资源
    最近更新 更多