文章內容
1.HttpClient的主要對象
2.HttpClient特性和機制
1.HttpClient的主要對象
1.1.URI(資源定位)
URI用來定位請求的資源的位置,URI的組成爲:
[scheme:][//host:port][path][?query][#fragment]
在HttpClient中通過構造者模式創建URI;
1.2.HTTP request(Http請求)
HttpClient支持Http/1.1標準,支持所有方法:GET , HEAD , POST , PUT , DELETE , TRACE, OPTIONS,對應的實現類爲HttpGet、HttpHead…
1.3.HTTP response(Http請求)
HttpClient請求返回的對象,包含響應的所有內容:Http響應的頭部信息和數據實體;
1.4.Request execution(請求執行)
HTTP request請求對象通過執行execute方法返回HTTP response對象;
CloseableHttpResponse response = httpclient.execute(httpget);
1.5.HTTP entity(HTTP 實體)
HTTP entity一般由實體頭域和實體組成,實體頭域包含Content-Encoding、Content-Length等實體頭;HTTP request和HTTP response都可以附加entity,內容可以是字符串、文件或者是動態的內容;可通過關閉HTTP response或者entity自身來釋放底層資源;
entity分爲三種:streamed(一次讀寫), self-contained(從內存中讀取,可重複)、wrapping(從其他entity封裝);
1.6.TTP execution context(HTTP上下文)
原生的HTTP被設計成無狀態的,但是對於一些需要維護請求狀態的連接(如TLS),則無法勝任;
1.7.Response handlers(響應處理)
在獲取到響應數據後調用,用於對返回的數據進行處理;
MyJsonObject myjson = client.execute(httpget, rh);
1.8.HTTP protocol interceptors(HTTP協議攔截器)
在數據被髮送到服務器之前調用,用於對請求數據進行處理,特別是對於持續的HTTP請求很有效;
CloseableHttpClient httpclient = HttpClients.custom()
.addInterceptorLast(new HttpRequestInterceptor() {
public void process(
final HttpRequest request,
final HttpContext context) throws HttpException, IOException {
AtomicInteger count = (AtomicInteger) context.getAttribute("count");
request.addHeader("Count", Integer.toString(count.getAndIncrement()));
}
})
.build();
1.9.Exception(異常)
HttpClient主要有兩類異常:IOException和HttpException
IOException:主要是數據傳輸層面的錯誤
HttpException:協議層面的錯誤
HttpException是IOException的子類,HttpClient會嘗試恢復I/O上的異常,卻不會恢復HttpException;
1.10. Request retry handler(請求重發處理)
如果出現異常,可通過 Request retry handler對可能的異常原因進行恢復;可以使用StandardHttpRequestRetryHandler來代替默認的handler,這些方法包括:GET , HEAD , PUT , DELETE , OPTIONS 和 TRACE
1.11.Redirect handling(處理重定向)
HttpClient可以自動處理各種重定向,除了HTTP協議標準中禁止的重定向方式,比如狀態碼303,按標準必須轉換成GET方式,但是可以通過自定義重定向策略來適應不同情況;
LaxRedirectStrategy redirectStrategy = new LaxRedirectStrategy();
CloseableHttpClient httpclient = HttpClients.custom()
.setRedirectStrategy(redirectStrategy)
.build();
1.12.HTTP cookies(HTTP緩存)
cookies用於保存服務器和客戶端之間會話相關的token和短信息;HttpClient實現了cookies相關的操作;cookies的不同標準和策略;
2.HttpClient特性和機制
2.1.HttpClient是線程安全的
HttpClient可以可重複用於HTTP請求,而不需要爲每一個HTTP請求創建一個HttpClient;
2.2.HttpClient資源必須釋放
當HttpClient不再使用,需要調用其close方法釋放內存資源;
2.3.HttpClient連接管理器
連接管理類似於線程池的作用,用於減少連接的建立,節省系統資源;管理器關閉,其中的alive連接都將被關閉;
* 2.3.1.Simple connection manager(簡單連接管理器)*
同一時間值維持一個連接,只能被一個線程使用(即使是線程安全的)
* 2.3.2.Simple connection manager(池連接管理)*
同一時間值維持數個連接,同時爲多個線程提供服務;對於已經維持的連接可提供給其他線程使用,不需要重新創建新的連接;在每個線路對應的連接數和總共的連接數都有限制,默認分別是2個和20個;不過可以進行配置;
2.4.與連接管理器相關的機制和策略
2.4.1.Connection eviction policy(連接回收策略)
2.4.2.Connection keep alive strategy(連接保活策略)
2.4.3.Connection socket factories(Socket連接工廠)
2.5.其他內容
2.5.1.HttpCient實現了與Http協議相關的網絡安全認證協議
2.5.2.Callbacks(異步請求)
當請求完成好時,調用MyCallback對應的方法,實現Http異步請求;
private final class MyCallback implements FutureCallback<Boolean> {
public void failed(final Exception ex) {
// do something
}
public void completed(final Boolean result) {
// do something
}
public void cancelled() {
// do something
}
}
HttpRequestFutureTask<Boolean> task = futureRequestExecutionService.execute(
new HttpGet("http://www.google.com"), HttpClientContext.create(),
new OkidokiHandler(), new MyCallback());