(8)针对在HTTPClient采用压缩格式的文件的传输,必须采用拦截器进行特殊的处理
public class ClientGZipContentCompression {
public final static void main(String[] args) throws Exception {
DefaultHttpClient httpclient = new DefaultHttpClient();
//设置相关的压缩文件标识,在请求头的信息中
httpclient.addRequestInterceptor(new HttpRequestInterceptor() {
public void process(
final HttpRequest request,
final HttpContext context) throws HttpException, IOException {
if (!request.containsHeader("Accept-Encoding")) {
request.addHeader("Accept-Encoding", "gzip");
}
}
});
//设置相应相应的拦截器,用于处理接收到的拦截的压缩信息
httpclient.addResponseInterceptor(new HttpResponseInterceptor() {
public void process(
final HttpResponse response,
final HttpContext context) throws HttpException, IOException {
HttpEntity entity = response.getEntity();
Header ceheader = entity.getContentEncoding();
if (ceheader != null) {
HeaderElement[] codecs = ceheader.getElements();
for (int i = 0; i < codecs.length; i++) {
if (codecs[i].getName().equalsIgnoreCase("gzip")) {
response.setEntity(
new GzipDecompressingEntity(response.getEntity()));
return;
}
}
}
}
});
HttpGet httpget = new HttpGet("http://www.apache.org/");
// Execute HTTP request
System.out.println("executing request " + httpget.getURI());
HttpResponse response = httpclient.execute(httpget);
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
System.out.println(response.getLastHeader("Content-Encoding"));
System.out.println(response.getLastHeader("Content-Length"));
System.out.println("----------------------------------------");
HttpEntity entity = response.getEntity();
if (entity != null) {
String content = EntityUtils.toString(entity);
System.out.println(content);
System.out.println("----------------------------------------");
System.out.println("Uncompressed size: "+content.length());
}
// When HttpClient instance is no longer needed,
// shut down the connection manager to ensure
// immediate deallocation of all system resources
httpclient.getConnectionManager().shutdown();
}
//压缩文件处理的实体包装类
static class GzipDecompressingEntity extends HttpEntityWrapper {
public GzipDecompressingEntity(final HttpEntity entity) {
super(entity);
}
@Override
public InputStream getContent()
throws IOException, IllegalStateException {
// the wrapped entity's getContent() decides about repeatability
InputStream wrappedin = wrappedEntity.getContent();
return new GZIPInputStream(wrappedin);
}
@Override
public long getContentLength() {
// length of ungzipped content is not known
return -1;
}
}
}
(9)在代理中添加相关访问权限
DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.getCredentialsProvider().setCredentials(
new AuthScope("localhost", 8080),
new UsernamePasswordCredentials("username", "password"));
HttpHost targetHost = new HttpHost("www.verisign.com", 443, "https");
HttpHost proxy = new HttpHost("localhost", 8080);
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
HttpGet httpget = new HttpGet("/");
System.out.println("executing request: " + httpget.getRequestLine());
System.out.println("via proxy: " + proxy);
System.out.println("to target: " + targetHost);
HttpResponse response = httpclient.execute(targetHost, httpget);
(10)针对特定的相应中信息比较多那么可以采用相关的相应处理器处理
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = httpclient.execute(httpget, responseHandler);
实现类如下:
public class BasicResponseHandler implements ResponseHandler<String>
关于HttpClient采用代理服务器的使用
// 创建两个host对象,其中一个目标机器,和代理主机make sure to use a proxy that supports CONNECT
HttpHost target = new HttpHost("issues.apache.org", 443, "https");
HttpHost proxy = new HttpHost("127.0.0.1", 8080, "http");
//设置相关的注册信息 general setup
SchemeRegistry supportedSchemes = new SchemeRegistry();
// Register the "http" and "https" protocol schemes, they are
// required by the default operator to look up socket factories.
supportedSchemes.register(new Scheme("http",
PlainSocketFactory.getSocketFactory(), 80));
supportedSchemes.register(new Scheme("https",
SSLSocketFactory.getSocketFactory(), 443));
//设置相关的参数的信息
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "UTF-8");
HttpProtocolParams.setUseExpectContinue(params, true);
//客户端连接管理器
ClientConnectionManager ccm = new ThreadSafeClientConnManager(params,
supportedSchemes);
DefaultHttpClient httpclient = new DefaultHttpClient(ccm, params);
//设置请求采用代理的
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
HttpGet req = new HttpGet("/");
//执行请求并处理
System.out.println("executing request to " + target + " via " + proxy);
HttpResponse rsp = httpclient.execute(target, req);
HttpEntity entity = rsp.getEntity();
(11)针对多线程的Httpclient中采用的特殊的连接管理
// Create and initialize HTTP parameters
HttpParams params = new BasicHttpParams();
ConnManagerParams.setMaxTotalConnections(params, 100);
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
// Create and initialize scheme registry
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(
new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
// Create an HttpClient with the ThreadSafeClientConnManager.
// This connection manager must be used if more than one thread will
// be using the HttpClient.
ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);
HttpClient httpClient = new DefaultHttpClient(cm, params);
分享到:
相关推荐
### Httpclient官网教程中文版知识点总结 #### 一、引言 HTTP协议作为互联网的核心通信标准之一,在现代网络服务及物联网设备中扮演着至关重要的角色。随着技术的发展,越来越多的应用和服务依赖于HTTP协议来实现...
二、HttpClient 4.2.1的主要特性 1. **多线程支持**:HttpClient 4.2.1支持多线程并发请求,可以高效地处理大量并发连接,提升了处理能力。 2. **连接管理**:它提供了连接池管理,允许重用已建立的TCP连接,减少...
二、HttpClient主要功能 1. **请求构造**:HttpClient允许我们创建各种类型的HTTP请求,包括GET、POST、PUT、DELETE等,可以通过设置URL、请求头、参数、实体内容等来定制请求。 2. **连接管理**:HttpClient可以...
二、HttpClient的使用步骤 1. **创建HttpClient实例**:首先,需要创建一个HttpClient实例,可以设置连接超时、重试策略等参数。 2. **选择HttpMethod**:根据实际需求选择合适的HttpMethod,比如使用GetMethod或...
总结,HttpClient 4.5 是一款强大且灵活的 HTTP 客户端库,其源码结构清晰,设计模式巧妙,通过深入学习和实践,开发者可以更好地利用它来实现高效、安全的网络通信。理解 HttpClient 4.5 的源码,不仅有助于我们...
二、HttpClient的核心组件 1. HttpClient实例:HttpClient是整个库的入口点,用于创建和执行HTTP请求。 2. HttpRequestBase:表示HTTP请求的基本类型,如GET、POST等,是所有HTTP请求的抽象基类。 3. HttpResponse:...
二、HttpClient 4.1.2核心特性 1. **连接管理**:HttpClient 4.1.2引入了HttpConnectionManager接口,用于管理和复用HTTP连接,降低网络延迟,提高效率。DefaultHttpClient实现了此接口,提供了连接池功能,可以...
#### 二、环境准备与需求分析 为了实现文件下载功能,我们需要以下条件: 1. **一台 Web 服务器**:用于存放待下载的文件。 2. **目标文件**:位于 Web 服务器的特定目录下。 3. **客户端程序**:使用 HttpClient ...
二、主要组件 1. `commons-httpclient-3.1.jar`: 这是HttpClient的核心库,包含了所有执行HTTP请求和处理响应的类和接口。例如,`org.apache.http.client.HttpClient`接口定义了客户端的基本行为,而`org.apache....
总结,HttpClient 3.1 JavaDoc CHM版为开发者提供了全面的API文档,帮助他们理解和使用HttpClient进行HTTP通信。虽然HttpClient已经更新到更高级的版本,但这个旧版本的文档对于维护旧项目或理解HTTP通信基础仍然...
总结来说,HTTPCLIENT是一个强大的Java HTTP客户端库,与日志框架(如Log4j)结合使用,可以实现详细的请求跟踪和问题排查。同时,它利用Commons Codec库进行数据编码解码,确保数据在网络中的正确传输。理解和掌握...
总结,HttpClient是Java中执行HTTP请求的强大工具,通过它,你可以轻松地进行GET、POST等HTTP操作,自定义请求头,处理响应数据。对于初级学员来说,理解并熟练运用HttpClient是掌握网络通信的关键步骤之一。在实际...
总结,`HttpClient`在Android中用于处理复杂的网络任务,尤其是文件上传。虽然面临被替代的命运,但在某些情况下,如对低版本Android的支持和需要高级功能时,它仍然是一种实用的选择。结合Android_HTTP服务实例....
总结,Apache HttpClient 4.3是Java开发中的强大工具,它的灵活性和高效性使得它在处理HTTP通信时具有显著优势。通过深入了解其功能和特性,开发者能够更好地利用HttpClient实现各种复杂的HTTP交互需求。
总结,Apache HttpClient 4.3.3是Java开发者进行HTTP通信的强大工具。通过深入理解和应用,我们可以构建高效、可靠的网络应用程序,并在抓包、API调用等场景中游刃有余。了解和掌握HttpClient,无疑是提升Java网络...
#### 二、HttpClient 的特点与适用范围 ##### 2.1 HttpClient 的主要特性: 1. **基于 HttpCore**:HttpClient 是基于 HttpCore 实现的客户端 HTTP 传输类库,这意味着它能够处理 HTTP 协议的基本层面,包括连接...
二、HttpClient 4.4关键特性 1. **性能优化**:HttpClient 4.4对连接池进行了优化,提高了并发请求处理能力,减少了TCP连接的创建和销毁次数,从而降低了网络延迟。 2. **线程安全**:HttpClient 4.4的设计考虑了...
二、HttpClient 4.3.5新特性 1. **连接管理**:4.3.5版本强化了连接管理器,支持连接池,可以有效复用TCP连接,减少网络延迟,提高性能。 2. **请求和响应处理**:新增了对HTTP/1.1和HTTP/2协议的支持,使得 ...
二、HttpClient的构建与配置 在使用HttpClient之前,首先需要构建一个HttpClient实例。HttpClient 4.5允许通过`HttpClientBuilder`类进行定制化配置,如设置连接超时、最大连接数、重试策略等。例如: ```java ...