`

HttpCLient实现对被GZip压缩过的Response进行解压

    博客分类:
  • Java
阅读更多

发送请求(要求服务端对response进行GZip压缩):

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;

public class TestGzip {

	private final static String url = "http://localhost:8888/ltest.jsp";

	public static void main(String[] args) throws Exception{
		HttpClient http = new HttpClient();
		CustomGetMethod get = new CustomGetMethod(url);
		
       //添加头信息告诉服务端可以对Response进行GZip压缩
    	get.setRequestHeader("Accept-Encoding", "gzip, deflate");
        try {
            int statusCode = http.executeMethod(get);
            if (statusCode != HttpStatus.SC_OK) {
                System.err.println("Method failed: "
                        + get.getStatusLine());
            }

            //打印解压后的返回信息
            System.out.println(get.getResponseBodyAsString());
        } catch (Exception e) {
            System.err.println("页面无法访问");
            e.printStackTrace();
        } finally {
		get.releaseConnection();
        }
	}
}
 

下面是CustomGetMethod.java的内容,getResponseBodyAsString()方法被重写,加入了解压功能

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.zip.GZIPInputStream;



public class CustomGetMethod extends org.apache.commons.httpclient.methods.GetMethod{
	
	public CustomGetMethod(String uri) {
		super(uri);
	}

	
	/**
	 * Get response as string whether response is GZipped or not
	 * 
	 * @return
	 * @throws IOException
	 */
	@Override
	public String getResponseBodyAsString() throws IOException {
		GZIPInputStream gzin;
        if (getResponseBody() != null || getResponseStream() != null) {
        	
        	if(getResponseHeader("Content-Encoding") != null
        			 && getResponseHeader("Content-Encoding").getValue().toLowerCase().indexOf("gzip") > -1) {
    				//For GZip response
    				InputStream is = getResponseBodyAsStream();
    	            gzin = new GZIPInputStream(is);
    	            
    	            InputStreamReader isr = new InputStreamReader(gzin, getResponseCharSet()); 
    	            java.io.BufferedReader br = new java.io.BufferedReader(isr);
    	            StringBuffer sb = new StringBuffer();
    	            String tempbf;
    	            while ((tempbf = br.readLine()) != null) {
    	                sb.append(tempbf);
    	                sb.append("\r\n");
    	            }
    	            isr.close();
    	            gzin.close();
    	            return sb.toString();
    			}  else {
				//For deflate response
				return super.getResponseBodyAsString();
			}
        } else {
            return null;
        }
    }

}
 
分享到:
评论
9 楼 rabbit0708 2013-03-02  
写的很好,学习了。谢谢
8 楼 落樱神斧 2011-11-10  
EntityUtils.toString(new GzipDecompressingEntity(responseEntity));
//responseEntity为原始的返回...
一句话解决....
7 楼 zhoulei984623 2011-11-03  
难得你们公司也有这方面的需求,看来是个不错的公司。


javajava22 写道
    public String getResponseBodyAsString(HttpEntity entity ) throws IOException { 
        GZIPInputStream gzin = null; 
       
             
           
                    //For GZip response 
                    InputStream is = entity.getContent();
                    gzin = new GZIPInputStream(is); 
                     
                    //InputStreamReader isr = new InputStreamReader(gzin, "utf8");  
                    //java.io.BufferedReader br = new java.io.BufferedReader(isr);
                   
                    StringBuffer sb = new StringBuffer(); 
                    List<byte[]> arr =new ArrayList<byte[]>();
                    try {
                    byte[] by= new byte[1024];
                   
                    int actlength=0;
                   
                  
                   
                    while((actlength=gzin.read(by))!=-1){
                       
                        byte[] b=Arrays.copyOf(by, actlength);;
                        arr.add(b);
                       // String s= new String(b,"utf8");
                     //   System.out.print(s);
                     //   System.out.println("@@@@@@@@@");
                     //   sb.append(s);
                     //   actlength = 0;
                    }
                   

//                   
//                    StringBuffer sb = new StringBuffer(); 
//                    String tempbf; 
                  
//                        while ((tempbf = br.readLine()) != null) { 
//                            sb.append(tempbf); 
//                            sb.append("\r\n"); 
//                        }
                    }
                    catch (java.io.EOFException e) {
                        // TODO Auto-generated catch block
                   //     e.printStackTrace();
                        int actlength=0;
                       
                     //   List<byte[]> arr =new ArrayList<byte[]>();
                        actlength = 0;
                        for(byte[] b : arr){
                            actlength+=b.length;
                        }
                        byte[] by1= new byte[actlength];
                        actlength = 0;
                        for(byte[] b : arr){
                            System.arraycopy(b,0,by1,actlength,b.length);
                            actlength+=b.length;
                            //Arrays.
                        }
                        String s= new String(by1,"utf8");
                       
                        sb.append(s);
                    } 
//                    isr.close(); 
//                    gzin.close(); 

                    return sb.toString();
                 //   return "";
               
                //For deflate response 
            
        
 
    } 

这样就ok了,可以处理中文

6 楼 javajava22 2011-11-03  
    public String getResponseBodyAsString(HttpEntity entity ) throws IOException { 
        GZIPInputStream gzin = null; 
       
             
           
                    //For GZip response 
                    InputStream is = entity.getContent();
                    gzin = new GZIPInputStream(is); 
                     
                    //InputStreamReader isr = new InputStreamReader(gzin, "utf8");  
                    //java.io.BufferedReader br = new java.io.BufferedReader(isr);
                   
                    StringBuffer sb = new StringBuffer(); 
                    List<byte[]> arr =new ArrayList<byte[]>();
                    try {
                    byte[] by= new byte[1024];
                   
                    int actlength=0;
                   
                  
                   
                    while((actlength=gzin.read(by))!=-1){
                       
                        byte[] b=Arrays.copyOf(by, actlength);;
                        arr.add(b);
                       // String s= new String(b,"utf8");
                     //   System.out.print(s);
                     //   System.out.println("@@@@@@@@@");
                     //   sb.append(s);
                     //   actlength = 0;
                    }
                   

//                   
//                    StringBuffer sb = new StringBuffer(); 
//                    String tempbf; 
                  
//                        while ((tempbf = br.readLine()) != null) { 
//                            sb.append(tempbf); 
//                            sb.append("\r\n"); 
//                        }
                    }
                    catch (java.io.EOFException e) {
                        // TODO Auto-generated catch block
                   //     e.printStackTrace();
                        int actlength=0;
                       
                     //   List<byte[]> arr =new ArrayList<byte[]>();
                        actlength = 0;
                        for(byte[] b : arr){
                            actlength+=b.length;
                        }
                        byte[] by1= new byte[actlength];
                        actlength = 0;
                        for(byte[] b : arr){
                            System.arraycopy(b,0,by1,actlength,b.length);
                            actlength+=b.length;
                            //Arrays.
                        }
                        String s= new String(by1,"utf8");
                       
                        sb.append(s);
                    } 
//                    isr.close(); 
//                    gzin.close(); 

                    return sb.toString();
                 //   return "";
               
                //For deflate response 
            
        
 
    } 

这样就ok了,可以处理中文
5 楼 javajava22 2011-11-02  
这个读取不到不会返回 -1 ,直接抛出异常
4 楼 javajava22 2011-11-02  
    public String getResponseBodyAsString(HttpEntity entity ) throws IOException { 
        GZIPInputStream gzin = null; 
       
             
           
                    //For GZip response 
                    InputStream is = entity.getContent();
                    gzin = new GZIPInputStream(is); 
                     
                    //InputStreamReader isr = new InputStreamReader(gzin, "utf8");  
                    //java.io.BufferedReader br = new java.io.BufferedReader(isr);
                   
                    StringBuffer sb = new StringBuffer(); 
                    try {
                    byte[] by= new byte[1024];
                   
                    int actlength=0;
                    while((actlength=gzin.read(by))!=-1){
                       
                        byte[] b=Arrays.copyOf(by, actlength);;
                       
                        String s= new String(b,"utf8");
                        System.out.println(s);
                        sb.append(s);
                       
                    }
//                   
//                    StringBuffer sb = new StringBuffer(); 
//                    String tempbf; 
                  
//                        while ((tempbf = br.readLine()) != null) { 
//                            sb.append(tempbf); 
//                            sb.append("\r\n"); 
//                        }
                    }
                    catch (java.io.EOFException e) {
                        // TODO Auto-generated catch block
                   //     e.printStackTrace();
                    } 
//                    isr.close(); 
//                    gzin.close(); 

                    return sb.toString();
                 //   return "";
               
                //For deflate response 
            
        
 
    } 
3 楼 javajava22 2011-11-02  
zhoulei984623 写道
javajava22 写道
截取部分代码 ,抛错

java.io.EOFException
at java.util.zip.GZIPInputStream.readUByte(GZIPInputStream.java:207)
at java.util.zip.GZIPInputStream.readUShort(GZIPInputStream.java:197)
at java.util.zip.GZIPInputStream.readUInt(GZIPInputStream.java:189)
at java.util.zip.GZIPInputStream.readTrailer(GZIPInputStream.java:179)
at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:94)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)


你是在linux or windows?


windows , 发现这个和普通的IO 好像 有区别,换成 读取byte 后一样报错,不过捕捉就行了,内容还是没错,不过让人抓狂的是 抓取解压的代码 有时候是中文,有时候部分是乱码,呵呵
2 楼 zhoulei984623 2011-11-01  
javajava22 写道
截取部分代码 ,抛错

java.io.EOFException
at java.util.zip.GZIPInputStream.readUByte(GZIPInputStream.java:207)
at java.util.zip.GZIPInputStream.readUShort(GZIPInputStream.java:197)
at java.util.zip.GZIPInputStream.readUInt(GZIPInputStream.java:189)
at java.util.zip.GZIPInputStream.readTrailer(GZIPInputStream.java:179)
at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:94)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)


你是在linux or windows?
1 楼 javajava22 2011-11-01  
截取部分代码 ,抛错

java.io.EOFException
at java.util.zip.GZIPInputStream.readUByte(GZIPInputStream.java:207)
at java.util.zip.GZIPInputStream.readUShort(GZIPInputStream.java:197)
at java.util.zip.GZIPInputStream.readUInt(GZIPInputStream.java:189)
at java.util.zip.GZIPInputStream.readTrailer(GZIPInputStream.java:179)
at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:94)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)

相关推荐

    【ASP.NET编程知识】.Net Core HttpClient处理响应压缩详细.docx

    在这个例子中,我们设置了HttpClientHandler的`AutomaticDecompression`属性为`DecompressionMethods.GZip`,这样HttpClient就会自动处理GZip格式的压缩响应。 二、HttpClientHandler和DecompressionMethods枚举 ...

    HttpClient实现远程下载

    通过HttpClient实现远程下载,本例子通过java代码实现

    Delphi的GZIP解压示例源代码(亲测可用)

    在IT行业中,Delphi是一种流行的面向对象的编程...总之,这个Delphi的GZIP解压示例源代码是一个实用的学习工具,它展示了在Delphi中如何利用第三方库进行文件解压缩,对于提升开发者处理压缩数据的能力具有实际意义。

    HttpClient 卡死 response 为 null - 帐前卒 - CSDN1

    在使用Apache HttpClient库进行HTTP请求时,可能会遇到`HttpClient`返回`response`为`null`的问题,这通常意味着请求没有成功地完成或者某些资源没有被正确处理。在本篇文章中,我们将深入探讨这个问题的原因和解决...

    HttpClient

    当HttpClient发送请求时,它可以指定接受GZIP压缩的响应,服务器在返回数据时会对数据进行压缩,HttpClient再负责解压。这不仅降低了网络带宽的使用,也提高了数据传输的效率。 `HttpClient.cpp`很可能是实现...

    HttpClient4.5 实现https忽略SSL证书验证

    使用HttpClient4.5实现https请求忽略SSL证书验证工具类

    HttpClient实现文件下载

    ### HttpClient 实现文件下载 #### 一、简介与原理 在Java开发中,经常会遇到需要通过HTTP协议来获取网络资源的需求,例如从Web服务器下载文件。Apache HttpClient 是一个用于发送HTTP请求的Java类库,它提供了...

    安卓文件下载上传解压相关-Android使用HttpClient实现上传下载功能并监控进度.rar

    这个压缩包"安卓文件下载上传解压相关-Android使用HttpClient实现上传下载功能并监控进度.rar"提供了使用HttpClient实现这些功能的示例代码。HttpClient是一个Java库,它允许开发者创建HTTP请求,支持包括下载和上传...

    httpclient实现webservice客户端

    HttpClient库广泛应用于构建Java应用程序,尤其是那些需要与Web服务进行交互的程序。本篇文章将详细介绍如何使用HttpClient实现WebService客户端。 首先,我们需要了解WebService的基本概念。WebService是一种基于...

    HttpClient实现POST GET和文件下载

    本篇文章将深入探讨如何利用HttpClient实现这些功能,并提供实战代码示例。 首先,让我们了解GET和POST两种HTTP请求方法的基本概念。GET是HTTP协议中最常见的请求方式,用于获取服务器上的资源,所有数据都包含在...

    windowsphone Gzip 压缩

    在Web开发中,Gzip通常被服务器用于对HTML、CSS、JavaScript等静态资源进行压缩,然后再发送到客户端(如Windows Phone设备),从而降低网络带宽消耗,加快页面加载速度。 在Windows Phone平台上,开发人员可能需要...

    Android使用HttpClient实现上传下载功能并监控进度

    同样,我们可以实现`HttpResponse`的监听器,当数据被接收时,计算下载进度并更新UI。注意,为了确保数据的完整性和避免内存溢出,我们通常会将接收到的数据写入到文件流中。 下面是一个简化的上传示例: ```java ...

    httpclient所有jar包以及实现类

    通过熟练掌握HttpClient的使用,后台程序员可以更高效地实现与远程服务器的通信,特别是处理JSON数据的场景。 总的来说,"HTTPclient.jar"包含了实现HTTP请求和响应处理所需的所有类和接口。结合JSON解析库,后台...

    java实现HttpClient异步请求资源的方法

    本篇文章将详细介绍如何使用Java的HttpClient实现异步请求资源。 首先,让我们了解什么是异步请求。在同步请求中,调用一个API或发送一个HTTP请求后,程序会等待响应返回,然后继续执行后续代码。而异步请求则不同...

    开启TOMCAT6的GZIP压缩

    GZIP压缩的工作原理是在客户端请求网页后,由服务器端将网页文件压缩后再发送给客户端,客户端接收到压缩后的文件后,由浏览器进行解压并显示页面内容。这种方式不仅可以减少传输的数据量,而且还能对动态生成的内容...

    httpclient实现跨项目数据交互

    `Httpclient` 是一个强大的工具,可以实现跨项目间的数据通信。本文将深入探讨如何使用 `Httpclient` 进行HTTP请求,实现不同项目之间的数据交换。 `Httpclient` 是Apache HttpClient库,它为Java开发者提供了全面...

    httpClient,JAVA访问http request response

    - 在实际开发中,HttpClient常与其他工具配合使用,如Apache Commons IO库进行文件操作,或者使用JUnit进行单元测试。 9. **最佳实践**: - 关闭资源:请求完成后记得关闭响应实体和连接,避免内存泄漏。 - 使用...

    HttpClient重新封装的HttpClient类

    在Web开发中,HttpClient常常被用于网页抓取、API调用和其他网络通信任务。本篇文章将深入探讨重新封装的HttpClient类,以及如何利用它进行高效且灵活的网络请求。 首先,我们来看一下`HttpClient`类的基本用法。...

    java实现httpClient样例

    这个样例项目旨在帮助初学者理解如何在Java中使用HttpClient来与Web服务器进行交互。 在JavaHttpProject这个项目中,你可以找到以下关键知识点: 1. **HttpClient的创建**:首先,你需要创建一个HttpClient实例。...

Global site tag (gtag.js) - Google Analytics