SpringCloud-Alibaba学习(三):RestTemplate

RestTemplate API

SpringCloud 微服务中可以使用 RestTemplate 发起远程调用,RestTemplate 是 Spring 对HttpClient 的封装,提供了一系列方便易用的 API。

RestTemplate 的 API 基本都见名知意,使用起来很简单,提供了多种 HTTP 请求方法 API 和重载实现。

    // 注入 RestTemplate bean 对象
    @Bean
    @LoadBalanced // 使Ribbon生效
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

crud API 用法简单示例

crud 接口:

@RestController
@RequestMapping("/rest")
public class RestTemplateApiController {

    // 模拟数据库
    private List<GoodsDTO> db = new ArrayList<>();

    // get
    @GetMapping("/goods/{id}")
    public GoodsDTO getById(@PathVariable("id") Long id) {
        return db.stream().filter(e -> e.getId().equals(id)).findFirst().orElse(null);
    }

    @GetMapping("/goods")
    public List<GoodsDTO> list() {
        return db;
    }

    // post
    @PostMapping("/goods")
    public GoodsDTO save(@RequestBody GoodsDTO goodsDTO) {
        db.add(goodsDTO);
        return goodsDTO;
    }

    // put
    @PutMapping("/goods")
    public GoodsDTO update(@RequestBody GoodsDTO goodsDTO) {

        Optional<GoodsDTO> optional = db.stream().filter(e -> e.getId().equals(goodsDTO.getId())).findFirst();
        if (optional.isPresent()) {
            GoodsDTO dto = optional.get();
            dto.setGoodsName(goodsDTO.getGoodsName());
            return dto;
        }
        return null;
    }

    // delete
    @DeleteMapping("/goods/{id}")
    public Boolean delete(@PathVariable("id") Long id) {
        return db.removeIf(e -> e.getId().equals(id));
    }

}

调用:

@RestController
@RequestMapping("/rest")
public class RestTemplateController {
    // 服务名
    private static final String providerServiceName = "nacos-demo-provider";
    // 统一路径
    private static final String providerUrl = "http://%s/nacos-demo-provider/rest";

    private static String getUrl(String path) {
        path = path.startsWith("/") ? path : "/" + path;
        return String.format(providerUrl, providerServiceName) + path;
    }

    private RestTemplate restTemplate;

    public RestTemplateController(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }


    /**
     * 根据id单个查询
     * @param id 查询参数
     * @return 返回单个数据
     */
    @GetMapping("/goods/{id}")
    public HttpResponse<GoodsDTO> getById(@PathVariable("id") Long id) {

        // 响应 ResponseEntity 封装了响应数据和响应头
        ResponseEntity<GoodsDTO> entity = restTemplate.getForEntity(getUrl("/goods/" + id), GoodsDTO.class);
        System.out.println(entity.getHeaders());
        System.out.println(entity.getBody());

        // getForObject 直接返回数据  第一个参数:请求url  第二个参数:响应数据类型
        // url 拼接路径参数
        GoodsDTO object = restTemplate.getForObject(getUrl("/goods/" + id), GoodsDTO.class);
        System.out.println("get " + object);
        return HttpResponse.success(object);
    }

    /**
     * 查询列表
     * @return 返回列表数据
     */
    @GetMapping("/goods")
    public HttpResponse<List<GoodsDTO>> list() {
        // 第一个参数:请求url  第二个参数:响应数据类型
        List list = restTemplate.getForObject(getUrl("/goods"), List.class);
        return HttpResponse.success(list);
    }

    /**
     * 保存
     * @param goodsDTO 参数
     * @return
     */
    @PostMapping("/goods")
    public HttpResponse<GoodsDTO> save(@RequestBody GoodsDTO goodsDTO) {

        ResponseEntity<GoodsDTO> entity = restTemplate.postForEntity(getUrl("/goods"), goodsDTO, GoodsDTO.class);
        System.out.println(entity.getBody());
        System.out.println(entity.getHeaders());

        // 第一个参数:请求url 第二个参数:数据  第二个参数:响应数据类型
        GoodsDTO goods = restTemplate.postForObject(getUrl("/goods"), goodsDTO, GoodsDTO.class);
        return HttpResponse.success(goods);
    }

    /**
     * 根据id修改
     * @param goodsDTO
     * @return
     */
    @PutMapping("/goods")
    public HttpResponse<Void> update(@RequestBody GoodsDTO goodsDTO) {

        // PUT 请求没有返回数据   第一个参数:请求url 第二个参数:数据
        restTemplate.put(getUrl("/goods"), goodsDTO);
        return HttpResponse.success();
    }

    /**
     * 根据id删除
     * @param id
     * @return
     */
    @DeleteMapping("/goods/{id}")
    public HttpResponse<Void> delete(@PathVariable("id") Long id) {

        // DELETE 请求没有响应体   第一个参数:请求url
        restTemplate.delete(getUrl("/goods/" + id));
        return HttpResponse.success();
    }

}

使用restTemplate.exchange,处理带有泛型的响应数据

    /**
     * 处理响应里的泛型数据
     */
    @GetMapping("/test")
    public HttpResponse<Void> test() {

        RequestEntity<Void> requestEntity = RequestEntity.get(URI.create(getUrl("/goods"))).build();

        // 使用 ParameterizedTypeReference 定义泛型参数实际类型
        // ParameterizedTypeReference是抽象类,这里是创建了子类
        ParameterizedTypeReference<List<GoodsDTO>> paramType = new ParameterizedTypeReference<List<GoodsDTO>>(){};

        ResponseEntity<List<GoodsDTO>> responseEntity = restTemplate.exchange(requestEntity, paramType);

        System.out.println(responseEntity);
        System.out.println(responseEntity.getBody());

        return HttpResponse.success();
    }
posted @ 2022-07-01 09:05  originyuan  阅读(341)  评论(0编辑  收藏  举报