Http 当请求被重定向时,我可以检查响应吗?
当请求被重定向时,我们可以注册以检查下一个请求。有什么方法可以在重定向第一个请求时获得响应吗?您希望如何处理第一个响应?那会很无聊的Http 当请求被重定向时,我可以检查响应吗?,http,go,Http,Go,当请求被重定向时,我们可以注册以检查下一个请求。有什么方法可以在重定向第一个请求时获得响应吗?您希望如何处理第一个响应?那会很无聊的 我认为最明智的做法是自动禁用以下重定向(始终从CheckRedirect返回非零错误),并自行处理重定向,在这种情况下,您可以完全访问所有请求/响应。当前的实现方式,默认情况下,似乎不可能查看响应(除非您自己实现了Do()的功能)。 见: if shouldRedirect(分别为StatusCode){ //请阅读正文(如果较小),以便重新使用底层TCP连接。
我认为最明智的做法是自动禁用以下重定向(始终从
CheckRedirect
返回非零错误),并自行处理重定向,在这种情况下,您可以完全访问所有请求/响应。当前的实现方式,默认情况下,似乎不可能查看响应(除非您自己实现了Do()
的功能)。见:
if shouldRedirect(分别为StatusCode){
//请阅读正文(如果较小),以便重新使用底层TCP连接。
//无需检查错误:如果失败,传输将不会重用它。
const maxBodySlurpSize=2我的解决方法:
任何http请求/响应都可以在自定义的往返程序中修补,包括重定向:
键入重定向检查器结构{}
func(重定向检查器)往返(请求*http.Request)(*http.Response,错误){
//例如,在发送请求之前对其进行修补
请求标题集(“用户代理”、“curl/7.64.1”)
resp,err:=http.DefaultTransport.RoundTrip(请求)
如果err==nil&&resp!=nil{
开关对应状态代码{
案例
http.statusmoved永久,
http.StatusFound,
http.StatusTemporaryRedirect,
http.statusPermanentDirect:
//例如,停止进一步重定向
//大致相当于http.erruselastress
resp.StatusCode=http.StatusOK
//例如,读取设置的Cookie标题
//不幸的是,cookie jar不能以正确的方式处理重定向
//这就是为什么我要问这个问题。。。
fmt.Printf(“%+v”,分别为Cookies())
}
}
}
设置Cookie并检查重定向状态编号
if shouldRedirect(resp.StatusCode) {
// Read the body if small so underlying TCP connection will be re-used.
// No need to check for errors: if it fails, Transport won't reuse it anyway.
const maxBodySlurpSize = 2 << 10
if resp.ContentLength == -1 || resp.ContentLength <= maxBodySlurpSize {
io.CopyN(ioutil.Discard, resp.Body, maxBodySlurpSize)
}
resp.Body.Close()
if urlStr = resp.Header.Get("Location"); urlStr == "" {
err = fmt.Errorf("%d response missing Location header", resp.StatusCode)
break
}
base = req.URL
via = append(via, req)
continue
}
httpClient := &http.Client{Transport: RedirectChecker{}}
httpClient.Do(...)