美文网首页
RestTemple 使用踩坑记

RestTemple 使用踩坑记

作者: 一个忙来无聊的人 | 来源:发表于2020-02-26 20:05 被阅读0次

一、依赖问题

我用的是 spring 4.0版本

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.0.0.RELEASE</version>
        </dependency>

二、解决 no suitable HttpMessageConverter found for request type 问题

    public static String postRequest(String url, Object request) {
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
        headers.setContentType(type);
        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
        String reqStr = JSONObject.toJSONString(request);
        HttpEntity<String> formEntity = new HttpEntity<>(reqStr, headers);
        return restTemplate.postForObject(url, formEntity, String.class);
    }

重点是以下代码
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
headers.add("Accept", MediaType.APPLICATION_JSON.toString());

三、文件上传并且带参数问题解决

这个问题的解决方式和下面问题在同一组代码中

四、RestTemple post文件上传乱码问题

public static String postFile(String url, File file, String systemCode) {
        RestTemplate restTemplate = new RestTemplate();
        //文件上传处理
        FileSystemResource resource = new FileSystemResource(file);
        MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
        // 设置参数为文件以及设置传递的参数信息
        param.add("file", resource);
        param.add("systemCode", systemCode);
        
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);

        // 解决乱码问题
        List<HttpMessageConverter<?>> cos = new ArrayList<>();
        StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(Charset.forName("utf-8"));
        FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter();
        List<HttpMessageConverter<?>> cos2 = new ArrayList<>();
        cos2.add(stringHttpMessageConverter);
        cos2.add(new ByteArrayHttpMessageConverter());
        cos2.add(new ResourceHttpMessageConverter());
        formHttpMessageConverter.setPartConverters(cos2);
        cos.add(formHttpMessageConverter);
        cos.add(stringHttpMessageConverter);
        restTemplate.setMessageConverters(cos);

        HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(param, headers);
        //远程调用获取请求具体数据信息
        ResponseEntity<String> responseEntity1 = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class);
        return responseEntity1.getBody();
    }

五、其他解决乱码的方式--个人没有起作用

方式一:

RestTemplate restTemplate = new RestTemplate(requestFactory);

// 设置 restTemplate FormHttpMessageConverter 编码方式

List<HttpMessageConverter<?>> list = restTemplate.getMessageConverters();
for (HttpMessageConverter<?> httpMessageConverter : list) {
if(httpMessageConverter instanceof FormHttpMessageConverter) {
((FormHttpMessageConverter) httpMessageConverter).setCharset(Charset.forName(StandardCharsets.UTF_8.toString()));
}
}
restTemplate.setMessageConverters(list);

方式二:设置编码格式为utf8
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));

相关文章

网友评论

      本文标题:RestTemple 使用踩坑记

      本文链接:https://www.haomeiwen.com/subject/rcaichtx.html