這個問題有點問題,這並不是三種方式,okhttp只是對網路存取的一個更高層的封裝,httpURLConnection和httpClient是具體兩種實現存取的方式。 1)、HttpClient HttpClient是Apache Jakarta Common下的子項目,用來提供高效的、最新的、功能豐富的支援HTTP協定的客戶端程式設計工具包,並且它支援HTTP協定的最新版本和建議。
特點:
基於標準、純淨的Java語言。實現了Http1.0和Http1.1
以可擴展的物件導向的結構實現了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
這個問題有點問題,這並不是三種方式,okhttp只是對網路存取的一個更高層的封裝,httpURLConnection和httpClient是具體兩種實現存取的方式。
1)、HttpClient
HttpClient是Apache Jakarta Common下的子項目,用來提供高效的、最新的、功能豐富的支援HTTP協定的客戶端程式設計工具包,並且它支援HTTP協定的最新版本和建議。
特點:
基於標準、純淨的Java語言。實現了Http1.0和Http1.1
以可擴展的物件導向的結構實現了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
支援HTTPS協定。
透過Http代理建立透明的連線。
利用CONNECT方法透過Http代理建立隧道的https連接。
Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos認證方案。
插件式的自訂認證方案。
便攜可靠的套接字工廠使它更容易的使用第三方解決方案。
連線管理器支援多執行緒應用。支援設定最大連線數,同時支援設定每個主機的最大連線數,發現並關閉過期的連線。
自動處理Set-Cookie中的Cookie。
插件式的自訂Cookie策略。
Request的輸出流可以避免流中內容直接緩衝到socket伺服器。
Response的輸入流可以有效的從socket伺服器直接讀取對應內容。
在http1.0和http1.1中利用KeepAlive保持持久連結。
直接取得伺服器發送的response code和 headers。
設定連接超時的能力。
使用方法
使用HttpClient發送請求、接收回應很簡單,一般需要如下幾步即可。
建立HttpClient物件。
建立請求方法的實例,並指定請求URL。如果需要傳送GET請求,建立HttpGet物件;如果需要傳送POST請求,建立HttpPost物件。
如果需要傳送請求參數,可呼叫HttpGet、HttpPost共同的setParams(HetpParams params)方法來新增請求參數;對於HttpPost物件而言,也可呼叫setEntity(HttpEntity entity)方法來設定請求參數。
呼叫HttpClient物件的execute(HttpUriRequest request)傳送請求,該方法傳回一個HttpResponse。
呼叫HttpResponse的getAllHeaders()、getHeaders(String name)等方法可取得伺服器的回應頭;呼叫HttpResponse的getEntity()方法可取得HttpEntity對象,該物件包裝了伺服器的回應內容。程式可透過該物件取得伺服器的回應內容。
釋放連接。無論執行方法是否成功,都必須釋放連線
2)、HttpURLConnection
直接幫你找圖吧
3)okhttp
這個你搜一下網上解析一堆,我就不搬運了
這裡要說一點的是:在Android 2.3以上版本,盡量使用HttpURLConnection,而在Android 2.2及以下版本,盡量使用HttpClient。
因為:
HttpClient
DefaultHttpClient和它的兄弟AndroidHttpClient都是HttpClient具體的實作類,它們都擁有眾多的API,而且實作比較穩定,bug數量也很少。
但同時也由於HttpClient的API數量過多,使得我們很難在不破壞相容性的情況下對它進行升級和擴展,所以目前Android團隊在提升和優化HttpClient方面的工作態度並不積極。
HttpURLConnection
HttpURLConnection是一種多用途、輕量級的HTTP客戶端,使用它來進行HTTP操作可以適用於大多數的應用程式。雖然HttpURLConnection的API提供的比較簡單,但同時這也使得我們可以更容易去使用和擴展它。
不過在Android 2.2版本之前,HttpURLConnection一直存在著一些令人厭煩的bug。比方說對一個可讀的InputStream呼叫close()方法時,就有可能會導致連線池失效了。那我們通常的解決方法就是直接停用掉連接池的功能
差別太大,展開得話費不少口舌,就簡單講一下吧。
HttpClient是Java界比較優秀的一個HTTP客戶端工具包,所以最初Android也把它納入到支援中,希望大家可以方便的使用它進行HTTP請求。然而Android最初納入的居然是HttpClient的測試版,這就導致之後在Android中使用HttpClient可謂Bug百出。而Android的工程師們似乎不打算解決這個問題,甚至在後來的框架裡直接把HttpClient給踢了出去,所以基本上就不建議在Android使用HttpClient了。
為什麼Android願意拋棄HttpClient?一個重要的原因是他們更期望使用HttpURLConnection。 HttpURLConnection屬於Java API的範疇,相較於HttpClient這種第三方函式庫,HttpURLConnection更容易掌握在Google自己手中。不過HttpURLConnection封裝比較簡單,對HTTP請求的處理算是比較底層吧,使用起來並不是特別方便。
OkHttp和HttpClient差不多,也是第三方函式庫。不過它的封裝相對高層一些,也就是更簡單易用一些,而且它對Android有專門的支持,比HttpClient那種爛尾工程好很多。