restTemplate使用及中文乱码问题

来源:互联网 发布:警察 两种人 程序员 编辑:程序博客网 时间:2024/06/07 19:36

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的操作。

0 0
原创粉丝点击