美文网首页
spring boot 项目中配置RestTemplate

spring boot 项目中配置RestTemplate

作者: pilisiyang | 来源:发表于2020-06-12 15:37 被阅读0次

什么是RestTemplate

spring 中提供了用于访问http服务的客户端 RestTemplate,用来代替Apache HttpClient,使用方式简单直接,
可以使用 HttpMessageConverter 转换JSON数据,默认依赖jdk的HTTP连接工具,也可以使用Apache HttpComponents、Netty和OkHttp。

方法

  • getForObject
  • getForEntity
  • headForHeaders
  • postForLocation
  • postForObject
  • postForEntity
  • put
  • delete
  • patchForObject
  • optionsForAllow
  • exchange
  • execute

配置 RestTemplateConfig

可以使用默认构造方法new一个实例,假如默认配置不满足条件,就需要自己设置config

/**
 * restTemplate 的工厂类
 *
 * @author plsy
 */
@Configuration
public class RestTemplateConfig {

    @Bean
    @ConditionalOnMissingBean({RestOperations.class, RestTemplate.class})
    public RestTemplate restTemplate() {
        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
        requestFactory.setReadTimeout(5000);
        requestFactory.setConnectTimeout(5000);

        RestTemplate restTemplate = new RestTemplate(requestFactory);
        // 使用 utf-8 编码集的
        restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
        //设置基础验证拦截器
        restTemplate.setInterceptors(Collections.singletonList(new AuthorizationInterceptor()));

        return restTemplate;
    }

}

指定转换器 HttpMessageConverter

一般通过reseful接口传递的数据内容都是json串,而通过RestTemplate的getForObject方法却可以直接获取JavaBean,这里就是因为RestTemplate通过HttpMessageConverter自动帮我们做了转换的操作。

默认情况下RestTemplate会自动帮我们注册一组HttpMessageConverter,如源码所示:
       /**
        * Create a new instance of the {@link RestTemplate} using default settings.
        * Default {@link HttpMessageConverter}s are initialized.
        */
       public RestTemplate() {
           this.messageConverters.add(new ByteArrayHttpMessageConverter());
           this.messageConverters.add(new StringHttpMessageConverter());
           this.messageConverters.add(new ResourceHttpMessageConverter());
           this.messageConverters.add(new SourceHttpMessageConverter<Source>());
           this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
   
           if (romePresent) {
               this.messageConverters.add(new AtomFeedHttpMessageConverter());
               this.messageConverters.add(new RssChannelHttpMessageConverter());
           }
   
           if (jackson2XmlPresent) {
               this.messageConverters.add(new MappingJackson2XmlHttpMessageConverter());
           }
           else if (jaxb2Present) {
               this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
           }
   
           if (jackson2Present) {
               this.messageConverters.add(new MappingJackson2HttpMessageConverter());
           }
           else if (gsonPresent) {
               this.messageConverters.add(new GsonHttpMessageConverter());
           }
       }

设置拦截器 ClientHttpRequestInterceptor

有时候需要对请求做一些通用拦截设置,这就可以使用拦截器进行处理。
拦截器需要我们实现org.springframework.http.client.ClientHttpRequestInterceptor接口。
下面是设置基础验证拦截器的代码:
/**
 * RestTemplate的基础验证拦截器
 *
 * @author plsy
 */
public class AuthorizationInterceptor implements ClientHttpRequestInterceptor {

    private String username = "xxx";

    private String password = "xxxxxx";

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        HttpHeaders headers = request.getHeaders();
        String plainCreds = username + ":" + password;
        String base64Creds = new String(Base64.encodeBase64(plainCreds.getBytes()));
        headers.add(HttpHeaders.AUTHORIZATION, "Basic " + base64Creds);
        return execution.execute(request, body);
    }
}

相关文章

网友评论

      本文标题:spring boot 项目中配置RestTemplate

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