RestTemplate
上文中,我们使用RestTemplate实现了最简单的服务访问,并且通过配置@LoadBalanced
实现了负载均衡.
接下来,我们来看一下,RestTemplate针对几种不同请求类型和参数类型的服务调用实现
GET 请求
在RestTemplate中,对于GET请求,有两种方式:
第一种:getForEntity()
该函数返回的是ResponseEntity,主要存储了HTTP的几个重要元素,比如HTTP请求状态码,父类HttpEntity中还包含了请求头HttpHeaders等信息, 有以下三种重载实现1
2
3
4
5public <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
3Map<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 | public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables) throws RestClientException; |
跟getForEntity是一样的
POST 请求
对于post请求,有三种方法可以使用
第一种:postForEntity()
和getForEntity类似,调用后返回ResponseEntity\<T>对象,有如下三种不同的重载方法:1
2
3
4
5public <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
5public <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
3public 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
3User user = new User();
Long id = 110L;
restTemplate.put("http://EUREKA-CLIENT/dc", user, id);
put()方法也有三种重载方法:1
2
3
4
5public 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
5public 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;