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