最近工作中需要使用commons-httpclient模拟请求拿到返回值,在浏览器上面直接请求很正常,如图:
但是代码返回的结果却是乱码,如下:
开始以为是编码问题,而是debug拿到返回值,如下:
使用各种编码测试:
byte[] bs = new byte[] { 31, -117, 8, 0, 0, 0, 0, 0, 0, 0, -85, 86, 42, -54, 47, 47, 86, -78, -118, -82, 86, 42, -82, 44, 14, -87, 44, 72, 85, -78, 82, 50, 84, -46, 81, 42, 45, 78, 45, -14, 76, 1, 114, -116, 77, -52, -108, 106, 99, 117, -108, -118, 74, -14, -100, -13, 83, 32, -46, -75, 0, -27, 121, -125, -98, 55, 0, 0, 0 }; String r2 = new String(bs, "utf-8"); String r3 = new String(bs, "gbk"); String r4 = new String(bs, "ISO8859-1"); String r5 = new String(bs); String r6 = new String(r3.getBytes(), "utf-8"); System.out.println(r2); System.out.println(r3); System.out.println(r4); System.out.println(r5); System.out.println(r6);
结果为:
确定不是编码问题后,反编译jar,debug看代码,试了很多次都没发现问题,今天偶然发现浏览器返回的值是用gzip编码的,如下:
而是试着看下模拟请求是否也是一样,结果如下:
确定原因后,只要解压一下就可以了:
if(rtnStatus==200){ Header[] header=post.getResponseHeaders("Content-Encoding"); if(header!=null&&header.length>0){ if("gzip".equals(header[0].getValue())){ rtnJson = new String(uncompress(post.getResponseBody())); }else{ rtnJson = new String(post.getResponseBody(), "UTF-8"); } }else{ rtnJson = new String(post.getResponseBody(), "UTF-8"); } }
public static String uncompress(byte[] bytes) throws IOException { if (bytes == null || bytes.length == 0) { return ""; } ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayInputStream in = new ByteArrayInputStream(bytes); GZIPInputStream gunzip = new GZIPInputStream(in); byte[] buffer = new byte[256]; int n; while ((n = gunzip.read(buffer)) >= 0) { out.write(buffer, 0, n); } return out.toString("utf-8"); }
结果如下:
全文完。
相关推荐
4. 参数编码:在设置请求参数时,确保正确地对字符串进行URL编码,防止乱码问题。 总结,Apache Commons HttpClient 3.1是一个功能强大的HTTP客户端库,虽然在现代开发中可能有更先进的选择,但它仍能满足基本的...
本文将深入探讨如何使用HttpClient来彻底解决乱码问题。 HttpClient是一个功能强大的HTTP客户端,支持多种HTTP协议版本,包括GET、POST等请求方法,以及重试、连接管理等功能。在处理中文字符时,由于编码不一致...
- **Base64编码/解码**:用于在网络传输中安全地处理二进制数据,避免由于包含非ASCII字符而引起的乱码问题。 - **Hex编码/解码**:将字节转换为16进制表示,便于打印和显示。 - **Phonetic编码**:如Metaphone和...
HttpClient库使得开发者可以方便地发起HTTP请求,如GET、POST等,同时支持各种HTTP特性,如重定向、Cookie管理以及处理响应。在本文的上下文中,HttpClient被用来从远程服务器下载文件。 博客中提到的`...
在这个实例中,可能涵盖了如何设置请求头、发送GET和POST请求、处理响应内容以及解决可能出现的问题,如乱码问题。 描述中的"解上傳亂碼"可能是指在使用HttpClient进行文件上传时遇到的字符编码问题。在HTTP上传...
- 使用`httpClient.execute(method)`来执行POST请求,并获取`HttpResponse`对象。 2. **处理响应**: - 检查`HttpResponse`的状态行,判断请求是否成功。状态码200表示请求成功。 - 如果请求成功,我们可以从...
使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。 1.创建HttpClient对象。 HttpClient client = new HttpClient(); 2.创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;...
9. **示例代码**:提供的JAVA代码示例展示了如何使用Apache Commons HttpClient库的PostMethod来构建和发送POST请求,包括设置Content-Type为GBK编码,并添加必要的NameValuePair对象。 这个接口文档是为开发者提供...