49.4. 解析请求和响应
概述 复制链接链接已复制到粘贴板!
进行 HTTP 调用的基本方面是客户端必须能够解析传出请求消息和传入的响应。在 JAX-RS 2.0 中,密钥概念是 实体 类,它代表了使用介质类型标记的原始消息。为了解析原始消息,您可以注册多个 实体供应商,该提供程序具有将介质类型转换为 和 的能力。
换句话说,在 JAX-RS 2.0 上下文中,实体 是原始消息的表示,实体提供程序是提供解析原始消息(基于介质类型)能力的插件。
实体 复制链接链接已复制到粘贴板!
实体 是一种通过元数据(媒体类型、语言和编码)增强的消息正文。实体 实例以原始格式保存消息,并与特定介质类型相关联。要将 实体对象的内容转换为您需要 实体 供应商 的 Java 对象,它可以将给定介质类型映射到所需的 Java 类型。
变体 复制链接链接已复制到粘贴板!
javax.ws.rs.core.Variant 对象封装与 实体 关联的元数据,如下所示:
- 媒体类型,
- 语言,
- 编码.
实际上,您可以将 实体 视为由 HTTP 消息内容组成的,由各种元数据提供增强。
实体供应商 复制链接链接已复制到粘贴板!
实体提供程序是一种类,提供介质类型和 Java 类型之间的映射功能。您可以有效地将实体供应商视为一种类,能够解析特定介质类型(也可能是多种媒体类型)的消息。实体供应商有两个不同的变体:
MessageBodyReader- 提供从介质类型映射到 Java 类型的功能。
MessageBodyWriter- 提供从 Java 类型映射到介质类型的功能。
标准实体供应商 复制链接链接已复制到粘贴板!
以下 Java 和介质类型组合的实体供应商作为标准提供:
byte[]-
所有介质类型(
*/*)。 java.lang.String-
所有介质类型(
*/*)。 java.io.InputStream-
所有介质类型(
*/*)。 java.io.Reader-
所有介质类型(
*/*)。 java.io.File-
所有介质类型(
*/*)。 javax.activation.DataSource-
所有介质类型(
*/*)。 javax.xml.transform.Source-
XML 类型(
text/xml、application/xml和 media type of theapplication/*+xml)。 javax.xml.bind.JAXBElement和 application-supplied JAXB 类-
XML 类型(
text/xml、application/xml和 media type of theapplication/*+xml)。 MultivaluedMap<String,String>-
表单内容(
application/x-www-form-urlencoded)。 StreamingOutput-
所有介质类型(
*/*), 仅MessageBodyWriter。 java.lang.Boolean,java.lang.Character,java.lang.Number-
只适用于
文本/说明。通过 boxing/unboxing 转换支持对应的原语类型.
响应对象 复制链接链接已复制到粘贴板!
默认返回类型是 javax.ws.rs.core.Response 类型,它代表未输入的响应。Response 对象提供对完整 HTTP 响应的访问,包括消息正文、HTTP 状态、HTTP 标头、媒体类型等等。
访问响应状态 复制链接链接已复制到粘贴板!
您可以通过 getStatus 方法访问响应状态(这将返回 HTTP 状态代码):
int status = resp.getStatus();
int status = resp.getStatus();
或者,虽然 getStatusInfo 方法还提供描述字符串:
String statusReason = resp.getStatusInfo().getReasonPhrase();
String statusReason = resp.getStatusInfo().getReasonPhrase();
访问返回的标头 复制链接链接已复制到粘贴板!
您可以使用以下任一方法访问 HTTP 标头:
例如,如果您知道 响应 有 日期 标头,您可以按照以下方法访问它:
String dateAsString = resp.getHeaderString("Date");
String dateAsString = resp.getHeaderString("Date");
访问返回的 Cookie 复制链接链接已复制到粘贴板!
您可以使用 getCookies 方法访问 响应 上设置的任何新 Cookie,如下所示:
import javax.ws.rs.core.NewCookie; ... java.util.Map<String,NewCookie> cookieMap = resp.getCookies(); java.util.Collection<NewCookie> cookieCollection = cookieMap.values();
import javax.ws.rs.core.NewCookie;
...
java.util.Map<String,NewCookie> cookieMap = resp.getCookies();
java.util.Collection<NewCookie> cookieCollection = cookieMap.values();
访问返回的消息内容 复制链接链接已复制到粘贴板!
您可以通过在 Response 对象上调用其中一个 readEntity 方法来访问返回的消息内容。readEntity 方法自动调用可用的实体提供程序,将消息转换为请求的类型(指定为 readEntity的第一个参数)。例如,要将消息内容作为 String 类型来访问:
String messageBody = resp.readEntity(String.class);
String messageBody = resp.readEntity(String.class);
集合返回值 复制链接链接已复制到粘贴板!
如果您需要以 Java 通用类型(例如 List 或 Collection 类型)访问返回的消息,您可以使用 javax.ws.rs.core.GenericType<T > construct 指定请求消息类型。例如: