美文网首页
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