【轉】Java模擬http請求,調用外部api接口(一):HttpURLConnection和HttpClient的區別


  JAVA中,java.net.HttpURLConnection 和 org.apache.http.client.HttpClient兩個類,都可以模擬實現HTTP請求。

  其中,HttpURLConnection 是jdk提供的類,其實現了http請求的所有操作,但由於其方法偏向於原子操作,因此,HttpURLConnection適合於簡單的http請求,而對於復雜的http請求實現比較麻煩。而 HttpClient 類,是對 HttpURLConnection 做了進一步的封裝,尤其是對復雜的http請求,做了很好的優化實現。

轉載說明:以下正文內容轉載自「China漁火」 版權聲明:本文為CSDN博主「China漁火」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/amosjob/article/details/82782546

———————正文 Start—————————

一、HttpURLConnection 對象

  1. HttpURLConnection對象需要通過URL類中的openConnection()方法來獲得,它無法直接構造。

HttpsURLConnection urlconn = null;
URL url = new URL(address);
urlconn = (HttpsURLConnection)url.openConnection();

  2. HttpURLConnection的connect()函數,實際上只是建立了一個與服務器的TCP連接,並沒有實際發送HTTP請求。HTTP請求實際上直到我們獲取服務器響應數據(如調用getInputStream()、getResponseCode()等方法)時才正式發送出去。並且HttpURLConnection對象的配置都需要在connect()方法執行之前完成。

urlconn = (HttpsURLConnection)url.openConnection();
urlconn.setRequestMethod("GET");
urlconn.setConnectTimeout(5000);
urlconn.setReadTimeout(5000);
urlconn.setUseCaches(false);
urlconn.connect();

  3. HttpURLConnection是基於HTTP協議的,其底層通過socket通信實現。如果不設置超時(timeout),在網絡異常的情況下,可能會導致程序僵死而不繼續往下執行。

public HttpURLConnection(URL url, String s, int i){
this(url, new Proxy(java.net.Proxy.Type.HTTP, 
InetSocketAddress.createUnresolved(s, i)));
}

  4. HTTP正文的內容是通過OutputStream流寫入的, 向流中寫入的數據不會立即發送到網絡,而是存在於內存緩沖區中,待流關閉時,根據寫入的內容生成HTTP正文。

  5. 調用getInputStream()方法時,返回一個輸入流,用於從中讀取服務器對於HTTP請求的返回信息。

InputStream inputStream = urlconn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
BufferedReader buff = new BufferedReader(inputStreamReader);
String line = buff.readLine();
while(line != null){
System.out.println(line);
line = buff.readLine();
}
inputStream.close();
inputStreamReader.close();
buff.close();

  6. 我們可以使用HttpURLConnection.connect()方法手動的發送一個HTTP請求,但是如果要獲取HTTP響應的時候,請求就會自動的發起,比如我們使用HttpURLConnection.getInputStream()方法的時候,所以完全沒有必要調用connect()方法。

 

二、HttpClient 對象

  HttpClient相比較來說簡化了HttpURLConnection對象對Session、Cookie的處理。

  可以說HttpClient就是一個增強版的HttpURLConnection,HttpClient可以做HttpURLConnection對象所有能做的事。

  HttpClient是Apache開源組織提供的它是一個簡單的HTTP客戶端,不是瀏覽器,用於發送HTTP請求,接收HTTP響應。但不會緩存服務器的響應。它只是關注於如何發送請求、接收響應,以及管理HTTP連接。

 

HttpClient的使用

使用HttpClient發送請求、接收響應很簡單,只要如下幾步即可。

  1. 創建HttpClient對象,CloseableHttpClient httpclient = HttpClients.createDefault();

  2. 如果需要發送GET請求,創建HttpGet對象;如果需要發送POST請求,創建HttpPost對象。

  3. 如果需要發送請求參數,可調用HttpGet、HttpPost共同的setHeader()方法或者addHeader()方法來添加請求參數;對於HttpPost對象而言,也可調用setEntity(方法來設置請求參數。

UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params);
httpPost.setEntity(entity);

  4. 調用HttpClient對象的execute(HttpUriRequest request)發送請求,執行該方法返回一個HttpResponse。

  5. 調用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可獲取服務器的響應頭;調用HttpResponse的getEntity()方法可獲取HttpEntity對象,該對象包裝了服務器的響應內容。程序可通過該對象獲取服務器的響應內容。

———————正文 END—————————

三、推薦閱讀

  1. HttpClient和HttpURLConnection的區別
  2. HttpClient和HttpURLConnection的使用和區別
  3. HTTPClient實現GET/POST請求實例
  4. HTTPClent實現二進制數據上傳實例
  5. HTTPURLConnection實現GET/POST請求實例

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM