微服务架构整理-(七SpringCloud实战之RestTemplate)
Posted 浦江之猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微服务架构整理-(七SpringCloud实战之RestTemplate)相关的知识,希望对你有一定的参考价值。
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.getBody();
getForEntity(String url, Class responseType, Map<String, ?> uriVariables)
三个参数,第一个参数为接口地址(类型为String,区别于第一个方法)。第二个参数是返回的消息体(body) 类型,需要从ResponseEntity获取。第三个参数查询条件,是一个Map(区别于第二个方法)。例如,根据id和价格获取Product:
Map<String, Object> map = new HashMap<>();
map.put("id", id);
map.put("price", price);
//url中使用的是key值
ResponseEntity<Product> productEntity = restTemplate.getForEntity("http://service-product/product/id/price",
Product.class, map);
product = productEntity.getBody();
getForObject
与getForEntity使用类似,它是对getForEntity进行了再次封装,忽略了响应中的其他信息,直接获取body的值 ,方便我们的代码开发; 它也有三个这样的方法,和getForEntity相似。
getForObject(URI url, Class responseType)
两个参数,这里需要注意一下,第一个参数为接口地址(类型为URI,区别于其他两个方法)。第二个参数是返回值类型。例如,根据id获取Product:
URI uri = null;
try
uri = new URI("http://service-product/product/" + id);
catch (URISyntaxException e)
e.printStackTrace();
product = restTemplate.getForObject(uri, Product.class);
getForObject(String url, Class responseType, Object… uriVariables)
三个参数,第一个参数为接口地址(类型为String,区别于第一个方法)。第二个参数是返回值类型。第三个参数查询条件,是一个数组(也可以分开写,也可以不传)。例如,根据id和价格获取Product:
product = restTemplate.getForObject("http://service-product/product/1/2", Product.class, id, price);
getForObject(String url, Class responseType, Map<String, ?> uriVariables)
三个参数,第一个参数为接口地址(类型为String,区别于第一个方法)。第二个参数是返回值类型。第三个参数查询条件,是一个Map(区别于第二个方法)。例如,根据id和价格获取Product:
Map<String, Object> map = new HashMap<>();
map.put("id", id);
map.put("price", price);
//url中使用的是key值
product = restTemplate.getForObject("http://service-product/product/id/price", Product.class, map);
POST请求
RestTemplate提供了三种post请求,分别是postForObject,postForEntity以及postForLocation。
postForEntity
该方法也是返回一个 ResponseEntity 对象, ResponseEntity 是 Spring 对
HTTP 请求响应的封装,包括了几个重要的元素, 比如响应码,contentType 、
contentLength 、响应消息体等,RestTemplate中共有三个这样的方法,每个方法中都会有一个Object request参数,用于传入表单参数,使用时需要用MultiValueMap类型,其他的map不可以。由于使用方法同getForEntity差不多,这里只针对其中的一种方法给出一个案例。
postForEntity(URI url, Object request,Class responseType)
其他的两个参数,第一个参数为接口地址(类型为URI,区别于其他两个方法)。第二个参数是返回的消息体(body) 类型,需要从ResponseEntity获取。例如,添加一个product:
URI uri = null;
try
uri = new URI("http://service-product/product/addProduct");
catch (URISyntaxException e)
e.printStackTrace();
MultiValueMap<String, Object> request = new LinkedMultiValueMap<>();
request.add("name", name);
request.add("price", price);
ResponseEntity<Product> productEntity = restTemplate.postForEntity(uri, request, Product.class);
product = productEntity.getBody();
postForObject
与postForEntity使用类似,它是对postForEntity进行了再次封装,忽略了响应中的其他信息,直接获取body的值 ,方便我们的代码开发; 它也有三个这样的方法,和postForEntity相似。RestTemplate中共有三个这样的方法,每个方法中都会有一个Object request参数,用于传入表单参数,使用时需要用MultiValueMap类型,其他的map不可以。由于使用方法同getForObject差不多,这里只针对其中的一种方法给出一个案例。
postForObject(String url, Object request, Class responseType, Object… uriVariables)
其他的三个参数,一个参数为接口地址(类型为URI,区别于其他两个方法)。一个参数是第二个参数是返回值类型。最后一个参数查询条件,是一个数组(也可以分开写,也可以不传)。例如,添加一个product
MultiValueMap<String, Object> request = new LinkedMultiValueMap<>();
request.add("name", name);
request.add("price", price);
product = restTemplate.postForObject("http://service-product/product/addProduct", request, Product.class);
postForLocation
只有post请求中提供了此方法,其使用与其他的也类似,但需要注意的是其返回值是提交成功后资源的URI 。其他注意事项参考上文中即可。
PUT请求
针对put请求,没有所谓的putForEntity和putForObject方法,RestTemplate提供了三个重载的方法,没有返回值,使用用方法也同get与post类似,这里给出一种案例。
put(URI url, @Nullable Object request)
put(String url, @Nullable Object request, Object… uriVariables)
根据id修改price, 没有通过uriVariable没有传值,请求通过request封装,传入到服务提供者
MultiValueMap<String, Object> request = new LinkedMultiValueMap<>();
request.add("id", id);
request.add("price", price);
restTemplate.put("http://service-product/product/updateProduct", request);
put(String url, @Nullable Object request, Map<String, ?> uriVariables)
DELETE请求
针对delete请求,也没有所谓的deleteForEntity和deleteForObject方法,RestTemplate提供了三个重载的方法,没有返回值,使用用方法也同get与post类似,这里给出一种案例。
delete(URI url)
delete(String url, Object… uriVariables)
根据id删除product
restTemplate.delete("http://service-product/product/deleteProduct/1", id);
delete(String url, Map<String, ?> uriVariables)
总结
关于RestTemplate就介绍到这,总体来说还是比较简单,只要学会了get方法,其他方法都差不多。最后希望本文能帮助大家,祝大家在IT之路上少走弯路,一路绿灯不堵车,测试一性通过,bug秒解!
以上是关于微服务架构整理-(七SpringCloud实战之RestTemplate)的主要内容,如果未能解决你的问题,请参考以下文章
微服务架构整理-(八SpringCloud实战之Hystrix [1])
微服务架构整理-(八SpringCloud实战之Hystrix [1])
微服务架构整理-(十一SpringCloud实战之OpenFeign)
微服务架构整理-(十一SpringCloud实战之OpenFeign)