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