搜索

48.3. 微调应用程序的响应

download PDF

48.3.1. 构建响应的基础知识

概述

当资源方法返回普通 Java 构造时,RESTful 服务通常需要更精确地控制返回到消费者的响应。JAX-RS Response 类允许资源方法对发送到消费者的返回状态进行一些控制,并在响应中指定 HTTP 消息标头和 Cookie。

响应 对象嵌套代表返回到消费者的实体的对象。响应 对象使用 ResponseBuilder 类作为工厂实例化。

ResponseBuilder 类也有许多方法用于操作响应的元数据。例如,ResonseBuilder 类包含设置 HTTP 标头和缓存控制指令的方法。

响应和响应构建器之间的关系

Response 类具有受保护的构造器,因此无法直接实例化它们。它们使用 ResponseBuilder 类创建,该类由 Response 类括起。ResponseBuilder 类是所有信息的所有者,将被封装到从其创建的响应中。ResponseBuilder 类也具有负责在消息上设置 HTTP 标头属性的所有方法。

Response 类提供了一些简化设置正确响应代码并嵌套实体的方法。每个常见的响应状态代码都有方法。与包含实体正文或所需元数据的状态对应的方法包括允许直接设置信息到关联的响应构建器的版本。

ResponseBuilder 类的 build () 方法返回一个响应对象,其中包含调用方法时响应构建器中存储的信息。返回响应对象后,响应构建器将返回到干净的状态。

获取响应构建器

获取响应构建器的方法有两种:

  • 使用 Response 类的静态方法,如 使用 Response 类获取响应构建器 所示。

    使用 Response 类获取响应构建器

    import javax.ws.rs.core.Response;
    
    Response r = Response.ok().build();

    在获得响应构建器时,您无法访问实例的访问权限,您可以在多个步骤中操作。您必须将所有操作字符串为单一方法调用。

  • 使用 Apache CXF 特定的 ResponseBuilderImpl 类。此类允许您直接使用响应构建器。但是,它要求您手动设置所有响应构建器信息。

    例 48.1 “使用 ResponseBuilderImpl 类获取响应构建器” 演示了如何使用 ResponseBuilderImpl 类重写 使用 Response 类获取响应构建器

    例 48.1. 使用 ResponseBuilderImpl 类获取响应构建器

    import javax.ws.rs.core.Response;
    import org.apache.cxf.jaxrs.impl.ResponseBuilderImpl;
    
    ResponseBuilderImpl builder = new ResponseBuilderImpl();
    builder.status(200);
    Response r = builder.build();
    注意

    您还可以简单地将从 Response 类方法返回的 ResponseBuilder 分配给 ResponseBuilderImpl 对象。

更多信息

有关 Response 类的更多信息,请参阅 Response 类的 Javadoc

有关 ResponseBuilder 类的更多信息,请参阅 ResponseBuilder 类的 Javadoc

有关 Apache CXF ResponseBuilderIml 类的更多信息,请参阅 ResponseBuilderImpl Javadoc

48.3.2. 为常见用例创建响应

概述

Response 类提供处理 RESTful 服务需要更常见的响应的快捷方式。这些方法使用提供的值或默认值处理正确的标头。它们也会在适当的时候处理实体正文。

为成功请求创建响应

成功处理请求时,应用需要发送响应来确认请求已实现。该响应可能包含实体。

成功完成响应时最常见的响应是 OKOK 响应通常包含一个与请求对应的实体。Response 类有一个超载的 ok () 方法,将响应状态设置为 200,并将提供的实体添加到括起的响应构建器中。ok () 方法有五个版本。最常用的变体有:

  • response .ok ()- 创建状态为 200 和空实体正文的响应。
  • response .ok (java.lang.Object entity)- 创建状态为 200 的响应,将提供的对象存储在响应实体正文中,并通过内省对象来确定实体介质类型。

创建具有 200 响应的响应 显示了创建具有 OK 状态的响应的示例。

创建具有 200 响应的响应

import javax.ws.rs.core.Response;
import demo.jaxrs.server.Customer;
...

Customer customer = new Customer("Jane", 12);

return Response.ok(customer).build();

对于请求者没有期望实体正文,则更适合发送 204 No Content 状态而不是 200 OK 状态。Response.noContent () 方法将创建适当的响应对象。

创建具有 204 状态的响应 显示了创建具有 204 状态的响应的示例。

创建具有 204 状态的响应

import javax.ws.rs.core.Response;

return Response.noContent().build();

为重定向创建响应

Response 类提供了处理三个重定向响应状态的方法。

303 查看其他

当请求的资源需要永久重定向到新资源来处理请求时,303 See Other 状态很有用。

ResponseseeOther () 方法创建具有 303 状态的响应,并将新的资源 URI 放置到消息的 Location 字段中。seeOther () 方法使用一个参数,该参数将新 URI 指定为 java.net.URI 对象。

304 not Modified

根据请求的性质,304 Not Modified 状态可用于不同的事情。它可用于表示请求的资源自以前的 GET 请求起没有改变。它还可用于表示修改资源的请求不会导致资源被更改。

Response class notModified () 方法会创建一个具有 304 状态的响应,并在 HTTP 消息上设置修改后的日期属性。notModified () 方法有三个版本:

  • NotModified
  • notModifiedjavax.ws.rs.core.Entitytag
  • NotModifiedjava.lang.Stringtag
307 Temporary Redirect

当请求的资源需要将消费者定向到新资源时,307 Temporary Redirect 状态很有用,但希望消费者继续使用此资源来处理将来的请求。

Response class temporaryRedirect () 方法会创建一个具有 307 状态的响应,并将新的资源 URI 放置到消息的 Location 字段中。temporaryRedirect () 方法采用单个参数,该参数将新 URI 指定为 java.net.URI 对象。

创建具有 304 状态的响应 显示了创建具有 304 状态的响应的示例。

创建具有 304 状态的响应

import javax.ws.rs.core.Response;

return Response.notModified().build();

创建对信号错误的响应

Response 类提供了为两个基本处理错误创建响应的方法:

  • serverError- 创建状态为 500 Internal Server Error 的响应。
  • notAcceptablejava.util.List<javax.ws.rs.core.Variant>变体- 创建具有 406 Not Acceptable 状态的响应以及包含可接受的资源类型列表的实体正文。

创建具有 500 状态的响应 显示了创建具有 500 状态的响应的示例。

创建具有 500 状态的响应

import javax.ws.rs.core.Response;

return Response.serverError().build();

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 () 方法采用一个或多个 Cookie。每个 Cookie 存储在 javax.ws.rs.core.NewCookie 对象中。最容易使用的 NewCookie 类的 contructors 取两个参数:

  • name-a 指定 Cookie 名称的字符串
  • value- 指定 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();

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.