情况背景
在通过httpClient进行转发请求的时候,请求参数含有汉字,日志/控制台打印无问题
但是在debug运行级别下,可以看到其内部打印的请求参数中文乱码
接收方也是乱码,开始寻找问题所在
原因
先贴原代码
StringEntity s = new StringEntity(json.toString());
s.setContentEncoding("UTF-8");
s.setContentType("application/json");
httpPost.setEntity(s);
此处是对StringEntity类进行设置编码UTF-8,所以我也没多想,以为这样就够了
所以造成了这个问题
也就是对于请求内容的编码没有做约束
点开对于StringEntity两个set方法的源码可以看到,其实都只是在设置请求头Header
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPR50dFpnT5tmeNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0cTN0MTNzADM0AjMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
对于ContentEncoding要怎么理解呢?
ContentEncoding就是我以哪个格式传输,传输后接收到要以那个格式解析
比如我有一串字符串"ABC123",以UTF-8编码格式的ContentEncoding进行传输
那么我进行解析的时候如果是以GBK进行解析就会是乱码
以UTF-8解析就还是"ABC123"
那么,如果我传输的内容本身就是乱码,就算以相同的ContentEncoding进行解析,结果也还是乱码
所以原因是我们并没有对请求内容的字符串,也就是代码中的JSON进行编码设置,造成其使用了默认编码传输
那么,StringEntity默认的编码格式是什么呢?
点开StringEntity的构造函数的源码可以看到,只传内容的情况下,会对这个内容进行默认编码格式设置,也就是DEFAULT_TEXT
再点开DEFAULT_TEXT,翻到最下面的静态代码块中,对于DEFAULT_TEXT设置的是ISO_8859_1,也就是说对于post中的StringEntity编码格式默认为ISO_8859_1
所以在不设置编码格式的情况下,对post请求会出现乱码的情况
解决方法
上面已经说清楚原因了,其实只要在StringEntity初始化的时候指定编码格式就好了
StringEntity s = new StringEntity(json.toString(),"UTF-8");
s.setContentEncoding("UTF-8");
s.setContentType("application/json");
httpPost.setEntity(s);
后记
在这个问题没有解决之前,也考虑了其他方法进行http的post请求,其中一个就是RestTemplet,也算学到了一个新的发起请求的方法,而且还可以直接将返回内容转换为指定对象,不需要再进行String到对象的类型转换了
但是记得要对其用配置类进行配置,来设置其编码为UTF-8
另:上述一些东西为自己的皮毛理解,如有错误还请指正