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
微信扫一扫
支付宝扫一扫