天天看点

HttpClient发送POST请求 请求内容乱码

情况背景

在通过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

HttpClient发送POST请求 请求内容乱码
HttpClient发送POST请求 请求内容乱码

对于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请求会出现乱码的情况

HttpClient发送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

另:上述一些东西为自己的皮毛理解,如有错误还请指正

继续阅读