• RestTemplat


    简介

    RestTemplat是Spring3.0开始提供的http请求的工具,提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率,RestTemplate 是一个同步的 Rest API 客户端;

    创建RestTemplat

    通过SimpleClientHttpRequestFactory工厂统一设置连接超时时间和读超时时间、代理等信息,然后创建RestTemplate的Bean;
    还可以通过SimpleClientHttpRequestFactory工厂配置http请求连接数,忽略ssl证书等;

    @Configuration
    public class RestTemplateConfig {
    
        @Bean
        public RestTemplate restTemplate(ClientHttpRequestFactory simpleClientHttpRequestFactory) {
            return new RestTemplate(simpleClientHttpRequestFactory);
        }
    
        @Bean
        public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
            SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
            factory.setReadTimeout(10000);//单位为ms
            factory.setConnectTimeout(10000);//单位为ms
            //factory.setProxy(null);//设置代理
            return factory;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    请求方式和对应的方法

    常规请求调用方法

    http method对应方法
    postpostForEntity和postForObject
    getgetForEntity和getForObject
    putput
    deletedelete
    HeadheadForHeaders
    optionsoptionsForAllow
    optionsoptionsForAllow

    通用调用方法

    1:exchange:可以自己设置http method、headers、url,传入RequestEntity,返回ResponseEntity
    2:execute:通过callback,对请求和返回更好的控制;但是不常用

    设置请求参数

    JSONObject jsonObject = new JSONObject();
    jsonObject.put("payOrderNo", payOrderNo);
    jsonObject.put("refundNo", refundNo);
    jsonObject.put("refundAmount", refundAmount.multiply(new BigDecimal(100)));
    jsonObject.put("refundReason", refundReason);
    HttpEntity httpEntity= new HttpEntity<>(jsonObject);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    设置header

     HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
    headers.add("X-App-Id", appId);
    headers.add("X-Time-Stamp", map.get("X-Time-Stamp"));
     HttpEntity requestParam = new HttpEntity<>(jsonObject, headers);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    请求

    //post请求返回ResponseEntity
     ResponseEntity responseEntity = restTemplate.postForEntity(url, httpEntity, JSONObject.class);
     //post请求返回指定的类型
    JSONObject responseEntity = restTemplate.postForObject(urls, httpEntity, JSONObject.class);
    //get请求返回ResponseEntity
    ResponseEntity responseEntity = restTemplate.getForEntity(urls, JSONObject.class);
     //get请求返回指定的类型
    JSONObject responseEntity = restTemplate.getForObject(urls, JSONObject.class);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    exchange

    ResponseEntity responseEntity = restTemplate.exchange(url,HttpMethod.POST,httpEntity, JSONObject.class);
    
    • 1

    拦截器配置

    首先创建拦截器类并实现ClientHttpRequestInterceptor 接口

    @Slf4j
    public class HTTPInterceptor implements ClientHttpRequestInterceptor {
        @Override
        public ClientHttpResponse intercept(HttpRequest httpRequest, byte[] bytes, ClientHttpRequestExecution clientHttpRequestExecution) throws IOException {
            log.info("执行拦截器拦截请求{}",httpRequest.getURI());
            return clientHttpRequestExecution.execute(httpRequest,bytes);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在RestTemplate创建bean的时候添加拦截器

        @Bean
        public RestTemplate restTemplate(ClientHttpRequestFactory simpleClientHttpRequestFactory) {
            RestTemplate restTemplate= new RestTemplate(simpleClientHttpRequestFactory);
            List list=new ArrayList<>();
            list.add(new HTTPInterceptor());
            restTemplate.setInterceptors(list);
            return restTemplate;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这样客户端在发起http请求的时候就会执行拦截器

    通过 RestTemplate,我们可以非常方便的进行 Rest API 调用。但是在 Spring 5 中已经不再建议使用 RestTemplate,而是建议使用 WebClient。WebClient 是一个支持异步调用的 Client。

  • 相关阅读:
    论文阅读(12) 与其他后生动物相比,水母被动能量的重新获取有助于推进优势(2013)
    硬吃一个P0故障,「在线业务」应该如何调优HBase参数?
    算法练习1——合并两个有序数组
    MasaFramework -- 缓存入门与设计
    CTFHUB-WEB-WEB前置技能-HTTP协议-302跳转
    家电管理系统_家电进销系统(完整版,附带源码可以运行,可以商用)
    golang操作Kafka
    Web前端:JavaScript-->流程控制语句*笔记
    支持流畅运行win10的最低配置是什么
    网络安全工作的随想
  • 原文地址:https://blog.csdn.net/u010833154/article/details/126858298