DefaultHttpClient是Apache HttpClient的一個標準實現,是用於客戶端HTTP通信的Java類庫。這個類庫提供了一個易用的、高度可定製的HTTP客戶端,允許我們發送HTTP請求並接收響應。
一、DefaultHttpClient的基礎概念
DefaultHttpClient被設計為用於多線程環境,以支持並發HTTP訪問。DefaultHttpClient應該被認為是一個無狀態客戶端,因此在每個請求之間不會保留任何上下文信息,也即不會保留任何Cookie或其他相關的參數信息。以下是DefaultHttpClient的基礎概念:
1、DefaultHttpClient類
DefaultHttpClient的最基礎的概念就是它的類,它是HttpClient的一個標準實現。
2、HttpClientContext
執行HTTP客戶端請求時,HttpClientContext用於保存請求的上下文信息,例如User Agent、Cookie、認證,以及代理信息等。
3、HttpContext
HttpContext被用於存儲Http客戶端請求的上下文信息。HttpContext包含了一個可選的用戶定義對象的緩存,這些對象能在請求和響應之間進行傳遞。
4、HttpClientBuilder
HttpClientBuilder是用於創建和配置DefaultHttpClient實例的工具類。HttpClientBuilder帶有很多有用的方法和屬性,其中包括設置連接池信息、設置超時時間等。
二、DefaultHttpClient的創建和使用
以下是使用DefaultHttpClient的代碼示例:
import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.protocol.BasicHttpContext; import org.apache.http.protocol.HttpContext; import java.util.List; import java.util.ArrayList; import java.io.IOException; public class HttpClientExample { public static void main(String[] args) throws IOException { // HttpClient的實例 DefaultHttpClient httpClient = new DefaultHttpClient(); // HttpPost的實例 HttpPost httpPost = new HttpPost("http://www.example.com"); // 添加Post參數 List nameValuePairs = new ArrayList(1); nameValuePairs.add(new BasicNameValuePair("param1", "val1")); httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); // HttpContext的實例 HttpContext httpContext = new BasicHttpContext(); // 執行HttpPost HttpResponse response = httpClient.execute(httpPost, httpContext); // 根據請求返回值處理響應結果 System.out.println(response.getStatusLine().getStatusCode()); } }
以上代碼展示了在Java中如何使用DefaultHttpClient。
我們可以看到,在這個示例中,我們首先創建了DefaultHttpClient的實例。然後,我們創建了HttpPost實例,它封裝了POST請求的信息。我們可以使用setEntity方法將POST參數添加到請求中。
接下來,我們創建了一個HttpContext實例。然後,我們使用httpClient.execute()方法執行HttpPost請求,並使用HttpContext實例來保存請求的上下文信息。最後,我們處理響應並輸出響應狀態代碼。
三、DefaultHttpClient新增特性與已棄用特性
隨着時間的推移,DefaultHttpClient API已添加了許多有用的新特性和已廢棄的舊特性。
新增特性:
- 1、解碼壓縮的響應流,以支持gzip和deflate編碼
- 2、異步請求API
- 3、Java NIO客戶端兼容模式支持
- 4、支持自定義標頭攔截器(interceptor)
- 5、導出證書和密鑰以便自定義SSL/TLS上下文
已廢棄特性:
- 1、Android API 22以上移除了DefaulthttpClient
- 2、DefaulthttpClient在Java11中被完全刪除
- 3、SSLSocketFactory和SchemeRegistry已被替換為SSLContext和HttpClientConnectionManager
四、使用HttpClientBuilder創建和配置DefaultHttpClient
HttpClientBuilder是創建和配置DefaultHttpClient的推薦方式。以下是使用HttpClientBuilder的示例:
import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.client.CookieStore; import org.apache.http.client.config.RequestConfig; import java.util.ArrayList; import java.util.List; public class HttpClientBuilderExample { public static void main(String[] args) { // HttpClientBuilder實例 HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); // 添加並配置連接池 PoolingHttpClientConnectionManager poolingConnManager = new PoolingHttpClientConnectionManager(); poolingConnManager.setMaxTotal(200); poolingConnManager.setDefaultMaxPerRoute(20); httpClientBuilder.setConnectionManager(poolingConnManager); // 添加CookieStore CookieStore cookieStore = ...; httpClientBuilder.setDefaultCookieStore(cookieStore); // 添加攔截器 List interceptors = new ArrayList(); interceptors.add(new GzipHttpRequestInterceptor()); httpClientBuilder.addInterceptorFirst(new IgnoreCookiesHttpRequestInterceptor()) .addInterceptorLast(new RequestUserAgentHttpRequestInterceptor()); // 添加超時參數 RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000) .setSocketTimeout(5000) .setConnectionRequestTimeout(5000) .build(); httpClientBuilder.setDefaultRequestConfig(requestConfig); // 創建HttpClient CloseableHttpClient client = httpClientBuilder.build(); } }
從上面的示例中,可以看出使用HttpClientBuilder的好處。HttpClientBuilder提供一些方法和屬性,用於創建和配置HttpClient實例,比如添加和配置連接池,添加CookieStore、添加並配置攔截器,添加請求超時時間等等。最後,我們使用builder的build()方法創建出一個可用的CloseableHttpClient實例。
五、結語
DefaultHttpClient是一個非常有用的類庫,在Java中供我們發送HTTP請求並接收響應。在本文中,我們詳細介紹了DefaultHttpClient的基礎概念、創建和使用、新增和廢棄特性,以及HttpClientBuilder的使用。DefaultHttpClient相對來說已經比較老舊,但是對於Android API 21以下的版本來說仍然是一個優秀的選擇。建議對於Java 11及以上版本,我們應該選擇使用HttpURLConnection或者更加革命性的Akka HTTP等新興的Java HTTP庫。
原創文章,作者:BPQBP,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/317581.html