在用httpclient做网页提取的过程中,通过抓包工具发现了 头部中会有 Accept-Encoding: gzip, deflate字段,本文不介绍该字段具体是干什么的,只是告诉你在请求的时候,如果头部有了该字段,则服务器会将内容reponse的内容进行压缩用gzip或者deflate算法,然后reponse给用户。目前我看到的仅仅有gzip算法被用到,然后返回给用户的数据也是压缩后的数据,这样往往可以减轻服务器的负担,同时也减少了网络传输。以下用浏览器在访问百度主页是抓包的例子:
GET / HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/xaml+xml, application/x-ms-xbap, application/x-ms-application, */*
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; chromeframe/16.0.912.63; QQDownload 708; .NET CLR 2.0.50727; .NET4.0C; .NET4.0E)
Accept-Encoding: gzip, deflate
Host: www.baidu.com
Connection: Keep-Alive
在头部中有Accept-Encoding: gzip, deflate字段,则服务器会将响应进行压缩,返回。我们在用浏览器查看时,并没有觉察到这一切的发生,是因为,浏览器已经帮我们进行了解压缩,这样百度主页的内容得以正常显示。
现在的问题是如果我编程时,如果用到了Accept-Encoding: gzip, deflate字段呢?当然如果,你去掉了该字段,服务器返回给你的当然是没有压缩过的内容,所见即所得。可是如果有了该字段,你又不处理,那么就会遇到乱码现象(这是肯定的,因为只是压缩过的数据)。下边我会利用httpclient工具对加入了Accept-Encoding: gzip, deflate 的内容进行处理,使得内容可以正常处理。
主要有两个关于解压缩的类:
DeflateDecompressingEntity
GzipDecompressingEntity
我们只用了第二个GzipDecompressingEntity ,使用它非常简单,只需要
GzipDecompressingEntity gzipDecompressingEntity
=new
GzipDecompressingEntity(HttpEntity entity)即可。
这里的参数
entity是原来压缩过的entity.下边是一个完整的例子:
String url="http://www.baidu.com";
Map<String,String> headers=new HashMap<String,String>();
headers.put("Accept", "*/*");
headers.put("Accept-Language", "zh-cn");
headers.put("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; chromeframe/16.0.912.63; QQDownload 708; .NET CLR 2.0.50727; .NET4.0C; .NET4.0E)");
headers.put("Accept-Encoding", "gzip, deflate");
headers.put("Host", "www.baidu.com");
headers.put("Connection", "Keep-Alive");
HttpResponse response=HttpUtils.doGet(url, headers);
HttpEntity entity1=response.getEntity(); //压缩过的entity
long len=entity1.getContentLength();//压缩过的长度
System.out.println(entity1.getContentType());//类型
System.out.println(entity1.getContentEncoding().getValue());//压缩类型
System.out.println("gzip:压缩前的内容长度"+len);
GzipDecompressingEntity entity=new GzipDecompressingEntity(entity1);
InputStream in=entity.getContent();
String str=Utils.getStringFromStream(in);
System.out.println("实际内容长度为:"+str.getBytes().length);
程序运行结果为:
Content-Type: text/html;charset=gb2312
gzip
gzip:压缩前的内容长度3400
实际内容长度为:8039
由此可见,压缩前与解压缩后比,内容长度只有源内容大小的不到一半,采用压缩还是很能够节约带宽的,同时也能减低服务器的压力。
分享到:
相关推荐
HttpClientHelper 中的 SingleHelper 就是实现了单例模式的辅助类,为HttpClientHelper提供全局唯一的实例。这样做的好处是避免了频繁创建和销毁HttpClient对象,降低了系统资源消耗,尤其在高并发场景下,可以防止...
HTTPClient工具类,完整,HTTPClient工具类,完整,HTTPClient工具类,完整HTTPClient工具类,完整,HTTPClient工具类,完整
总结起来,`httpclient4.3工具类`是一个针对HttpClient 4.3的自定义包装,它封装了常见的HTTP操作,提供了便捷的接口供项目中使用。理解这个工具类的内部实现和HttpClient的核心概念,将有助于更好地利用它进行HTTP...
在HttpClient中,使用`HttpPut`类创建PUT请求,设置请求URL,然后将要更新的数据作为`HttpEntity`设置到请求中。执行方式与Post和Get相同。 4. **Delete请求**: Delete请求用于删除指定资源。HttpClient提供了`...
11. **连接池管理**:`PoolingHttpClientConnectionManager`是HttpClient 4.x版本中的连接池管理器,可以更高效地复用TCP连接,减少建立新连接的开销。 在实际应用中,你需要根据项目需求配置HttpClient实例,例如...
httpClientUtil工具类
httpclient是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,本文档提供使用httpclient的使用方法
首先,HttpClientUtil工具类通常会封装HttpClient的基本操作,以便于开发者在应用中便捷地调用。GET和POST请求是HTTP协议中最常见的两种请求方法。GET请求用于获取服务器上的资源,而POST请求则常用于向服务器提交...
这个文档通常会包含HttpClient的类结构、接口、方法等详细信息,以及如何使用这些API来构建HTTP请求的示例。例如,`CloseableHttpClient`是HttpClient的核心类,用于创建和管理HTTP连接;`HttpGet`和`HttpPost`分别...
标签"HttpClient"进一步确认了文档的主题,HttpClient是Java中广泛使用的HTTP客户端库,尤其在需要进行复杂的HTTP交互或者自动化测试时,其强大的功能和灵活性使其成为首选。 在阅读这份“httpclient中文帮助文档....
java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient ...
基于Apache HttpClient 4.5.2 封装的工具类 HttpUtil 可用于爬虫和模拟登陆。使用新的语法后比3.*版本的速度感觉有提升。使用后注意资源的释放 pom 部分,应该不全,需要用的根据代码的import去找maven资源即可。 ...
本篇文章将深入探讨Android HttpClient的基本使用方法,帮助开发者理解和应用这个工具。 首先,我们来了解HttpClient的核心组件: 1. **HttpClient实例**:这是所有操作的基础,通过`HttpClient client = new ...
在Java项目中使用HttpClient时,为了确保功能的完整性和正确性,通常需要引入一系列的jar包。这些jar包包含了HttpClient的核心组件、依赖库和其他必要的工具,它们共同构成了HttpClient的运行环境。 以下是一些关键...
3. **线程安全**:HttpClient设计为线程安全,可以在多线程环境中使用,而无需额外的同步措施。 4. **自定义化**:HttpClient允许用户根据需要定制请求头、实体内容、编码策略等,以满足特定的应用场景。 5. **高...
利用httpclient封装了http的POST和GET请求方式,封装方法多样,返回结果为json
本文将基于4.5.3版本的HttpClient官方API中文文档,深入探讨其核心概念、使用方法及常见应用场景。 一、HttpClient简介 HttpClient是一款高效的HTTP客户端库,它支持多种HTTP标准,包括HTTP/1.1、HTTP/2以及...
为了正确使用HttpClient,首先需要将这些JAR包添加到项目的类路径中。在Java项目中,这可以通过IDE的依赖管理(如Maven或Gradle)来完成,或者直接将JAR包复制到项目的lib目录,并在构建路径中包含它们。 在编程时...
8. **性能优化**:封装工具类可能还包括其他性能优化措施,比如使用连接池来减少TCP连接的创建和销毁,或者使用线程安全的缓存策略来减少重复请求。 9. **重试策略**:对于可能出现的网络不稳定情况,封装工具类...
HttpClient工具类在Java编程中是用于执行HTTP请求的常用库,尤其在进行RESTful API调用时非常实用。HttpClient提供了一种更为灵活和强大的方式来处理网络通信,相比Java内置的HttpURLConnection,它提供了更丰富的...