Spring Cloud-5-RestTemplate详解

RestTemplate

上文中,我们使用RestTemplate实现了最简单的服务访问,并且通过配置@LoadBalanced实现了负载均衡.

接下来,我们来看一下,RestTemplate针对几种不同请求类型和参数类型的服务调用实现

GET 请求

在RestTemplate中,对于GET请求,有两种方式:

第一种:getForEntity()

该函数返回的是ResponseEntity,主要存储了HTTP的几个重要元素,比如HTTP请求状态码,父类HttpEntity中还包含了请求头HttpHeaders等信息, 有以下三种重载实现

1
2
3
4
5
public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables) throws RestClientException ;

public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException ;

public <T> ResponseEntity<T> getForEntity(URI url, Class<T> responseType) throws RestClientException ;

先看一下第一种,举个例子,我们要访问eureka-client的/dc接口,代码如下

1
restTemplate.getForEntity("http://EUREKA-CLIENT/dc?name={1}", String.class, "Mike");

第一个参数呢,就是url,需要传递参数可以使用占位符,第三个参数会替换url中的占位符, 第二个参数是接收的返回值的类型,比如我们希望返回值是string类型,那就是String.class,如果希望返回值是个User对象,那么就是User.class

第二种请求的方式,就是将参数放到了map对象中传过去.具体使用方式如下:

1
2
3
Map<String,String> map = new HashMap<>();
map.put("name","Mike");
restTemplate.getForEntity("http://EUREKA-CLIENT/dc?name={name}", String.class, map);

第三种方法是使用URI对象来替代之前的url和参数,这里不做详细说明.

第二种:getForObject()

对getForEntity的进一步封装, 对HTTP的请求响应体body内容进行对象转换,实现请求直接返回包装好的对象内容,比如

1
String result = restTemplate.getForObject(url, String.class);

当返回值是个user对象时,可以这样:

1
User user = restTemplate.getForObject(url, User.class);

如果我们只关心返回的body而不关系其他内容时,该函数就非常好用,可以少一个从Response中获取body的步骤,它与getForEntity函数类似,也提供了三种不同的重载实现,如下:

1
2
3
4
5
public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables) throws RestClientException;

public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException;

public <T> T getForObject(URI url, Class<T> responseType) throws RestClientException;

跟getForEntity是一样的

POST 请求

对于post请求,有三种方法可以使用

第一种:postForEntity()

和getForEntity类似,调用后返回ResponseEntity\<T>对象,有如下三种不同的重载方法:

1
2
3
4
5
public <T> ResponseEntity<T> postForEntity(String url, Object request, Class<T> responseType, Object... uriVariables) throws RestClientException;

public <T> ResponseEntity<T> postForEntity(String url, Object request, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException ;

public <T> ResponseEntity<T> postForEntity(URI url, Object request, Class<T> responseType) throws RestClientException ;

这些函数的用法大部分与getForEntity一致,需要注意的是第二个参数Object request

该参数可以是一个普通对象,也可以是一个HttpEntity对象.如果是一个普通对象,而非HttpEntity对象的时候,RestTemplate会将请求对象转换为一个HttpEntity对象来处理,其中Object就是request的类型,request内容会被视作完整的body来处理,而如果request是一个HttpEntity对象,那么就会被当作一
个完成的HTTP请求对象来处理,这个request中不仅包含了body的内容,也包含了header的内容.

第二种:postForObject()

用法和getForObject()是一致的,只关心返回的body而不关系其他内容时,用这个就好

1
2
3
4
5
public <T> T postForObject(String url, Object request, Class<T> responseType, Object... uriVariables) throws RestClientException;

public <T> T postForObject(String url, Object request, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException;

public <T> T postForObject(URI url, Object request, Class<T> responseType) throws RestClientException;

第三种:postForLocation()

是用post请求提交资源,并返回新资源的uri.

postForLocation的参数和前面两种方法的参数基本一致,只不过该方法的返回值为Uri,这个只需要服务提供者返回一个Uri即可,该Uri表示新资源的位置.

1
2
3
public URI postForLocation(String url, Object request, Object... uriVariables) throws RestClientException;

public URI postForLocation(String url, Object request, Map<String, ?> uriVariables) throws RestClientException;

PUT 请求

put()方法

PUT请求,可以通过put方法进行调用,如下:

1
2
3
User user = new User();
Long id = 110L;
restTemplate.put("http://EUREKA-CLIENT/dc", user, id);

put()方法也有三种重载方法:

1
2
3
4
5
public void put(String url, Object request, Object... uriVariables) throws RestClientException;

public void put(String url, Object request, Map<String, ?> uriVariables) throws RestClientException;

public void put(URI url, Object request) throws RestClientException;

因为是void类型的函数,所以也就不需要指定responseType参数,除此之外的其他传入参数定义与用法与postForObject基本一致.

DELETE 请求

DELETE请求可以通过delete()方法来进行调用

delete()方法

例:

1
restTemplate.put("http://EUREKA-CLIENT/dc");

delete()方法的三种重载如下:

1
2
3
4
5
public void delete(String url, Object... uriVariables) throws RestClientException;

public void delete(String url, Map<String, ?> uriVariables) throws RestClientException;

public void delete(URI url) throws RestClientException;