文档章节

HttpURLConnection 请求乱码

浮躁的码农
 浮躁的码农
发布于 2015/07/11 16:47
字数 473
阅读 60
收藏 1

我们经常在程序中发送Web请求,但是也经常在请求中出现乱码问题。下面的代码是发送请求的通用方法,但是在某些环境下中文会乱码,如何解决乱码问题呢?一开始的时候,我只想到对传入的参数进行

URLEncoder.encode(params.get("title"),"UTF-8");

然后在服务端发现接收的数据还是乱码,根本不用解码已经乱了,后面高人指点如下:

URLEncoder.encode(URLEncoder.encode(params.get("title"),"UTF-8"),"UTF-8");

然后在服务器端如下:

URLDecoder.decode(jsonvalue.get("title").toString(),"UTF-8");

终于得到了想要的中文。

总结:网络传输时,数据会被解析两次,第一次是在网络中,第二次是在服务器。如果我们在传输网络数据的时候没有加码,那么会解析为乱码,所以我们避免中文乱码,需要加码两次,第一次是让网络解析,解析过后还是加码的所有不会乱码,到服务器在解码问题就解决了。

/**
  * 客户端发送HTTP请求通用POST方法
  * @param url
  * @param params
  * @return
  * @throws Exception
  */
 public static String postHttpRequest(String url , Map<String,String> params)throws Exception{
  // 对空URL不处理
  if(url == null || url.length() == 0) return null;
  
  String result = null;
  // 处理参数
  String param = encodeUrlParams(params);
  if(param != null && param.length() > 0){
   if(url.contains("?")){
    url = url + "&" + param;
   }else{
    url = url + "?" + param;
   }
  }
  URL console = new URL(url);  
  HttpURLConnection conn = (HttpURLConnection)console.openConnection();  
  conn.setConnectTimeout(3000);//追加一个超时设置:3秒
  conn.setRequestMethod("POST");// POST请求  
  conn.setRequestProperty("Content-type", "text/html");
  conn.setRequestProperty("Accept-Charset", "utf-8");
  conn.setRequestProperty("contentType", "utf-8");
  // 开始连接
  conn.connect();
  InputStream is = conn.getInputStream();
  BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF8"));
  StringBuffer sb = new StringBuffer();
  
  String curLine="";
  while ((curLine = reader.readLine()) != null) {
   sb.append(curLine);
  }
  is.close();
  
  result = sb.toString();
  
  return result;  
 }
  
  
 /**
  * 处理参数
  * @param param
  * @return
  * @throws UnsupportedEncodingException
  */
 private static String encodeUrlParams(Map<String,String> param) throws UnsupportedEncodingException{
  StringBuilder bulider = new StringBuilder();
  if(param != null){
   Set<String> keys = param.keySet();
   for(String key : keys){
    if(StringUtils.isBlank(param.get(key))){
     bulider.append(key).append("=").append("").append("&");
    }else{
     bulider.append(key).append("=").append(param.get(key)).append("&");
    }
   }
  }
  if(bulider.length() > 0){
   return bulider.substring(0, bulider.length()-1);
  }
  return bulider.toString();
 }
  
}





本文转载自:

共有 人打赏支持
浮躁的码农

浮躁的码农

粉丝 71
博文 851
码字总数 154515
作品 0
松江
程序员
私信 提问
JSOUP教程,JSOUP 乱码处理,JSOUP生僻字乱码解决方案

JSOUP乱码情况产生 这几天我用 JSOUP 多线程的方式,爬取了200 多万数据,数据为各地的地名相关。结果有小部分数据,不到 1 万乱码。我先检查了我的编码为UTF-8 ,觉得应该没有问题。代码基本...

太阳代理
2017/11/08
0
0
HttpURLConnection 请求

我们经常在程序中发送Web请求,但是也经常在请求中出现乱码问题。下面的代码是发送请求的通用方法,但是在某些环境下中文会乱码,如何解决乱码问题呢?一开始的时候,我只想到对传入的参数进...

learn_more
2015/01/15
0
0
tomcat 中文乱码, mysql 中文乱码

tomcat中文乱码 get 请求. 修改server.xml中的<Connector></Connector>添加URIEncoding='UTF-8' <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443......

oldfeel
2014/05/17
0
0
linux下java发送短信乱码

http://www.smsadmin.cn/smsmarketing/wwwroot/api/getsend/?uid=&pwd=&mobile=&msg=dasd%E6%9D%8E&dtime=2014-08-23%2015:56:44 手机短接收 ie不乱码 chrome,ff乱--->查看chrome浏览器发送请......

不道归来
2014/08/23
0
0
HttpUrlConnection流传输问题(正确传输包含中文的JSON字符串)

目前在写一个功能,主要是使用 HttpURLConnection 发送http请求调用外部接口。本来一切正常的,可是在发送post请求上传数据给服务端时,服务端返回错误信息:获取的JSON请求是乱码的。 因为请...

wishingpep
2018/08/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

想问一下C++里queue要怎么遍历

如题,想知道怎么遍历<queue>对象的元素? 貌似不能遍历。要么全部pop push一遍,要么换个容器呗。 queue是先进后出的数据类型,只能不断读top()然后再pop()掉。故意把遍历操作隐藏掉了,...

shzwork
昨天
2
0
Ubuntu 18.04.2 LTS nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic)

平台:Ubuntu 18.04.2 LTS nvidia-docker2 版本:2.0.3 错误描述:在安装nvidia-docker2的时候报dpkg依赖错误 nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) 先看一下依......

Pulsar-V
昨天
2
0
学习笔记1-goland结构体(struct)

写在前面:若有侵权,请发邮件by.su@qq.com告知。 转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉! 本文永久更新地址:https://my.oschina.net/bysu/blog/3036...

不最醉不龟归
昨天
3
0
【转】go get命令使用socket代理

由于某些不可描述的原因,国内使用go get命令安装某些包的时候会超时导致失败,比如net包、sys包、tools包等。第一种解决办法就是自己从git上下载后添加链接到GOPATH中,比如: 1234...

yiduwangkai
昨天
6
0
从上往下打印出二叉树的每个节点,同层节点从左至右打印。

//第一种做法 public class Solution { public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) { ArrayList <Integer> li=new ArrayList<Integer>(); ArrayList <TreeN......

南桥北木
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部