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
Was this helpful?