restTemplate之exchange调用

该博客主要介绍了如何在Spring中配置RestTemplate,包括设置超时时间和编码,并提供了通用的HTTP请求方法,如携带JSON和Form表单的请求。通过HttpUtils类进行封装,方便进行RPC远程调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

restTemplate配置

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory){
        RestTemplate restTemplate = new RestTemplate(factory);
        // 支持中文编码
        restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(Charset.forName("UTF-8")));
        return restTemplate;
    }

    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setReadTimeout(60000);//单位为ms
        factory.setConnectTimeout(60000);//单位为ms
        return factory;
    }

}

封装调用

@Component
public class HttpUtils {

    private static Logger logger = LoggerFactory.getLogger(HttpUtils.class);

    @Autowired
    private RestTemplate restTemplate;

    private static HttpUtils httpUtil;

    @PostConstruct
    public void init(){
        httpUtil = this;
        httpUtil.restTemplate = this.restTemplate;
    }

    /**
     * 携带json请求体的请求
     * @return
     */
    public static String jsonRequest(String url, HttpMethod method, HttpHeaders headers, Map<String, Object> requestBody){
        try{
            if (headers == null){
                headers = new HttpHeaders();
            }
            headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
            // 封装请求头和请求体,注意json一定要转化未String,否则有可能出现调用失败问题
            HttpEntity entity = new HttpEntity<>(JSON.toJSONString(requestBody), headers);
            logger.info(String.format("RPC远程调用-入参, url: %s, method: %s, entity: %s",url, method.name(), JSON.toJSONString(entity)));
            ResponseEntity<String> result = httpUtil.restTemplate.exchange(url, method, entity, String.class);
            logger.info(String.format("RPC远程调用-出参, url: %s, method: %s, result: %s",url, method.name(),result.getBody()));
            return result.getBody();
        }catch (Exception e){
            logger.error(String.format("RPC远程调用-异常, 异常信息: %s",e.getMessage()));
        }
        return StringUtils.EMPTY;
    }

    /**
     * 携带json数组的请求
     */
    public static <T> String jsonRequest(String url, HttpMethod method, HttpHeaders headers, List<T> list){
        try{
            if (headers == null){
                headers = new HttpHeaders();
            }
            headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
            // 封装请求头和请求体,注意json一定要转化未String,否则有可能出现调用失败问题
            HttpEntity entity = new HttpEntity<>(JSON.toJSONString(list), headers);
            logger.info(String.format("RPC远程调用-入参, url: %s, method: %s, entity: %s",url, method.name(), JSON.toJSONString(entity)));
            ResponseEntity<String> result = httpUtil.restTemplate.exchange(url, method, entity, String.class);
            logger.info(String.format("RPC远程调用-出参, url: %s, method: %s, result: %s",url, method.name(),result.getBody()));
            return result.getBody();
        }catch (Exception e){
            logger.error(String.format("RPC远程调用-异常, 异常信息: %s",e.getMessage()));
        }
        return StringUtils.EMPTY;
    }

    /**
     * 携带form表单请求
     * @params url 如:http://ip:port/path1/path2?key1={value1}&key2={value2}
     * @params params 如:{value1:"xxx", value2:"xxx"}
     */
    public static String formRequest(String url,HttpMethod method, HttpHeaders headers, Map<String, Object> params){
        try{
            if (headers == null){
                headers = new HttpHeaders();
            }
            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
            // 封装请求头和请求体
            HttpEntity entity = new HttpEntity<>(null, headers);
            logger.info(String.format("RPC远程调用-入参, url: %s, entity: %s, params: %s",url, JSON.toJSONString(entity), JSON.toJSONString(params)));
            ResponseEntity<String> result = httpUtil.restTemplate.exchange(url,method,entity,String.class,params);
            logger.info(String.format("RPC远程调用-出参, url: %s, entity: %s, params: %s, result: %s",url, JSON.toJSONString(entity),JSON.toJSONString(params), result.getBody()));
            return result.getBody();
			/**
			*URI uri = UriComponentsBuilder.fromHttpUrl("http://ip:port/path1/path2")
			    .queryParam("param1", param1)
			    .queryParam("param2", param2)
			    .build()
			    .toUri();
			    ResponseEntity<String> response = restTemplate.exchange(uri, HttpMethod.GET, null, String.class);
			*/
        }catch (Exception e){
            logger.error(String.format("RPC远程调用-异常, 异常信息: %s",e.getMessage()));
        }
        return StringUtils.EMPTY;
    }



}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值