HttpClient apache上篇

1.什麼是HttpClient

  Http 是Hyper-Text Transfer Protocol簡寫,迄今爲止互聯網應用最普遍的協議。網絡服務、互聯網應用、網絡計算需求的增加,持續推進http協議應用範圍不斷擴展。java

  java.net包提供http方式訪問資源的最基本功能,httpClient在其基礎上提供功能更豐富、更靈活的http請求能力,例如web瀏覽器、web服務客戶端或擴展http協議進行分佈式通訊等。web

2.基本功能及概念

http request : 全部http請求是由方法名+請求URI+HTTP協議版本號組成。HttpClient提供全部方法的封裝類:HttpGet, HttpHead, HttpPost, HttpPut, HttpDelete, HttpTrace, and HttpOptions.瀏覽器

HttpGet httpget = new HttpGet(
"http://www.google.com/search?hl=en&q=httpclient&btnG=Google+Search&aq=f&oq=");

http response: http response是server收到request請求並響應後,返回給client的消息。httpClient返回信息 包括協議版本號+返回碼+文本。安全

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
HttpStatus.SC_OK, "OK");

http headers:Http消息(包括request、response)能夠包含一部分屬性字段,用來描述消息,例如:content length、content type等等網絡

http entity(實體): HTTP協議定義post和put請求能攜帶內容實體,默認response都應該封閉實體,可是HEAD方法的response和204,304,205返回例外。根據內容來源,http實體分爲如下三種:streamedself-containedwrapping併發

3.鏈接管理

Connection persistence : HttpClient支持長鏈接。一次鏈接握手的消耗是很明顯的,若是多個請求能複用鏈接,吞吐率能獲得明顯提高。app

HTTP connection routing : HttpClient支持直接和間接路由訪問目標host。HttpRoutePlanner 接口提供路由策略。socket

Secure HTTP connections :若是http 鏈接上傳輸的信息不能被未受權的第三方獲取,則認爲是安全鏈接。SSL/TLS protocol是應用最普遍的安全鏈接協議,通常都是http協議都是經過SSL/TLS加密傳輸。分佈式

HTTP connection managers:  Http鏈接是複雜、狀態的、線程不安全特色,須要鏈接管理確保功能可用。Http鏈接每次只能給一個正在執行的線程用。HttpClient使用HttpClientConnectionManager接口定義的實體類來管理訪問http鏈接。ManagedHttpClientConnection做爲一個實際鏈接的代理,管理鏈接狀態和控制IO操做。post

Multithreaded request execution: 

當使用鏈接池PoolingClientConnectionManager時,HttpClient支持同時併發多個線程執行多個請求。雖然HttpClient實例是線程安全的,文檔仍然建議每一個線程擁有專屬的HttpContext。

Connection eviction policy(鏈接驅逐策略):經典的阻塞IO模式下的一個重要缺陷是,網絡socket只在IO操做阻塞時,才能對IO事件做出反應。當鏈接釋放給manager後,鏈接仍然保持活,可是不能監測socket狀態,也不能處理任何IO事件。HttpClient使用一個專門的監測線程,趕走那些長時間不活動的鏈接。週期性調用ClientConnectionManager#closeExpiredConnections(),關閉超期鏈接並從鏈接池驅趕已關閉鏈接。

 Connection keep alive strategy(鏈接保持策略):

Http Servers使用Keep-Alive header告訴client,server側打算保持這個鏈接的時長秒數。若是字段keep-alive沒有指定,默認狀況下server會關閉長時間不活動的鏈接。爲了防止默認保持策略可能效果不夠好,能夠定義本身的 ConnectionKeepAliveStrategy myStrategy。

Connection socket factories: 

ConnectionSocketFactor接口提供建立、初始化、鏈接socket,PlainConnectionSocketFactory是默認建立、初始化不加密sockets。

Hostname verification(主機名校驗): 

爲了信任校驗和客戶端受權,HttpClient可選的驗證target hostname是否匹配server X.509證書中的主機名單,這個驗證機制保證server受權的鏈接。X509HostnameVerifier接口表示主機校驗。

HttpClient proxy configuration:HttpClient僅支持直連或者一跳代理。經過代理訪問,即配置默認代理參數,以下

HttpHost proxy = new HttpHost("someproxy", 8080);
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
CloseableHttpClient httpclient = HttpClients.custom()
.setRoutePlanner(routePlanner)
.build();

或者使用標準JRE proxy選擇器獲取代理信息:

SystemDefaultRoutePlanner routePlanner = new SystemDefaultRoutePlanner(
ProxySelector.getDefault());
CloseableHttpClient httpclient = HttpClients.custom()
.setRoutePlanner(routePlanner)
.build();

或者實現RoutePlanner:

HttpRoutePlanner routePlanner = new HttpRoutePlanner() {
public HttpRoute determineRoute(
HttpHost target,
HttpRequest request,
HttpContext context) throws HttpException {
return new HttpRoute(target, null, new HttpHost("someproxy", 8080),
"https".equalsIgnoreCase(target.getSchemeName()));
}
};
CloseableHttpClient httpclient = HttpClients.custom()
.setRoutePlanner(routePlanner)
.build();
}
}
相關文章
相關標籤/搜索