Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http 当请求被重定向时,我可以检查响应吗?_Http_Go - Fatal编程技术网

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(...)