RestTemplate的简单介绍和使用方法
RestTemplat的简要介绍
在学习微服务时我们经常用到RestTemplate来发送Http请求实现远程调用,RestTemplate发送的请求进行远程调用与语言和技术无关,我们只要知道对方的ip、端口、接口路径、请求参数即可。这么说大家可能不太理解,举个例子大家就明白了,例如A模块(以Java实现)需要远程调用B模块(以Python实现)的数据,我们只需要知道B模块的url通过RestTemplate进行远程调用即可,无需关注B模块使用何种语言实现的,而RestTemplate说到底就是简发起 HTTP 请求以及处理响应的过程。
RestTemplat的语法规则
在这里仅仅展示get请求的发送,其他请求参照get请求即可。
RestTemplat发送get请求的部分源码
@Nullable
//返回对象为响应体中数据转化成的JSON对象
public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables) throws RestClientException {
RequestCallback requestCallback = this.acceptHeaderRequestCallback(responseType);
HttpMessageConverterExtractor<T> responseExtractor = new HttpMessageConverterExtractor(responseType, this.getMessageConverters(), this.logger);
return this.execute(url, HttpMethod.GET, requestCallback, responseExtractor, (Object[])uriVariables);
}
//返回值的封装包含有响应头, 响应状态码的 ResponseEntity 对象
public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables) throws RestClientException {
RequestCallback requestCallback = this.acceptHeaderRequestCallback(responseType);
ResponseExtractor<ResponseEntity<T>> responseExtractor = this.responseEntityExtractor(responseType);
return (ResponseEntity)nonNull(this.execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables));
}
语法规则
Demo demo=restTemplate.getForObject(url, Demo.class);
部分代码实现
首先A数据库中拥有订单表,B数据库中拥有用户表
需求:在查询订单信息时同时查询出用户信息。
查询用户信息的url
UserController.class
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 路径: localhost:8081/user/{id};
* @param id 用户id
* @return 用户信息
*/
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
return userService.queryById(id);
}
}
查询订单信息时,通过调用RestTemplate向用户信息url发送请求,返回用户信息
OrderService.class
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 请求url路径
String url="http://localhost:8081/user/"+order.getUserId();
// 2.利用RestTemplate发送http请求
User user=restTemplate.getForObject(url, User.class);
// 3.将用户信息写入订单信息
order.setUser(user);
// 4.返回
return order;
}
}
查询订单信息的url
OrderService.class
@RestController
@RequestMapping("order")
public class OrderController {
@Autowired
private OrderService orderService;
@GetMapping("{orderId}")
public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
// 根据id查询订单时,同时发出查询用户信息的请求写入到订单信息中并返回
return orderService.queryOrderById(orderId);
}
}
希望各位伙伴看完能有自己的收获!
注:本篇文章仅个人见解,若有错误,欢迎指正!