搜尋

首頁  >  問答  >  主體

Android的三种http请求方式的区别

关于Android的三种http请求方式:
(1)okhttp
(2)httpURLConnection
(3)httpClient

谁熟悉的能介绍一下,并解析一下区别呢?

PHP中文网PHP中文网2811 天前609

全部回覆(2)我來回復

  • 高洛峰

    高洛峰2017-04-17 17:47:01

    這個問題有點問題,這並不是三種方式,okhttp只是對網路存取的一個更高層的封裝,httpURLConnection和httpClient是具體兩種實現存取的方式。
    1)、HttpClient
    HttpClient是Apache Jakarta Common下的子項目,用來提供高效的、最新的、功能豐富的支援HTTP協定的客戶端程式設計工具包,並且它支援HTTP協定的最新版本和建議。

    特點:

    1. 基於標準、純淨的Java語言。實現了Http1.0和Http1.1

    2. 以可擴展的物件導向的結構實現了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。

    3. 支援HTTPS協定。

    4. 透過Http代理建立透明的連線。

    5. 利用CONNECT方法透過Http代理建立隧道的https連接。

    6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos認證方案。

    7. 插件式的自訂認證方案。

    8. 便攜可靠的套接字工廠使它更容易的使用第三方解決方案。

    9. 連線管理器支援多執行緒應用。支援設定最大連線數,同時支援設定每個主機的最大連線數,發現並關閉過期的連線。

    10. 自動處理Set-Cookie中的Cookie。

    11. 插件式的自訂Cookie策略。

    12. Request的輸出流可以避免流中內容直接緩衝到socket伺服器。

    13. Response的輸入流可以有效的從socket伺服器直接讀取對應內容。

    14. 在http1.0和http1.1中利用KeepAlive保持持久連結。

    15. 直接取得伺服器發送的response code和 headers。

    16. 設定連接超時的能力。
      使用方法

    使用HttpClient發送請求、接收回應很簡單,一般需要如下幾步即可。

    1. 建立HttpClient物件。

    2. 建立請求方法的實例,並指定請求URL。如果需要傳送GET請求,建立HttpGet物件;如果需要傳送POST請求,建立HttpPost物件。

    3. 如果需要傳送請求參數,可呼叫HttpGet、HttpPost共同的setParams(HetpParams params)方法來新增請求參數;對於HttpPost物件而言,也可呼叫setEntity(HttpEntity entity)方法來設定請求參數。

    4. 呼叫HttpClient物件的execute(HttpUriRequest request)傳送請求,該方法傳回一個HttpResponse。

    5. 呼叫HttpResponse的getAllHeaders()、getHeaders(String name)等方法可取得伺服器的回應頭;呼叫HttpResponse的getEntity()方法可取得HttpEntity對象,該物件包裝了伺服器的回應內容。程式可透過該物件取得伺服器的回應內容。

    6. 釋放連接。無論執行方法是否成功,都必須釋放連線

    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()方法時,就有可能會導致連線池失效了。那我們通常的解決方法就是直接停用掉連接池的功能

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 17:47:01

    差別太大,展開得話費不少口舌,就簡單講一下吧。

    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那種爛尾工程好很多。

    回覆
    0
  • 取消回覆