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

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

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

我怎样才能做到这一点?

  • 如何存储Cookie与如何检查重定向响应是一个完全独立的问题。
  • 是的,这就是棘手的部分。 我可以使用transport.RoundTrip而不是http客户端来获得单个响应,但是我也在寻找一种可以检索cookie的解决方案。
  • 当您使用http.Client时,CookieJar不能工作,但是在第一次重定向时停止吗?
  • 是的,我正在尝试找出如何不使客户端进行重定向。
  • 可能重复的问题:stackoverflow.com/questions/23297520/ stackoverflow.com/questions/14420222/

如果使用http.Client,则可以选择使用CheckRedirect字段。

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

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

1
2
3
4
5
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错误,该错误返回主体未关闭的最新响应。

  • 大!您能否提供任何示例代码,以便在响应302的情况下不遵循重定向?
  • @DanieleB-我更新了我的答案以显示一个简单的实现。
  • 谢谢,但是我不确定如何使用它。我想要的是:1)客户端不应遵循重定向; 2)我将能够获得重定向URL; 3)CookieJar照常工作
  • 我应该如何处理该错误?
  • 理想情况下,这应该等同于在客户端上设置"标记"以不遵循重定向,并且能够像往常一样检查cookieJar和响应
  • @DanieleB:从CheckRedirect返回的错误是"标志"
  • 我仍然不知道如何使用它。
  • @DanieleB:您使用客户端,而不是错误。 1)此客户端不遵循重定向。 2)检查Location标头以找到重定向URL。 3)饼干罐应该工作。
  • @沃尔克谢谢。因此,是否要在CheckRedirect函数中返回任何类型的错误以免跟随重定向就足够了?
  • @DanieleB-是的,这是正确的。
  • @DanieleB-您接受我的回答正确吗? :)
  • 完成了!非常感谢
  • 我刚刚实现了它,效果很好!我还意识到,甚至可以修改以下重定向的请求,从而更改重定向的url。好东西!