`

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枚举 ...

    decompress:解压用 gzip 压缩的响应体

    去取解压 解压缩用 gzip 压缩的响应体。安装 npm install --save go-fetch-decompress用法 var HttpClient = require('go-fetch');var decompress = require('go-fetch-decompress');var parseBody = require('go-...

    java抓取网页源码gzip-phproxy:PHP中的代理

    标题 "java抓取网页源码gzip-phproxy" 暗示了我们正在讨论一个使用Java进行Web抓取,并处理GZIP压缩的项目,而“PHP中的代理”则可能指的是使用PHP构建的代理服务器。这个项目可能涉及到如何通过Java从通过PHP代理...

    PyPI 官网下载 | EasyConnect-1.0.4.tar.gz

    这种格式结合了tar(归档)和gzip(压缩)两种工具,能够有效地减小文件体积,便于在网络上传输和存储。在下载完成后,我们需要先解压这个文件,然后通过Python的setuptools或pip工具进行安装。 解压"EasyConnect-...

    android省电文档

    3. **使用GZIP压缩进行文本数据传输**: - 使用GZIP压缩可以显著减小传输的数据量,从而降低网络传输消耗的电量。可以通过Java自带的`GZIPInputStream`类来实现数据的解压: ```java ...

    C#如何解析http报文

    5. **处理压缩内容**:如果内容被压缩,比如使用gzip,我们可以使用`System.IO.Compression.GZipStream`来解压。解压后的内容再按照指定的字符集进行解码。 6. **处理编码**:对于非ASCII字符,我们需要使用合适的...

    C#常用的42个类

    29. `System.IO.Compression.GZipStream` 和 `System.IO.Compression.DeflateStream`:GZIP和Deflate压缩流,用于数据压缩和解压。 30. `System.Net.Sockets.TcpClient` 和 `System.Net.Sockets.TcpListener`:TCP...

    在Windows Universal App中使用Web服务

    8. **性能优化**:减少网络请求次数,合并多个请求为一个(如批量操作),使用缓存策略,以及在可能的情况下使用GZIP压缩以减小数据传输量。 通过阅读"Consume-Webservice-in-Windows-Universal-App.pdf"和解压...

Global site tag (gtag.js) - Google Analytics