文档章节

HttpURLConnection 请求

learn_more
 learn_more
发布于 2015/01/15 21:28
字数 492
阅读 1357
收藏 13

我们经常在程序中发送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();
 }
 
}


© 著作权归作者所有

上一篇: 2015年1月17日 mark
下一篇: JSONObject.toBean
learn_more
粉丝 93
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
详解HttpURLConnection

请求响应流程 设置连接参数的方法 setAllowUserInteraction setDoInput setDoOutput setIfModifiedSince setUseCaches setDefaultAllowUserInteraction setDefaultUseCaches 设置请求头或响应......

白志华
2015/12/30
462
0
URLConnection的连接、超时、关闭用法

Java中可以使用HttpURLConnection来请求WEB资源。 1、 URL请求的类别 分为二类,GET与POST请求。二者的区别在于: a:) get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet...

玄空
2013/02/17
622
0
HttpURLConnection相关的小记

HttpURLConnection相关的小记 小憩之地2014-07-3087 阅读 Android 在Android上进行网络通信,Android本身提供的手段是HttpClient和HttpURLConnection两种。其中HttpClient来自于Apache,拥有...

小憩之地
2014/07/30
0
0
Android链接网络的三种方法

HttpURLConnection的常用方法 // 获取链接网络的路径 URL url = new URL(strUrl); // 准备开启网络.设置访问网络的配置 HttpURLConnection httpURLConnection = (HttpURLConnection) url .o...

Jaume
2016/07/11
5
0
Android 网络编程(三)HttpURLConnection

HttpURLConnection HTTP的URLConnection(RFC 2616)用于通过Web发送和接收数据。数据可以是任何类型和长度。该类可用于发送和接收长度未预先知道的流数据。 使用步骤 HttpURLConnection使用...

VNanyesheshou
2017/08/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

jQuery使用GET方式来进行异步请求

jQuery.get( url, [data], [callback] ):使用GET方式来进行异步请求 参数: url(String) : 发送请求的URL地址. data(Map) : (可选) 要发送给服务器的数据,以 Key/value 的键值对形式表示,...

前端老手
10分钟前
3
0
网络安全市场需求

最近,网络安全技能差距的热门话题流传开来。技能差距经常被紧急讨论,可以看出它在实践中的作用是很大的。但信息安全是一门广泛的学科,所以在谈论“技能差距”时需要更具体。有专家表示,真...

linuxCool
27分钟前
3
0
定期批量改密,实现高效运维,保障口令安全

随着企业IT资产规模的不断增大,各类主机、应用系统的管理也变得愈加困难。 对于系统管理员来说,保证操作系统的密码安全是其重要工作,在需要维护众多的主机时,其面临的困境将是: 1、难以...

堡垒啊
52分钟前
5
0
怎样在磁盘上查找MySQL表的大小?这里有答案

导读 我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎。不应该在 INFORMATION_SCHEMA.TABLES 中提供这些信息吗?没那么简单! 我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎...

问题终结者
今天
6
0
Spring Boot缓存实战 Redis 设置有效时间和自动刷新缓存-2

问题 上一篇Spring Boot Cache + redis 设置有效时间和自动刷新缓存,时间支持在配置文件中配置,说了一种时间方式,直接扩展注解的Value值,如: @Override@Cacheable(value = "people#${s...

xiaolyuh
今天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部