spring下的restTemplate使用
阅读原文时间:2023年07月09日阅读:3

首先上配置,由于restTemplate不支持一些返回格式,所以需要自己手动配置

/**
* @Description : restTemplate配置类
* @Author : wzkris
* @Version : V1.0.0
* @Date : 2022/12/1 10:02
*/
@Configuration
public class RestTemplateConfig {

@Bean  
public RestTemplate restTemplate() {  
    OkHttp3ClientHttpRequestFactory factory = new OkHttp3ClientHttpRequestFactory();  
    factory.setReadTimeout(3000);  
    factory.setConnectTimeout(3000);  
    RestTemplate restTemplate = new RestTemplate(factory);  
    //增强转换器  
    MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();  
    //设置编码  
    jackson2HttpMessageConverter.setDefaultCharset(StandardCharsets.UTF\_8);  
    jackson2HttpMessageConverter.setSupportedMediaTypes(Arrays.asList(  
            MediaType.TEXT\_HTML,  
            MediaType.TEXT\_PLAIN,  
            MediaType.APPLICATION\_OCTET\_STREAM,  
            MediaType.APPLICATION\_JSON,  
            MediaType.MULTIPART\_FORM\_DATA,  
            MediaType.APPLICATION\_XML));  
    setMessageConverter(restTemplate, jackson2HttpMessageConverter);  
    return restTemplate;  
}

/\*\*  
 \* 设置消息转换器  
 \*/  
private void setMessageConverter(RestTemplate restTemplate, MappingJackson2HttpMessageConverter httpMessageConverter) {  
    List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();  
    Iterator<HttpMessageConverter<?>> iterator = messageConverters.iterator();  
    while (iterator.hasNext()) {  
        HttpMessageConverter<?> messageConverter = iterator.next();  
        if (messageConverter instanceof MappingJackson2HttpMessageConverter) {  
            iterator.remove();  
            break;  
        }  
    }  
    messageConverters.add(httpMessageConverter);  
}

}

用法懒得写,是个人都会,举个例子,下面的是我用restTemplate对接微信公众号的上传图片接口,可以看到传递的参数是图片,还需要设置请求头什么的,这个栗子都给出来了用法。

要注意的是,图片参数要用FileSystemResource来设置,而接口上接收文件的是MulltipartFile类型的参数,所以这里就会生成临时的file文件,等上传完毕再删掉即可

/**
* 上传图片素材
*
* @param accessToken token
* @param multipartFile 图片
* @return {
* "url": "http://mmbiz.qpic.cn/mmbiz/gLO17UPRQ/0"
* }
*/
public JSONObject uploadImage(String accessToken, MultipartFile multipartFile) {
String url = "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=" + accessToken;
//设置请求体,注意是LinkedMultiValueMap
MultiValueMap data = new LinkedMultiValueMap<>();
String path = GtConfig.getUploadPath() + multipartFile.getOriginalFilename();
File file = new File(path);
try {
multipartFile.transferTo(file);
} catch (IOException e) {
throw new ServiceException(e.getMessage());
}
FileSystemResource media = new FileSystemResource(file);
//设置上传文件
data.add("media", media);
//上传文件,设置请求头
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
httpHeaders.setContentLength(multipartFile.getSize());
HttpEntity> requestEntity = new HttpEntity<>(data, httpHeaders);
//上传
JSONObject jsonObject = restTemplate.postForObject(url, requestEntity, JSONObject.class);
//然后删除临时文件
file.delete();
return jsonObject;
}

然后测试,查看返回