从客户的角度来看,与 REST 资源进行交互需要做很多工作 —— 主要是单调乏味的样板文件。使用低级 HTTP 库,客户端需要创建一个客户端实例和一个请求对象,执行请求,解释响应,将响应映射到域对象,并处理过程中可能抛出的任何异常。不管发送什么 HTTP 请求,所有这些样板文件都会重复。
为了避免这样的样板代码,Spring 提供了 RestTemplate。正如 JDBCTemplate 处理使用 JDBC 糟糕的那部分一样,RestTemplate 使你不必为调用 REST 资源而做单调的工作。
RestTemplate 提供了 41 个与 REST 资源交互的方法。与其检查它提供的所有方法,不如只考虑 12 个惟一的操作,每个操作都有重载,以形成 41 个方法的完整集合。表 7.1 描述了 12 种操作。
表 7.1 RestTemplate 定义的 12 个唯一操作
方法 | 描述 |
---|---|
delete(...) | 对指定 URL 上的资源执行 HTTP DELETE请求 |
exchange(...) | 对 URL 执行指定的 HTTP 方法,返回一个 ResponseEntity,其中包含从响应体映射的对象 |
execute(...) | 对 URL 执行指定的 HTTP 方法,返回一个映射到响应体的对象 |
getForEntity(...) | 发送 HTTP GET 请求,返回一个 ResponseEntity,其中包含从响应体映射的对象 |
getForObject(...) | 发送 HTTP GET 请求,返回一个映射到响应体的对象 |
headForHeaders(...) | 发送 HTTP HEAD 请求,返回指定资源 URL 的 HTTP 请求头 |
optionsForAllow(...) | 发送 HTTP OPTIONS 请求,返回指定 URL 的 Allow 头信息 |
patchForObject(...) | 发送 HTTP PATCH 请求,返回从响应主体映射的结果对象 |
postForEntity(...) | 将数据 POST 到一个 URL,返回一个 ResponseEntity,其中包含从响应体映射而来的对象 |
postForLocation(...) | 将数据 POST 到一个 URL,返回新创建资源的 URL |
postForObject(...) | 将数据 POST 到一个 URL,返回从响应主体映射的对象 |
put(...) | 将资源数据 PUT 到指定的URL |
除了 TRACE 之外,RestTemplate 对于每个标准 HTTP 方式至少有一个方法。此外,execute() 和 exchange() 为使用任何 HTTP 方式发送请求提供了低层的通用方法。表 7.1 中的大多数方法都被重载为三种方法形式:
- 一种是接受一个 String 作为 URL 规范,在一个变量参数列表中指定 URL 参数。
- 一种是接受一个 String 作为 URL 规范,其中的 URL 参数在 Map<String, String> 中指定。
- 一种是接受 java.net.URI 作为 URL 规范,不支持参数化 URL。
一旦了解了 RestTemplate 提供的 12 个操作以及每种变体的工作方式,就可以很好地编写调用资源的 REST 客户端了。
要使用 RestTemplate,需要创建一个实例:
RestTemplate rest = new RestTemplate();
或是将它声明为一个 bean,在需要它的时候将其注入:
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
让我们通过查看支持四种主要 HTTP 方法(GET、PUT、DELETE 和 POST)的操作来探寻 RestTemplate 的操作。我们将从 getForObject() 和 getForEntity() —— GET 方法开始。