springboot 客户端请求 RestTemplate 实际

2021-03-23  本文已影响0人  dylan丶QAQ

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


本章主要内容


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

1.使用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对象封装起来,可以提高可读性。

使用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状态码就可以辨别请求是否成功,如果发生了错误,它还可以给出信息反馈错误原因。

    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;
    }

为了更加灵活,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;
    }

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

上一篇下一篇

猜你喜欢

热点阅读