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