48.3.3. 处理更高级的响应

概述

响应 类方法提供了为常见情况创建响应的短差。当您需要解决更复杂的情况,如指定缓存控制指令、添加自定义 HTTP 标头或发送未由 Response 类处理的状态时,您需要使用 ResponseBuilder 类方法来填充响应,然后才能使用 build() 方法来生成响应对象。

“获取响应构建器”一节 所述,您可以使用 Apache CXF ResponseBuilderImpl 类来创建可直接操作的响应构建器实例。

添加自定义标头

使用 ResponseBuilder 类的 header() 方法将自定义标头添加到响应中。header() 方法采用两个参数:

  • name-a 指定标头名称的字符串
  • value- 包含标头中存储数据的 Java 对象

您可以通过重复调用 header() 方法在消息上设置多个标头。

在响应中添加标头 显示向响应中添加标头的代码。

在响应中添加标头

import javax.ws.rs.core.Response;
import org.apache.cxf.jaxrs.impl.ResponseBuilderImpl;

ResponseBuilderImpl builder = new ResponseBuilderImpl();
builder.header("username", "joe");
Response r = builder.build();

添加 Cookie

使用 ResponseBuilder 类的 cookie() 方法将自定义标头添加到响应中。Cookie() 方法采用一个或多个 cookies。每个 Cookie 都存储在 javax.ws.rs.core.NewCookie 对象中。NewCookie 类的最简单方法是使用两个参数:

  • name-a 指定 Cookie 名称的字符串
  • value-a 指定 Cookie 值的字符串

您可以通过重复调用 cookie() 方法来设置多个 Cookie。

在响应中添加 Cookie 显示将 Cookie 添加到响应中的代码。

在响应中添加 Cookie

import javax.ws.rs.core.Response;
import javax.ws.rs.core.NewCookie;

NewCookie cookie = new NewCookie("username", "joe");

Response r = Response.ok().cookie(cookie).build();

警告

使用 null 参数列表调用 cookie() 方法将擦除已经与响应关联的 cookie。

设置响应状态

当您想要返回除 Response 类帮助程序方法所支持的其中一个状态以外的状态时,您可以使用 ResponseBuilder 类的 status() 方法来设置响应的状态代码。status() 方法有两个变体。需要一个 int 来指定响应代码。另一个需要 Response.Status 对象来指定响应代码。

Response.Status 类是存储在 Response 类中的枚举者。它含有大多数定义的 HTTP 响应代码的条目。

在响应中添加标头 显示将响应状态设置为 404 Not Found 的代码。

在响应中添加标头

import javax.ws.rs.core.Response;
import org.apache.cxf.jaxrs.impl.ResponseBuilderImpl;

ResponseBuilderImpl builder = new ResponseBuilderImpl();
builder.status(404);
Response r = builder.build();

设置缓存控制指令

ResponseBuilder 类的 cacheControl() 方法允许您设置响应上的缓存控制标头。cacheControl() 方法采用 javax.ws.rs.CacheControl 对象,用于指定响应的缓存控制指令。

CacheControl 类具有与 HTTP 规范支持的所有缓存控制指令对应的方法。如果指令是简单的 on 或 off 值,则 setter 方法采用 布尔值。如果指令需要数字值,如 max-age 指令,则 setter 取一个 int 值。

在响应中添加标头 显示设置 no-store 缓存控制指令的代码。

在响应中添加标头

import javax.ws.rs.core.Response;
import javax.ws.rs.core.CacheControl;
import org.apache.cxf.jaxrs.impl.ResponseBuilderImpl;

CacheControl cache = new CacheControl();
cache.setNoCache(true);

ResponseBuilderImpl builder = new ResponseBuilderImpl();
builder.cacheControl(cache);
Response r = builder.build();