16.4.4 抽取响应的元数据

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

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

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

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

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

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 对象的方法:

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。

Last updated