> For the complete documentation index, see [llms.txt](https://potoyang.gitbook.io/spring-in-action-v4/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://potoyang.gitbook.io/spring-in-action-v4/di-16-zhang-shi-yong-spring-mvc-chuang-jian-rest-api/untitled-1/untitled-6.md).

# 16.4.4　抽取响应的元数据

作为 getForObject() 的一个替代方案，RestTemplate 还提供了 getForEntity()。getForEntity() 方法与 getForObject() 方法的工作很相似。getForObject() 只返回资源（通过 HTTP 信息转换器将其转换为 Java 对象），getForEntity() 会在 ResponseEntity 中返回相同的对象，而且 ResponseEntity 还带有关于响应的额外信息，如 HTTP 状态码和响应头。

我们可能想使用 ResponseEntity 所做的事就是获取响应头的一个值。例如，假设除了获取资源，还想要知道资源的最后修改时间。假设服务端在 LastModified 头部信息中提供了这个信息，我们可以这样像这样使用 getHeaders() 方法：

```java
Date lastModified = new Date(response.getHeaders().getLastModified());
```

getHeaders() 方法返回一个 HttpHeaders 对象，该对象提供了多个便利的方法来查询响应头，包括 getLastModified()，它将返回从 1970 年 1 月 1 日开始的毫秒数。

除了 getLastModified()，HttpHeaders 还包含如下的方法来获取头信息：

```java
public List<MediaType> getAccept{) { ...}
public List<Charset> getAcceptCharset() { ...}
public Set<HttpMethod> getAllow() { ...} 
public String getCacheControl{) { ...}
public List<String> getConnection() { ...}
public long getContentLength() { ...}
public MediaType getContentType() { ...} 
public long getDate() ( ...)  
public String getETagO { ...} 
public long getExpires() { ...}
public long getlfNotModifiedSince() { ...}
public List<String> getlfNoneMatch() { ...} 
public long getLastModified() { ...}
public URI getLocation() { ...}
public String getOrigin{) { ...} 
public String getPragma{) { ...} 
public String getUpgrade() { ...}
```

为了实现更通用的 HTTP 头信息访问，HttpHeaders 提供了 get() 方法和 getFirst() 方法。两个方法都接受 String 参数来标识所需要的头信息。get() 将会返回一个 String 值的列表，其中的每个值都是赋给该头部信息的，而 getFirst() 方法只会返回第一个头信息的值。

如果你对响应的 HTTP 状态码感兴趣，那么你可以调用 getStatusCode() 方法。例如，考虑下面这个获取 Spittle 对象的方法：

```java
public Spittle fetchSpittle(String id) {
  RestTemplate rest = new RestTemplate();
  ResponseEntity<Spittle> response = rest.getForEntity(
    "http://localhost:8080/spittr-api/spittles/{id}",
    Spittle.class, id);
  if (response.getStatusCode() == HttpStatus.NOT_MODIFIED) {
    throw new NotModifiedException();
  }
  return response.getBody();
}
```

在这里，如果服务器响应 304 状态，这意味着服务器端的内容自从上一次请求之后再也没有修改。在这种情况下，将会抛出自定义的 NotModifiedException 异常来表明客户端应该检查它的缓存来获取 Spittle。
