SpringCloud实战之RestTemplate
RestTemplate不仅在SpringCloud中会使用,一般在服务之间相互调用的时候会使用此类。上一篇介绍Ribbon的时候通过在此类上面添加 @LoadBalanced 注解开启客户端负载均衡,在当时的案例中我们只使用使用了getForEntity方法,其他的常用方法奖本博文介绍。
使用过Rest的小伙伴都知道,调用服务端接口有四种方式:
方法 | 功能 | 注解 |
---|---|---|
GET | 请求查询数据 | GetMapping |
POST | 请求添加数据 | PostMapping |
PUT | 请求修改数据 | PutMapping |
DELETE | 请求删除数据 | DeleteMapping |
这些请求在RestTemplate中又是如何实现的?
GET请求
RestTemplate提供了两种get请求,分别是getForEntity和getForObject,其中getForObject是对getForEntity的进一步封装。
getForEntity
该方法返回一个 ResponseEntity 对象, ResponseEntity 是 Spring 对
HTTP 请求响应的封装,包括了几个重要的元素, 比如响应码,contentType 、
contentLength 、响应消息体等,RestTemplate中共有三个这样的方法。这里每个方法给出一个案例。
getForEntity(URI url, Class responseType)
两个参数,这里需要注意一下,第一个参数为接口地址(类型为URI,区别于其他两个方法)。第二个参数是返回的消息体(body) 类型,需要从ResponseEntity获取。例如,根据id获取Product:
URI uri = null;
try {
uri = new URI("http://service-product/product/" + id);
} catch (URISyntaxException e) {
e.printStackTrace();
}
ResponseEntity<Product> productEntity = restTemplate.getForEntity(uri,
Product.class);
product = productEntity.getBody();
getForEntity(String url, Class responseType, Object… uriVariables)
三个参数,第一个参数为接口地址(类型为String,区别于第一个方法)。第二个参数是返回的消息体(body) 类型,需要从ResponseEntity获取。第三个参数查询条件,是一个Object数组(也可以分开写)。例如,根据id和价格获取Product:
//注意这里的占位符,需要跟参数的顺序对应上
ResponseEntity<Product> productEntity = restTemplate.getForEntity("http://service-product/product/{1}/{2}",
Product.class, id, price);
product = productEntity.<