48.3.3. 处理更高级的响应

概述

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

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

添加自定义标头

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

  • name-a 字符串指定标头的名称
  • value-a 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

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

  • 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。

设置响应状态

如果要返回 响应 类帮助程序方法支持的状态以外的状态,您可以使用 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 指令,则设置器会采用 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();