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

来源:互联网 发布:极客邦科技软件 编辑:程序博客网 时间:2024/06/05 16:20

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

HTTP请求乱码解决方案一

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

  1. URL realUrl = new URL(url);
  2. // 打开和URL之间的连接
  3. conn = (HttpURLConnection) realUrl.openConnection();
  4. // 发送POST请求必须设置如下两行
  5. conn.setRequestMethod(StringUtils.upperCase(type));// 提交模式
  6. conn.setDoInput(true);
  7. conn.setDoOutput(true);
  8. conn.setUseCaches(false);
  9. conn.setRequestProperty("Connection", "close");
  10. conn.setConnectTimeout(3000); //设置连接主机超时(单位:毫秒)
  11. conn.setReadTimeout(2000); //设置从主机读取数据超时(单位:毫秒)
  12. //省略一些代码
  13. //获取InputStream
  14. InputStream inStream = conn.getInputStream();
  15. //通过IOUtils 转化,把流转换为字符串。
  16. //charset为编码格式,可选为"utf-8","gbk","gb2312"等等
  17. String result = IOUtils.toString(inStream,charset);

HTTP请求乱码解决方案二

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

  1. StringBuffer sb = new StringBuffer("");
  2. in = new BufferedReader(new InputStreamReader(inStream, charset));
  3. String line = "";
  4. while ((line = in.readLine()) != null){
  5. sb.append(line);
  6. }
  7. result = sb.toString();

我遇到的HTTP乱码异常

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

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

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

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

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

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

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

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

或者如下:

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

整个代码:

  1. URL realUrl = new URL("http://www.sojson.com/");
  2. // 打开和URL之间的连接
  3. HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
  4. // 发送POST请求必须设置如下两行
  5. conn.setRequestMethod("GET");// 提交模式
  6. conn.setDoInput(true);
  7. conn.setDoOutput(false);
  8. conn.setUseCaches(false);
  9. conn.setRequestProperty("Connection", "close");
  10. conn.setConnectTimeout(3000); //设置连接主机超时(单位:毫秒)
  11. conn.setReadTimeout(2000); //设置从主机读取数据超时(单位:毫秒)
  12. InputStream stream = new GZIPInputStream(conn.getInputStream());
  13. String str = IOUtils.toString(stream,"utf-8");

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

  1. {
  2. "desc": "OK",
  3. "status": 1000,
  4. "data": {
  5. "wendu": "21",
  6. "ganmao": "各项气象条件适宜,无明显降温过程,发生感冒机率较低。",
  7. "forecast": [
  8. {
  9. "fengxiang": "南风",
  10. "fengli": "微风级",
  11. "high": "高温 28℃",
  12. "type": "晴",
  13. "low": "低温 15℃",
  14. "date": "15日星期一"
  15. },
  16. {
  17. "fengxiang": "南风",
  18. "fengli": "3-4级",
  19. "high": "高温 32℃",
  20. "type": "多云",
  21. "low": "低温 17℃",
  22. "date": "16日星期二"
  23. },
  24. {
  25. "fengxiang": "南风",
  26. "fengli": "微风级",
  27. "high": "高温 34℃",
  28. "type": "晴",
  29. "low": "低温 19℃",
  30. "date": "17日星期三"
  31. },
  32. {
  33. "fengxiang": "南风",
  34. "fengli": "微风级",
  35. "high": "高温 35℃",
  36. "type": "晴",
  37. "low": "低温 23℃",
  38. "date": "18日星期四"
  39. },
  40. {
  41. "fengxiang": "南风",
  42. "fengli": "微风级",
  43. "high": "高温 34℃",
  44. "type": "多云",
  45. "low": "低温 22℃",
  46. "date": "19日星期五"
  47. }
  48. ],
  49. "yesterday": {
  50. "fl": "3-4级",
  51. "fx": "东北风",
  52. "high": "高温 27℃",
  53. "type": "多云",
  54. "low": "低温 14℃",
  55. "date": "14日星期日"
  56. },
  57. "aqi": "81",
  58. "city": "北京"
  59. }
  60. }
  61. 附件下载

    commons-io-2.4.jar