全能编程开发工程师必备技能: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/n/317581.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
BPQBPBPQBP
上一篇 2025-01-11 16:27
下一篇 2025-01-11 16:27

相关推荐

发表回复

登录后才能评论