RestTemplate 用法总结

发布时间 2023-10-20 16:08:26作者: 月落天白,船动莲开

一、RestTemplate是什么?

      如果某个服务想获取其他服务的数据的时候,一般会用到RestTemplate,这是一种HTTP请求调用的工具

二、如何使用?

     通常情况下,服务与服务之间数据的获取并不是一次性的,所以我们把这个RestTemplate注入容器中,这样我们每次使用直接调用即可。

@Configuration
public class ApplicationContextBean {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

在需要的地方直接注入

@Autowired
private RestTemplate restTemplate;

那么注入完成之后,应该怎么使用呢?

@GetMapping("/getTest")
public String getTest(String name) {
    return name+"要被调用了!";
}

假如现在是想从上述服务中获取到输出的结果,那么我们便能使用RestTemplate里面的getForEntity来获取参数,具体如下面所示:

@GetMapping("/test")
public void test() throws UnsupportedEncodingException {
    //首先我们要能传入刚刚的地址参数url
    String url = "http://127.0.0.1:8080/getTest?name={name}";

    Map<String, Object> paramMap = new HashMap<String, Object>();
    paramMap.put("name", "服务A");
 

    // 这块的String.class就是ResponseEntity当中的body要序列化成的java对象类型
    ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class, "aaa");
// 获取请求状态参数 System.out.println(responseEntity.getStatusCode());
// 获取我们需要的请求体 System.out.println(responseEntity.getBody());
// 获取请求头参数 System.out.println(responseEntity.getHeaders()); }

我们便能得到:

“服务A要被调用了”

 

如果发送的请求请求头携带数据哪有该怎么处理呢?

@PostMapping("/postTest")
public User test2(HttpServletRequest request, @RequestBody User user) {// 正常情况我们是需要通过拦截器来拦截request获取请求头当中的token来进行认证,这块只是演示
    System.out.println("接受的请求头:" + request.getHeader("token"));
    User user = new User();
    user.setId(1);
    user.setName("李四");
    user.setSex("男性");
    return user;
}

然后我们在另一个服务中调用

@GetMapping("/hello")
public User hello5() {
    String url = "http://127.0.0.1:8080/postTest";

    // 请求体
    User user = new User();
    // 请求头(这里有一点需要注意,HttpHeaders和HttpEntity都是引入的spring的包)
    HttpHeaders headers = new HttpHeaders();
    headers.add("token", "11111111");
    // 请求
    HttpEntity<User> requst = new HttpEntity<>(user, headers);

    ResponseEntity<User> responseEntity = restTemplate.postForEntity(url, requst, User.class);
    System.out.println("响应的结果:" + responseEntity.getBody());

    return responseEntity1.getBody();
}

 

然后我们便能得到请求头的数据“11111111”,如果此时访问的是正常流程,我们便能够从过滤器中拿到想要的数据token,然后再决定是否执行下一步。