RestTemplate学习使用

部分学习自转载来源
另一个来自笔者暂时看不懂但觉得很牛逼的网页后来看懂一点点
此链接的拦截器简单易懂一点

RestTemplate
  1. api api地址
  2. 使用步骤
    • 生成RestTemplate对象
      RestTemplate restTemplate = new RestTemplate();
      
    • 调用方法访问接口(例如get接口的getForObject3种方法)
      public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables){}
      public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables)
      public <T> T getForObject(URI url, Class<T> responseType)
      
      String requestPathUrl="http://localhost:8080/get";
      Map<String, ?> uriVariables =new HashMap<>();
      uriVariables.put("id",1);
      List response = restTemplate.getForObject(requestPathUrl, List.class);
      Object o=restTemplate.getForObject("http://localhost:8080/get/{id}",Object.class,"1");
      Object o=restTemplate.getForObject("http://localhost:8080/get/{id}",Object.class,uriVariables);
      
    • 调用方法访问接口(例如get接口的getForEntity3种方法)
      public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables){}
      public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables){}
      public <T> ResponseEntity<T> getForEntity(URI url, Class<T> responseType){}
      
      Map<String, ?> uriVariables =new HashMap<>();
      uriVariables.put("id",1);
      ResponseEntity<Student> s = restTemplate.getForEntity("http://localhost:8080/get/{id}",Student.class,"1");
      ResponseEntity<Student> s = restTemplate.getForEntity("http://localhost:8080/get/{id}",Student.class,uriVariables);
      
    • 调用方法访问接口(例如post接口的postForEntity3种方法)
      public <T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables)
          throws RestClientException {}
      public <T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables)
          throws RestClientException {}
      public <T> T postForObject(URI url, @Nullable Object request, Class<T> responseType) throws RestClientException {}
      
    • 通过post提交表单数据
      //        post方式提交表单数据
          final String posturi = "http://localhost:8080/post";
          MultiValueMap<String,Object> map= new LinkedMultiValueMap<String,Object>();
          map.add("name","dc");
          map.add("age",13);
          map.add("score",78);
          HttpHeaders headers = new HttpHeaders();
          headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
          HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<MultiValueMap<String, Object>>(map, headers);
          return restTemplate.postForEntity(posturi, request,String.class);
      
    • put和delete方法
       restTemplate.put(posturi,s,params);
       restTemplate.delete ( uri,  params );
      
    • 使用exchange进行访问的例子
      RestTemplate restTemplate = new RestTemplate();
      String url = "http://xxx.top/notice/list";
      HttpHeaders headers = new HttpHeaders();
      headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
      JSONObject jsonObj = new JSONObject();
      jsonObj.put("start",1);
      jsonObj.put("page",5);
      HttpEntity<String> entity = new HttpEntity<>(jsonObj.toString(), headers);
      ResponseEntity<JSONObject> exchange = restTemplate.exchange(url,
                                        HttpMethod.GET, entity, JSONObject.class);
      System.out.println(exchange.getBody());
      
    • 使用execute提交格式请求,execute为所有请求的底层请求
      execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables);
      
页顶网页拓展知识
  • resttemplate的初始化
    @Bean
      	public RestTemplate restTemplate() {
            SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
            requestFactory.setConnectTimeout(100000);
            requestFactory.setReadTimeout(100000);
            RestTemplate restTemplate = new RestTemplate(requestFactory);
            ClientHttpRequestInterceptor ri = new LoggingClientHttpRequestInterceptor();
            List<ClientHttpRequestInterceptor> ris = new ArrayList<ClientHttpRequestInterceptor>();
            ris.add(ri);
            restTemplate.setInterceptors(ris);
            return restTemplate;
        }
    
    解析:新生成一个requestFactory工厂,设置好工厂参数,然后生成RestTemplate,
    生成自己的拦截器,将拦截器加入拦截器列表,
    同时将之设置为resttemplate 的拦截器,然后返回resttemplate
  • 拦截器生成
    public class LoggingClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {
        private static Logger log = LoggerFactory
                .getLogger(LoggingClientHttpRequestInterceptor.class);
    
        @Override
        public ClientHttpResponse intercept(HttpRequest httpRequest, byte[] body, ClientHttpRequestExecution execution) throws IOException {
            traceRequest(httpRequest,body);
            ClientHttpResponse response = execution.execute(httpRequest, body);
            traceResponse(response);
            return response;
        }
    
        private void traceRequest(HttpRequest request, byte[] body) {
            try {
                log.debug(
                        "Request URI:{}, Request Body:{}",
                        request.getURI(), new String(body, "UTF-8"));
                // log.info("===========================request begin================================================");
                // log.info("request URI         : {}", request.getURI());
                // log.info("request Method      : {}", request.getMethod());
                // log.info("request Headers     : {}", request.getHeaders() );
                // log.info("request Request body: {}", new String(body, "UTF-8"));
                // log.info("==========================request end================================================");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        private void traceResponse(ClientHttpResponse response) throws IOException {
            StringBuilder inputStringBuilder = new StringBuilder();
            try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getBody(), "UTF-8"))) {
                String line = bufferedReader.readLine();
                while (line != null) {
                    inputStringBuilder.append(line);
                    inputStringBuilder.append('\n');
                    line = bufferedReader.readLine();
                }
            }
            log.debug("============================response begin==========================================");
            log.debug("Status code  : {}", response.getStatusCode());
            log.debug("Status text  : {}", response.getStatusText());
            log.debug("Headers      : {}", response.getHeaders());
            log.debug("Response body: {}", inputStringBuilder.toString());//WARNING: comment out in production to improve performance
            log.debug("=======================response end=================================================");
        }
    }
    
    解析:继承拦截器,并重写拦截器方法,将之写入日志信息
