您的位置:首页 > 其它

restTemplate使用及中文乱码问题

2016-09-17 18:24 731 查看
restTemplate是spring提供的一个发送http请求的工具,我们知道spring里面有httpclient实现http请求,但是httpclient的使用相对繁琐,restTemplate使用就方便多了,而且restTemplate能将返回结果自动映射到bean中,不需要我们自己处理。不过在使用的时候遇到了中文乱码问题,我们知道http发送post请求时是以表单方式提交请求参数,而restTemplate中表单内string的编码方式默认是ISO-8859-1编码,可以查看StringHttpMessageConverter的源码,不过FormHttpMessageConverter是默认utf-8编码,这就意味着我们向表单中添加String类型参数时便会遇到中文乱码。我这里提供的是不需要改配置文件,使用代码解决中文问题的方法,包括对restTemplate的一个封装,

public <T> T restTemplate(String url, Map<String,T> params, Class<T> var, HttpMethod method) {
RestTemplate restTemplate = new RestTemplate();
FormHttpMessageConverter fc = new FormHttpMessageConverter();
StringHttpMessageConverter s = new StringHttpMessageConverter(StandardCharsets.UTF_8);
List<HttpMessageConverter<?>> partConverters = new ArrayList<HttpMessageConverter<?>>();
partConverters.add(s);
partConverters.add(new ResourceHttpMessageConverter());
fc.setPartConverters(partConverters);
restTemplate.getMessageConverters().addAll(Arrays.asList(fc, new MappingJackson2HttpMessageConverter()));
MultiValueMap<String, T> map = new LinkedMultiValueMap<>();
map.setAll(params);
switch (method) {
case POST:
return restTemplate.postForObject(url, map, var);
case GET:
String getParams = "?" + map.keySet().stream().map(k -> String.format("%s={%s}", k, k)).collect(Collectors.joining("&"));
return restTemplate.getForObject(url + getParams, var, params);
default:
return restTemplate.postForObject(url, map, var);
}
}


所要注意的是get请求要求我们对URL中参数用占位符封装,user/getUser?userId={userId}&fe=
{fe},就像这样,所以我在封装get请求时有一个拼接URL的操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: