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—————————
三、推薦閱讀
- HttpClient和HttpURLConnection的區別
- HttpClient和HttpURLConnection的使用和區別
- HTTPClient實現GET/POST請求實例
- HTTPClent實現二進制數據上傳實例
- HTTPURLConnection實現GET/POST請求實例