当我们服务消费者去调用服务提供者提供的服务的时候,使用了一个极其方便的对象RestTemplate
,我们通常使用RestTemplate
中最简单的一个功能getForObject
发起了一个get请求去调用服务端的数据,同时,我们还通过配置@LoadBalanced
注解开启客户端负载均衡,RestTemplate
的功能非常强大, 接下来我们就来详细的看一下RestTemplate
中几种常见请求方法的使用,在日常操作中,基于Rest的方式通常是四种情况,它们分别是:
- GET 请求 --查询数据
- POST 请求 –添加数据
- PUT 请求 – 修改数据
- DELETE 请求 –删除数据
下面我们逐一解读;
- RestTemplate 的 GET 请求
Get 请求可以有两种方式:
第一种:getForEntity
该方法返回一个 ResponseEntity<T>
对象,ResponseEntity<T>
是 Spring
对 HTTP
请求响应的封装,包括了几个重要的元素,比如响应码、contentType
、 contentLength
、响应消息体等;
ResponseEntity<String> responseEntity =restTemplate.getForEntity(
"http://29-SPRINGCLOUD-SERVICE-PROVIDER/service/hello", String.class);
String body =responseEntity.getBody();
HttpStatus statusCode =responseEntity.getStatusCode();
int statusCodeValue =responseEntity.getStatusCodeValue();
HttpHeaders headers =responseEntity.getHeaders();
System.out.println(body);
System.out.println(statusCode);
System.out.println(statusCodeValue);
System.out.println(headers);
以上代码:
getForEntity
方法第一个参数为要调用的服务的地址,即服务提供者提供的
http://29-SPRINGCLOUD-SERVICE-PROVIDER/service/hello
接口地址,注意这里是通过服务名调用而不是服务地址,如果改为服务地址就无法使用 Ribbon 实现客户端负载均衡了;
getForEntity方法第二个参数String.class
表示希望返回的body
类型是 String
类型,如果希望返回一个对象,也是可以的,比如User
对象;
另外两个重载方法:
public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables) throws RestClientException
比如:
restTemplate.getForEntity("http://01-SPRINGCLOUD-SERVICE-PROVIDER/service/hello?id= {1}&name={2}", String.class, "{1, '张无忌'}").getBody();
public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException
比如:
Map<String, Object> paramMap =new ConcurrentHashMap<>();
paramMap.put("id", 1);
paramMap.
put("name", "张无忌");
restTemplate.getForEntity("http://01-SPRINGCLOUD-SERVICE-PROVIDER/service/hello?id= {id}&name={name}", String.class, paramMap).getBody();
第二种:getForObject()与 getForEntity 使用类似,只不过getForObject是在getForEntity基础上进行了再次封装,可以将http的响应体body信息转化成指定的对象,方便我们的代码开发;
当你不需要返回响应中的其他信息,只需要body体信息的时候,可以使用这个更方便;
它也有两个重载的方法,和 getForEntity 相似;
<T> T getForObject(URI url, Class<T> responseType) throws RestClientException;
<T> T getForObject(String url, Class<T> responseType, Object... uriVariables) throws RestClientException;
<T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException;
RestTemplate 的 POST 请求:
Post 与 Get 请求非常类似:
restTemplate.postForObject()
restTemplate.postForEntity()
restTemplate.postForLocation()
RestTemplate 的 PUT 请求:
restTemplate.put();
RestTemplate 的 DELETE 请求:
restTemplate.delete();