个人易错tips
  • 表单数据或者对象数据一定要搞清楚,提交方式区别很大
  • 接受数据的类型也要搞清楚,不然会报接受数据错误
  • 如果不是很需要的话,可以直接写resttemplate,不需要拦截器什么的,笔者一开始学都懵了唉
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring RestTemplate是Spring框架中的一个重要组件,用于简化HTTP请求的发送。使用RestTemplate可以实现对RESTful Web服务的访问,支持GET、POST、PUT、DELETE等常见的HTTP请求方法。 下面是Spring RestTemplate的一些基本使用方法: 1. 创建RestTemplate实例: ```java RestTemplate restTemplate = new RestTemplate(); ``` 2. 发送GET请求: ```java String url = "http://example.com/users/{userId}"; ResponseEntity<User> response = restTemplate.getForEntity(url, User.class, userId); ``` 3. 发送POST请求: ```java String url = "http://example.com/users"; User user = new User(); ResponseEntity<User> response = restTemplate.postForEntity(url, user, User.class); ``` 4. 发送PUT请求: ```java String url = "http://example.com/users/{userId}"; User user = new User(); restTemplate.put(url, user, userId); ``` 5. 发送DELETE请求: ```java String url = "http://example.com/users/{userId}"; restTemplate.delete(url, userId); ``` RestTemplate还有很多其他的方法,更详细的使用方法可以参考Spring官方文档。 ### 回答2: Spring RestTemplate是Spring框架提供的用于处理RESTful请求的模板类。它封装了底层的HTTP通信细节,提供了简化的API,使得开发者可以更方便地发送HTTP请求和接收响应。 在使用RestTemplate之前,我们首先需要在项目的依赖中引入Spring的web模块,因为RestTemplate是web模块的一部分。 使用RestTemplate发送HTTP请求的步骤如下: 1. 创建一个RestTemplate对象。可以直接通过new关键字创建,也可以通过Spring的依赖注入方式获取。 2. 选择合适的请求方法,并设置请求的URL和请求参数。RestTemplate提供了多种请求方法,如GET、POST等。我们可以通过参数的形式传递URL,并可以使用Map或对象封装请求参数。 3. 发送请求,并接收响应。可以调用RestTemplate的exchange()方法来发送请求,并通过ResponseEntity来接收响应。exchange方法可以指定请求方法、URL、请求体、请求头等信息,并可以通过参数化类型来指定响应的类型。 4. 解析响应。根据实际需要,我们可以使用ResponseEntity的getBody()方法获取响应的主体内容,并进行进一步的解析。 需要注意的是,使用RestTemplate发送请求时,我们可以自己编写请求头、请求体等信息,也可以通过使用RestTemplate提供的辅助方法来简化请求的构建。此外,RestTemplate还提供了异常处理和重试机制,可以更好地处理异常情况。 总的来说,Spring RestTemplate提供了简洁易用的API,帮助我们快速发送HTTP请求和处理响应,节省了开发时间和精力。它是Spring框架中非常重要的一部分,值得开发者深入学习和掌握。 ### 回答3: Spring RestTemplate是Spring框架中的一个HTTP访问客户端工具,它可以方便地进行HTTP请求的发送和响应的处理。 在使用RestTemplate之前,首先需要引入相关的依赖。在Maven项目中,可以通过在pom.xml文件中添加以下依赖来使用RestTemplate: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 引入依赖后,可以通过如下方式创建一个RestTemplate对象: ``` RestTemplate restTemplate = new RestTemplate(); ``` 之后就可以使用RestTemplate对象来发送HTTP请求了。RestTemplate提供了多种发送请求的方法,例如getForObject()、postForObject()等。 使用getForObject()方法发送GET请求并接收响应: ``` String url = "http://api.example.com/data"; String response = restTemplate.getForObject(url, String.class); ``` 使用postForObject()方法发送POST请求并接收响应: ``` String url = "http://api.example.com/data"; String requestBody = "param1=value1&param2=value2"; String response = restTemplate.postForObject(url, requestBody, String.class); ``` RestTemplate还提供了其他一些方法,例如exchange()方法可以发送更复杂的请求,并接收带有响应头和状态码等信息的响应对象。 在使用RestTemplate发送请求时,可以通过设置请求头、请求体、URI参数等来定制请求。可以通过如下方式来设置请求头: ``` HttpHeaders headers = new HttpHeaders(); headers.set("Authorization", "Bearer token"); HttpEntity<String> requestEntity = new HttpEntity<>(headers); ``` 可以通过如下方式来设置请求体: ``` MultiValueMap<String, String> requestBody = new LinkedMultiValueMap<>(); requestBody.add("param1", "value1"); requestBody.add("param2", "value2"); HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(requestBody); ``` 可以通过如下方式来设置URI参数: ``` String url = "http://api.example.com/data?param1={param1}&param2={param2}"; Map<String, String> uriVariables = new HashMap<>(); uriVariables.put("param1", "value1"); uriVariables.put("param2", "value2"); String response = restTemplate.getForObject(url, String.class, uriVariables); ``` 总结来说,Spring RestTemplate是一个用于发送和处理HTTP请求的方便工具,通过引入相关依赖并创建RestTemplate对象,可以使用它发送不同类型的HTTP请求,并对响应进行处理。通过设置请求头、请求体、URI参数等,可以对请求进行定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值