全能編程開發工程師必備技能:DefaultHttpClient漫談

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
BPQBP的頭像BPQBP
上一篇 2025-01-11 16:27
下一篇 2025-01-11 16:27

相關推薦

發表回復

登錄後才能評論