Java 之 HTTP请求乱码解决,GZIP 返回值乱码解决

soゝso 2017-05-15 22:53:00 29178

今天请求一个天气接口,发现一直乱码,开始没注意看请求头信息,平时  HTTP  请求无非几种方法解决乱码问题。其实只要注意一点就可以了,编码一致即可,其次对方怎么编码,接收方怎么解码即可。

HTTP请求乱码解决方案一

这也是最简单的方式,主要是用IOUtils 工具类。

URL realUrl = new URL(url);
// 打开和URL之间的连接  
conn = (HttpURLConnection) realUrl.openConnection(); 
// 发送POST请求必须设置如下两行  
conn.setRequestMethod(StringUtils.upperCase(type));// 提交模式
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestProperty("Connection", "close"); 
conn.setConnectTimeout(3000);  //设置连接主机超时(单位:毫秒)  
conn.setReadTimeout(2000);     //设置从主机读取数据超时(单位:毫秒)  

//省略一些代码

//获取InputStream
InputStream inStream = conn.getInputStream();
//通过IOUtils 转化,把流转换为字符串。
//charset为编码格式,可选为"utf-8","gbk","gb2312"等等
String result = IOUtils.toString(inStream,charset);

HTTP请求乱码解决方案二

接着上面的代码,用我们最常用的方式,一行一行的读,charset 同上面一样。

StringBuffer sb = new StringBuffer("");  
in = new BufferedReader(new InputStreamReader(inStream, charset));  
String line = "";  
while ((line = in.readLine()) != null){  
	sb.append(line);  
}  
result = sb.toString();

我遇到的HTTP乱码异常

我遇到的乱码情况如下,  JSONP  请求不乱码,浏览器  Chrome  、  Firefox  、请求都乱码。如下图。

360 Chrome,和模式下都不乱码。

我们通过查询编码,为 UTF-8 ,但是我  HTTP  设置请求编码为UTF-8 ,照样乱码。

这次请求乱码好像把我难住了,我开始怀疑这个接口是不是有来源判断,故意乱码的,后来发现应该不会,理由很简单,因为这个接口是一个支持  JSONP  的接口,而且现在有网站正在使用。

经过各种转码后,都没有结果,一直乱码。发现忽略了一个问题。 经过仔细查看,发现返回的内容为Content-Encoding : gzip ,所以我们经常看到这种返回值就不要把编码再转来转去了。。

[0x0][0x0][0x0][0x0][0x0][0x0]
[0xad][0x93][0xdf]J[0x2]A[0x14][0xc6]_%[0xe6]z[0x3]][0xd7][0xfc][0xf3][\n]
[0xf4][0x0][0xd1][0xc5][0xa0][0xeb]*[0x98][0x96][0xbb][0xa2]"[0xb][0xa2][0x92]
[0xa8]Ra[0x83][0x7][0x95][0xb4]o[0xa1]H[0xa6]sp[0x6][0x10]ux[0xfd][0x1f][0xe]HG[0x1d]

处理方式用java.util.zip 下的工具类来先解压解决,接着上面的代码。

InputStream stream = new GZIPInputStream(conn.getInputStream());  
BufferedReader reader = new BufferedReader(new InputStreamReader(stream,"utf-8"));  
StringBuffer sb = new StringBuffer(); 
String line = "";  
while ((line = reader.readLine()) != null){  
	sb.append(line);  
}  
System.out.println(sb.toString());

或者如下:

InputStream stream = new GZIPInputStream(conn.getInputStream());  
String str = IOUtils.toString(stream,"utf-8");

整个代码:

URL realUrl = new URL("https://www.sojson.com/");
// 打开和URL之间的连接  
HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection(); 
// 发送POST请求必须设置如下两行  
conn.setRequestMethod("GET");// 提交模式
conn.setDoInput(true);
conn.setDoOutput(false);
conn.setUseCaches(false);
conn.setRequestProperty("Connection", "close"); 
conn.setConnectTimeout(3000);  //设置连接主机超时(单位:毫秒)  
conn.setReadTimeout(2000);     //设置从主机读取数据超时(单位:毫秒)  

InputStream stream = new GZIPInputStream(conn.getInputStream());  
String str = IOUtils.toString(stream,"utf-8");

OK,解决了。采用 JSON在线解析 输出结果如下:

