天天看點

Apache httpclient的execute方法調試

因為工作需要,想研究一下execute執行的邏輯。

在這一行調用execute:

response = getHttpClient().execute(get);           

getHttpClient的實作:

private HttpClient getHttpClient() {
        if (this.m_httpClient == null) {
            this.m_httpClient = HttpClientBuilder.create().build();
        }
        return this.m_httpClient;
    }           

我在代碼裡聲明的HttpClient隻是一個接口,

Apache httpclient的execute方法調試

實作類是InternalHttpClient。

Apache httpclient的execute方法調試

首先根據傳入的請求決定出目标-target host

Apache httpclient的execute方法調試

投遞到RedirectExec執行。

Apache httpclient的execute方法調試

後者又投遞到RetryExec執行。

Apache httpclient的execute方法調試

收到307重定向:

Apache httpclient的execute方法調試

redirectsEnabled标志位為true:

Apache httpclient的execute方法調試

再看目前的請求确實被redirect了嗎?

Apache httpclient的execute方法調試

original url:

Apache httpclient的execute方法調試

我的背景伺服器傳回的307,落到了分支HttpStatus.SC_TEMPORARY_REDIRECT處:

Apache httpclient的execute方法調試

看來Apache的庫認為隻有HEAD和GET才能被redirect:

Apache httpclient的execute方法調試

重定向最大次數:50

Apache httpclient的execute方法調試

準備重試了:

Apache httpclient的execute方法調試

本文來自雲栖社群合作夥伴“汪子熙”,了解相關資訊可以關注微信公衆号"汪子熙"。

繼續閱讀