一、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,然后再决定是否执行下一步。