目录
2.2 通过 @RequestMapping 中的 produces 属性解决,指定接收方的响应数据字符集为 utf-8
一、现象
在测试 HttpClient 时出现中文乱码的问题。但是在post请求的接收方中打印日志,可以看到接收方收到的数据是正确的。
请求方的日志:
接收方的日志:
二、解决方式
先说解决方式:
2.1 指定请求数据的字符集为 utf-8 格式
StringEntity entity = new UrlEncodedFormEntity(kvList, "utf-8");
2.2 通过 @RequestMapping 中的 produces 属性解决,指定接收方的响应数据字符集为 utf-8
@RequestMapping(value = "/httpclient/postparm", produces = MediaType.APPLICATION_JSON_VALUE+";charset=utf-8")
.....
三、原因和验证
出现中文乱码的原因是由于没有指定字符集为 utf-8
3.1 排除请求是否是乱码
先放上相关代码:
@Test
public void doPostWithParam() throws Exception {
// 创建一个httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建一个post对象
HttpPost post = new HttpPost("http://localhost:8083/httpclient/postparm.action");
// 创建一个entity,模拟一个表单
List<NameValuePair> kvList = new ArrayList<>();
kvList.add(new BasicNameValuePair("name", "小王"));
kvList.add(new BasicNameValuePair("pwd", "123456"));
// 包装成一个Entity对象
StringEntity entity = new UrlEncodedFormEntity(kvList, "utf-8");
// 设置请求的内容
post.setEntity(entity);
// 执行请求
CloseableHttpResponse response = httpClient.execute(post);
// 得到结果
int statusCode = response.getStatusLine().getStatusCode();
Log.info("status = " + statusCode);
HttpEntity resEntity = response.getEntity();
String str = EntityUtils.toString(resEntity);
Log.info("str = " + str);
// 关闭httpclient
response.close();
httpClient.close();
}
尝试着去掉后再次请求:
可以得知由于在构造 entity 时已经指定了 utf-8 格式,故接收方拿到的数据不会乱码
3.2 解决请求方获取到响应的数据为乱码
我们可以猜测,是由于响应的数据字符集不是 utf-8 导致的。可以通过 @RequestMapping 中的 produces 属性解决
@RequestMapping(value = "/httpclient/postparm", produces = MediaType.APPLICATION_JSON_VALUE+";charset=utf-8")
@ResponseBody
public String testPostParm(String name, String pwd) {
Log.info("testPost Parmname = " + name);
Log.info("testPostParm pwd = " + pwd);
return "{username:" + name + ",pwd:" + pwd +"}";
}
重启服务后再次访问,问题解决了