Http 是Hyper-Text Transfer Protocol簡寫,迄今爲止互聯網應用最普遍的協議。網絡服務、互聯網應用、網絡計算需求的增加,持續推進http協議應用範圍不斷擴展。java
java.net包提供http方式訪問資源的最基本功能,httpClient在其基礎上提供功能更豐富、更靈活的http請求能力,例如web瀏覽器、web服務客戶端或擴展http協議進行分佈式通訊等。web
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實體分爲如下三種:streamed、self-contained、wrapping。併發
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(); } }