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(); }
分类:
SpringCloud
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~