52.2. 使用完整请求 URI
摘要
请求 URI 包含大量信息。其中大多数信息都可使用方法参数访问,如 第 47.2.2 节 “从请求 URI 注入数据” 所述,但使用参数会强制处理 URI 的某些限制。使用参数访问 URI 的片段也不提供对完整请求 URI 的资源访问。
您可以通过将 URI 上下文注入资源来提供对完整请求 URI 的访问。URI 作为 UriInfo 对象提供。UriInfo 接口以多种方式处理 URI。它还可以将 URI 提供为 UriBuilder 对象,允许您构建 URI 以返回到客户端。
52.2.1. 注入 URI 信息
概述
当属于 UriInfo 对象的 class 字段或 method 参数与 @Context
注释分离时,当前请求的 URI 上下文将注入到 UriInfo 对象中。
示例
将 URI 上下文注入类字段 通过注入 URI 上下文来显示带有字段的类。
将 URI 上下文注入类字段
import javax.ws.rs.core.Context; import javax.ws.rs.core.UriInfo; import javax.ws.rs.Path; ... @Path("/monstersforhire/") public class MonsterService { @Context UriInfo requestURI; ... }
52.2.2. 使用 URI
概述
使用 URI 上下文的一个主要优点是它提供对服务的基本 URI 和所选资源 URI 的路径段的访问。此信息可用于很多目的,如基于 URI 或计算 URI 作为响应的一部分返回的处理决策。例如,如果请求的基本 URI 包含 .com 扩展,服务可能会决定使用美国美元,以及基础 URI 是否包含 .co.uk 扩展,则可能会决定我们 British Pounds。
UriInfo 接口提供了访问 URI 部分的方法:
- 基本 URI
- 资源路径
- 完整的 URI
获取基本 URI
基础 URI 是发布该服务的 root URI。它不包含任何服务的 @Path
注释中指定的 URI 的任何部分。例如,如果实施 例 47.5 “禁用 URI 解码” 中定义的资源的服务已发布到 http://fusesource.org ,并且在 http://fusesource.org/montersforhire/nightstalker?12 上发出了一个请求,基本 URI 为 http://fusesource.org。
表 52.2 “访问资源基础 URI 的方法” 描述返回基本 URI 的方法。
方法 | Desription |
---|---|
|
将服务的基本 URI 返回为 |
将基本 URI 返回为 |
获取路径
请求 URI 的路径 部分是用于选择当前资源的 URI 部分。它不包括基本 URI,但不包含任何 URI 模板变量和 URI 中包含的列表参数。
路径的值取决于所选资源。例如,在 获取资源路径 中定义的资源的路径将是:
-
rootPath
— /monstersforhire/ getterPath
— /mostersforhire/nightstalkerGET
请求在 /monstersforhire/nightstalker 上发出。putterPath
— /mostersforhire/911PUT
请求是在 /monstersforhire/911 上进行的。
获取资源路径
@Path("/monstersforhire/") public class MonsterService { @Context UriInfo rootUri; ... @GET public List<Monster> getMonsters(@Context UriInfo getUri) { String rootPath = rootUri.getPath(); ... } @GET @Path("/{type}") public Monster getMonster(@PathParam("type") String type, @Context UriInfo getUri) { String getterPath = getUri.getPath(); ... } @PUT @Path("/{id}") public void addMonster(@Encoded @PathParam("type") String type, @Context UriInfo putUri) { String putterPath = putUri.getPath(); ... } ... }
表 52.3 “访问资源路径的方法” 描述返回资源路径的方法。
方法 | Desription |
---|---|
| 将资源的路径返回为解码的 URI。 |
|
返回资源的路径。指定 |
|
将解码的路径返回为 javax.ws.rs.core.PathSegment 对象列表。路径的每个部分(包括列表参数)都放在列表中的唯一条目中。
例如,资源路径 框/round#tall 将导致包含三个条目的列表: |
|
将路径返回为 javax.ws.rs.core.PathSegment 对象列表。路径的每个部分(包括列表参数)都放在列表中的唯一条目中。指定
例如,资源路径 框#tall/round 将导致含有三个条目的列表: |
获取完整请求 URI
表 52.4 “访问完整请求 URI 的方法” 描述返回完整请求 URI 的方法。您可以选择返回请求 URI 或资源的绝对路径。区别在于,请求 URI 包含附加到 URI 的任何查询参数,绝对路径不包括查询参数。
方法 | Desription |
---|---|
|
返回完整的请求 URI,包括查询参数和列表参数,作为 |
返回完整的请求 URI,包括查询参数和列表参数,作为 | |
|
返回完整的请求 URI,包括列表参数,作为 |
返回完整的请求 URI,包括列表参数,作为 |
对于使用 URI http://fusesource.org/montersforhire/nightstalker?12 发出请求,getRequestUri ()
方法将返回 http://fusesource.org/montersforhire/nightstalker?12。getAbsolutePath ()
方法将返回 http://fusesource.org/montersforhire/nightstalker。
52.2.3. 获取 URI 模板变量的值
概述
如 “设置路径”一节 所述,资源路径可以包含动态绑定到值的变量片段。这些变量路径片段通常用作资源方法的参数,如 “从 URI 的路径获取数据”一节 所述。但是,您也可以通过 URI 上下文访问它们。
获取路径参数的方法
UriInfo 接口提供了两种方法,如 例 52.1 “从 URI 上下文返回路径参数的方法” 所示,它返回一个路径参数列表。
例 52.1. 从 URI 上下文返回路径参数的方法
MultivaluedMap<java.lang.String, java.lang.String>
;getPathParameters
MultivaluedMap<java.lang.String, java.lang.String>
;getPathParameters
布尔值
解码
不使用任何参数的 getPathParameters ()
方法会自动解码路径参数。如果要禁用 URI 解码,请使用 getPathParameters (false)
。
这些值存储在映射中,将其模板标识符用作键。例如,如果资源的 URI 模板为 /{color}/box/{note},则返回的映射将有两个带有键 颜色
的条目,并注意
。
示例
例 52.2 “从 URI 上下文中提取路径参数” 显示使用 URI 上下文检索路径参数的代码。
例 52.2. 从 URI 上下文中提取路径参数
import javax.ws.rs.Path; import javax.ws.rs.Get; import javax.ws.rs.core.Context; import javax.ws.rs.core.UriInfo; import javax.ws.rs.core.MultivaluedMap; @Path("/monstersforhire/") public class MonsterService @GET @Path("/{type}/{size}") public Monster getMonster(@Context UriInfo uri) { MultivaluedMap paramMap = uri.getPathParameters(); String type = paramMap.getFirst("type"); String size = paramMap.getFirst("size"); } }