美文网首页
springboot 客户端请求 RestTemplate 实际

springboot 客户端请求 RestTemplate 实际

作者: dylan丶QAQ | 来源:发表于2021-03-23 23:24 被阅读0次

    客户端请求是我们经常要用到的,不论是在自己系统之间的相互调用还是在请求别人的api,RestTemplate都是一种极简的方式,当然前提是使用spring框架。立志工具人。一起干饭!


    本章主要内容

    • 使用RestTemplate请求后端

    • 获取响应头、状态码和资源交换


    RestTemplate底层是通过类HttpURLConnection实现的。RestTemplate简介

    1.使用RestTemplate请求后端

    • 使用Get请求
      通过RestTemplate获取用户信息

    使用postman请求 http://localhost:8080/user/getUser

    package com.dylan.mall.controller;
    
    import com.dylan.mall.component.User;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.client.RestTemplate;
    
    /**
     * @author Administrator
     */
    @Slf4j
    @Controller
    @RequestMapping("/user")
    public class UserRestTestController {
    
    
        @RequestMapping("/{id}")
        @ResponseBody
        public User getById(@PathVariable String id) {
            log.error(id + "");
            User user = new User();
            user.setUserName("dylan");
            user.setAge(18);
    
            return user;
    
        }
    
        @GetMapping("/getUser")
        @ResponseBody
        public User getUser() {
            //创建一个RestTemplate对象
            RestTemplate restTemplate = new RestTemplate();
            int id = 1;
            //消费服务 第一个参数是URL,第二个是返回类型,第三个是URI路径参数
            User user = restTemplate.getForObject("http://localhost:8080/user/{id}", User.class, id);
            log.error(user.getUserName());
            return user;
        }
    }
    
    

    User类:

    package com.dylan.mall.component;
    
    import lombok.Data;
    
    /**
     * @author Administrator
     */
    @Data
    public class User {
        private String userName;
        private Integer age;
    }
    
    

    如果有很多参数,有两种方法,一种是继续写在后面,他是可变参数;第二种方法是使用Map对象封装起来,可以提高可读性。

    • 使用Post请求

    使用postman请求 http://localhost:8080/user/insertTest

    使用Post请求,往往采用请求体的方式(body),需要对请求进行一定的设置才能使请求体的方式来进行Post请求。

        @GetMapping ("/insertTest")
        @ResponseBody
        public User insertUser() {
    
            //测试user数据
            User user = User.builder().userName("法外狂徒张三").age(66).build();
    
            HttpHeaders headers=new HttpHeaders();
            //设置请求内容为JSON类型
            headers.setContentType(MediaType.APPLICATION_JSON);
            //创建请求实体对象
            HttpEntity<User> request = new HttpEntity<>(user, headers);
            RestTemplate restTemplate = new RestTemplate();
            //请求时 传递请求实体对象,并返回回填id的用户
            User user1 = restTemplate.postForObject("http://localhost:8080/user/insert", request, User.class);
            log.error(user1.toString());
            return user1;
        }
    
        @PostMapping ("/insert")
        @ResponseBody
        public User insertUser(User user1) {
    
            User user = new User();
            user.setUserName("dylan");
            user.setAge(18);
    
            return user;
        }
    

    补充:Post请求可设置的请求头

    2.获取响应头、状态码和资源交换

    • 获取服务器响应头属性和HTTP状态码

    有的时候请求不一定能保证成功获取到资源。例如:我们在请求的时候,出现了错误,抛出了异常,这个时候异常会存放到响应头中,并且服务器也会返回相应的状态码。这个时候,获取响应头和HTTP状态码就可以辨别请求是否成功,如果发生了错误,它还可以给出信息反馈错误原因。

        public User insertUserEntity(User user) {
            //请求头
            HttpHeaders headers = new HttpHeaders();
            //请求类型
            headers.setContentType(MediaType.APPLICATION_JSON);
            //绑定请求体和头
            HttpEntity<User> request = new HttpEntity<>(user, headers);
            RestTemplate restTemplate = new RestTemplate();
            //请求服务器
            ResponseEntity<User> userResponseEntity = restTemplate.postForEntity("http://localhost:8080/user/insert", request, User.class);
            
            //获取响应体
            User user1 = userResponseEntity.getBody();
            //获取响应头
            HttpHeaders headers1 = userResponseEntity.getHeaders();
            //获取相应属性
            List<String> success = headers1.get("success");
            //相应的HTTP状态码
            int statusCodeValue = userResponseEntity.getStatusCodeValue();
    
            log.error(user1.getUserName());
            return user1;
        }
    
    • 使用exchange方法

    为了更加灵活,RestTemplate还提供了一个exchange方法,它可以作为资源的交换而使用,可以根据自己的需要定制更多的参数。但是其可读性,并不是很高。

        public User userExchange(User user,Integer id) {
            //请求头
            HttpHeaders headers = new HttpHeaders();
            //请求类型
            headers.setContentType(MediaType.APPLICATION_JSON);
            //绑定请求体和头
            HttpEntity<User> request = new HttpEntity<>(user, headers);
            RestTemplate restTemplate = new RestTemplate();
            String url = "http://localhost:8080/user/insert";
            //请求服务器
            ResponseEntity<User> userResponseEntity = restTemplate.exchange(url, HttpMethod.POST, request, User.class);
    
            //获取响应体
            User user1 = userResponseEntity.getBody();
            //获取响应头
            HttpHeaders headers1 = userResponseEntity.getHeaders();
            //获取相应属性
            List<String> success = headers1.get("success");
            //相应的HTTP状态码
            int statusCodeValue = userResponseEntity.getStatusCodeValue();
            //修改URL获取资源
            url = "http://localhost:8080/user/{id}";
            ResponseEntity<User> userEntity = restTemplate.exchange(url, HttpMethod.GET, null, User.class,id);
            //获取响应体
            User user2 = userEntity.getBody();
            log.error(user2.getUserName());
            return user1;
        }
    

    不要以为每天把功能完成了就行了,这种思想是要不得的,互勉~!

    相关文章

      网友评论

          本文标题:springboot 客户端请求 RestTemplate 实际

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