系统来了一个对接别的系统得需求,接入是简单,但是发现使用得字符不一致,导致互相拿到得报文乱码,感觉上也应该好处理,试了一下,由于自己菜,还是花费了些时间。下面是出方法:
@RequestMapping(value="/abc",methed={RequestMethod.POST})
public void testMethod(HttpServletRequest request,HttpServletResponse response){
request.setCharacterEncoding("GBK");//1设置
response.setCharacterEncoding("GBK");//2设置
response.setContentType("application/json;charset=GBK");//3设置
BufferedReadder br =new BufferedReadder(new InputStreamReader(request.getInputStream(),"GBK"));
StringBuilder sb=new StringBuilder();
String inpStr;
while((inpStr=br.readLine())!=null){
sb.append(inpStr);
}
JSONObject json=JSONObject.fromString(new String(sb.toString()));//将全部数据转成json字符串
Iterator it=json.keys();
Map<String,String>map=new HashMap<String,String>();
while(it.hasNext()){
String key=String.valueOf(it.next);
String value;
try{
value=new String(json.get(key).toString.getBytes("GBK"),"UTF-8");
map.put(key,value);//主要是将值的编码格式从gbk转到utf-8(key的没有处理,key如果存在中文的自己按照value的处理方法一样处理了)
}catch(UnsupportedEncodingException e){
e.printStackTrace();
}
}
//此时就已经把请求数据由GBK转成utf-8了,后端的service就可以正常使用,那么service层处理完成之后返回给controller的数据是utf-8,需要转换成gbk返回,由于上面我们做了2设置3设置,所以直接返回就行
//假如service返回的数据是Map<String,String>msg=new HashMap<String,String>();
Map<String,String>msg=new HashMap<String,String>();
response.getWriter().write(JSONObject.fromMap(msg).toString());//将map转换位字符串写出
}
参考须知:JSONObject是自己的工具类作用应该都看的出来,使用的报文是格式application/json,自己的修改为对应的就行,关闭流的代码我没写,写不动了,自己家一下,还有如果由语法小错误,自己改下,我在内网测试了,代码拿不出来,手敲的,可能敲错,理解。
另外如果用postman测试,可以在Headers里面添加key为Accpet,value为application/json;charset=GBK,发送的就是GBK格式报文了