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

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

今天请求一个天气接口,发现一直乱码,开始没注意看请求头信息,平时  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("http://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 HTTP请求乱码解决GZIP 返回值乱码解决
Java API接口返回不是JSON的解决方案,SpringMVC返回JSON配置。
JSOUP 教程,JSOUP请求JSON ,JSOUP返回JSON 数据
JSOUP教程,JSOUP 乱码处理,JSOUP生僻字乱码解决方案
Httpclent 请求限制,判断返回类型和返回数据大小
JQuery Ajax四种写法,Ajax请求返回JSON 操作Demo
MySQL数据库存储过程字符集问题,乱码解决办法
Java 信任所有SSL证书,HTTPS请求抛错,忽略证书请求完美解决
Http Get 请求Java 请求工具类封装
Elasticsearch 随机返回数据 API
最新文章
Macbook teamviewer 突破5分钟,苹果电脑重置 Mac 地址,100%解决限制 220
腾讯云代金券 10000 元/ 30000 代金券领取技巧 324
SEO 换友情链接的主意事项,友情链接断链、友情链接套路说明 229
Springboot + Mybatis,数据库多数据源配置项目Demo【源码下载】 1903
Mac mtr 安装并使用,mrt: command not found 299
Java 集成阿里云消息队列,日志消息存储 497
域名备案注意事项,网站域名ICP备案快速通过攻略【干货分享】 472
Springboot 集成Aliyun MQ消息队列,Aliyun 消息队列配置及代码实现 837
SpringBoot 集成Spring-data-redis,redis对象序列化存储 2029
天气API,全国天气 JSON API接口,可以获取十五天的天气预报 604
最热文章
Elasticsearch教程(四) elasticsearch head 插件安装和使用 126781
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 108004
Elasticsearch教程(六) elasticsearch Client创建 78810
Elasticsearch教程(八) elasticsearch delete 删除数据(Java) 74434
Elasticsearch教程(二),IK分词器安装 73217
Elasticsearch教程(一),全程直播(小白级别) 65782
Elasticsearch教程(五) elasticsearch Mapping的创建 61877
Elasticsearch教程(三),IK分词器安装 (极速版) 56361
Elasticsearch教程(七) elasticsearch Insert 插入数据(Java) 53539
Java 解析JSON,JSON-LIB jar包下载和使用。 48973

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

入群需要5元,如果没有QQ钱包,可以先Alipay、微信,赞助然后加群主拉进。

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

支付扫码

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

正在加载... ...