{
    "desc": "OK",
    "status": 1000,
    "data": {
        "wendu": "21",
        "ganmao": "各项气象条件适宜,无明显降温过程,发生感冒机率较低。",
        "forecast": [
            {
                "fengxiang": "南风",
                "fengli": "微风级",
                "high": "高温 28℃",
                "type": "晴",
                "low": "低温 15℃",
                "date": "15日星期一"
            },
            {
                "fengxiang": "南风",
                "fengli": "3-4级",
                "high": "高温 32℃",
                "type": "多云",
                "low": "低温 17℃",
                "date": "16日星期二"
            },
            {
                "fengxiang": "南风",
                "fengli": "微风级",
                "high": "高温 34℃",
                "type": "晴",
                "low": "低温 19℃",
                "date": "17日星期三"
            },
            {
                "fengxiang": "南风",
                "fengli": "微风级",
                "high": "高温 35℃",
                "type": "晴",
                "low": "低温 23℃",
                "date": "18日星期四"
            },
            {
                "fengxiang": "南风",
                "fengli": "微风级",
                "high": "高温 34℃",
                "type": "多云",
                "low": "低温 22℃",
                "date": "19日星期五"
            }
        ],
        "yesterday": {
            "fl": "3-4级",
            "fx": "东北风",
            "high": "高温 27℃",
            "type": "多云",
            "low": "低温 14℃",
            "date": "14日星期日"
        },
        "aqi": "81",
        "city": "北京"
    }
}

哦,上面的org.apache.commons.io.IOUtils  的   Maven  方式:

<dependency>
	<groupId>commons-io</groupId>
	<artifactId>commons-io</artifactId>
	<version>2.4</version>
</dependency>

org.apache.commons.io.IOUtils  Jar  包下载,见附件。

总结,一定要看请求头信息。

版权所属:SO JSON在线解析

原文地址:https://www.sojson.com/blog/227.html

转载时必须以链接形式注明原始出处及本声明。


附件下载:

备注:点击文件名下载,附件源来自云端,只能在本站下载。复制下载链接无效。

本文主题:

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

关于作者
一个低调而闷骚的男人。
相关文章
Java API接口返回不是JSON的解决方案,SpringMVC返回JSON配置。
CDN 请求返回 connection reset by peer,被拦截请求解决方案
JSOUP教程,JSOUP 乱码处理,JSOUP生僻字乱码解决方案
Jsoup 提交参数乱码解决思路,解决过程及解决方案
Httpclent 请求限制,判断返回类型和返回数据大小
JSOUP 教程,JSOUP请求JSON ,JSOUP返回JSON 数据
JQuery Ajax四种写法,Ajax请求返回JSON 操作Demo
MySQL数据库存储过程字符集问题,乱码解决办法
Elasticsearch 随机返回数据 API
Http Get 请求Java 请求工具类封装
最新文章
使用七牛云存储实现图片API,自动删除图片方案合集 1005
神速ICP备案经验分享,ICP备案居然一天就通过了 2138
百度加强推送URL链接,百度SEO强行推送链接JavaScript代码案例讲解。 2867
SOJSON 拓展服务器被DDos攻击了一晚上,是如何解决的? 3177
湖南地区备案“新增网站需提交组网方案或解释说明”,关于备案做简单叙述 3226
企查查你是个什么企业,骗子的帮凶,诈骗的集中营,通过企查查骚扰企业电话不断,为所欲为的企查查 9493
Java爬取百度云观测对网站的检测数据,获取子域名及域名的安全信息 2503
【2020年】百度搜索词获取,获取百度搜索的关键词【真实有效】 6825
Nodejs环境安装,Nodejs环境安装一篇就够了 1778
iOS版淘宝打开提示“您使用的程序是内测版本,将于2020-03-28到期,到期将无法使用,请尽快下载最新版本” 2480
最热文章
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 430432
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 416974
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 350123
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 309427
免费天气API,天气JSON API,不限次数获取十五天的天气预报 286008
Elasticsearch教程(四) elasticsearch head 插件安装和使用 220175
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 175288
谈谈斐讯路由器劫持,你用斐讯路由器,你需要知道的事情 135878
Elasticsearch教程(一),全程直播(小白级别) 119018
Elasticsearch教程(五) elasticsearch Mapping的创建 98636

骚码加入我们 / 千人QQ群:259217951

入群需要5元为的是没有垃圾广告,如果没有QQ钱包,可以加群主拉进。

二维码生成 来自 >> 二维码生成器

支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

查看我的收藏

正在加载... ...