SpringBoot:基于RestTemplate的请求基础操作

最近项目中的一个系统需要请求外部系统接口获取数据,由于觉得之前的HttpURLConnectionHttpClient两个方法用起来不是太顺手,为了简单易懂的上手,就选择使用springboot自带封装的RestTemplate。下面是关于使用的三个方面:

  1. springboot中的使用
    首先我们在自己的项目中定义一个配置类,将RestTemplate容器注入到系统中:
 @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {

        RestTemplate restTemplate = new RestTemplate(factory);

    return restTemplate;

    }


    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
        SimpleClientHttpRequestFactory factory=new SimpleClientHttpRequestFactory();
        factory.setConnectTimeout(5000);
        factory.setReadTimeout(5000);
        return factory;
    }

使用的方法大家可以参考官方的,有get post 或者是使用exchange:

HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(params, headers);
        String result = restTemplates.postForObject("url", httpEntity, String.class);
  1. 解决响应体中文乱码问题
    在正常的使用过程中发现,请求响应的报文体中的中文信息是乱码,这是由于原有的String是ISO-8859-1编码,所以要想解决中文乱码问题,我们需要对上面的代码做调整:
@Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
    RestTemplate restTemplate = new RestTemplate(factory);
        List<HttpMessageConverter<?>>messageConverters =
                restTemplate.getMessageConverters();
        Iterator<HttpMessageConverter<?>> iterator=messageConverters.iterator();
        while(iterator.hasNext()){
            HttpMessageConverter<?> converter=iterator.next();
            //原有的String是ISO-8859-1编码 去掉
            if(converter instanceof StringHttpMessageConverter){
                iterator.remove();
            }
         }
        messageConverters.add(new StringHttpMessageConverter(Charset.forName("utf-8")));
        return restTemplate;

    }
  1. 发送x-www-form-urlencoded格式请求
    由于请求的接口只能使用x-www-form-urlencoded格式,但是正常使用RestTemplate的post方法的话是无法进行参数传输的,这里我们需要进行一定的调整:

首先我们要使用MultiValueMap的参数类型

// 设置请求参数
        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            if (!StringUtils.isEmpty(entry.getValue())) {
                params.add(entry.getKey(),entry.getValue().toString());
            }
        }
        //组装
        HttpEntity<MultiValueMap<String,String>> request = new HttpEntity<>(params, headers);

其次需要在请求头中添加相应的请求格式:

HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

你可能感兴趣的:(Java,java,spring,boot,resttemplate)