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

希望各位伙伴看完能有自己的收获!
注:本篇文章仅个人见解,若有错误,欢迎指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值