52.2.2. 使用 URI

概述

使用 URI 上下文的一个主要优点是,它提供对服务的基本 URI 和所选资源的 URI 的路径片段的访问。此信息可用于许多目的,例如根据 URI 或计算 URI 做出处理决策,以作为响应的一部分返回。例如,如果请求的基本 URI 包含 .com 扩展,服务可能会决定使用美国资金,并且基本 URI 包含 .co.uk 扩展是否可能决定我们英国的 Pounds。

UriInfo 接口提供了访问 URI 的部分方法:

  • 基本 URI
  • 资源路径
  • 完整 URI

获取 Base URI

基础 URI 是发布该服务的根 URI。它不包含在 service 的 @Path 注释中指定的任何 URI 部分。例如,如果实施 例 47.5 “禁用 URI 解码” 中定义的资源的服务被发布到 http://fusesource.org,在 http://fusesource.org/montersforhire/nightstalker?12 基本 URI 中进行了请求将为 http://fusesource.org

表 52.2 “访问资源基本 URI 的方法” 描述返回基本 URI 的方法。

表 52.2. 访问资源基本 URI 的方法

方法Desription

URIgetBaseUri

将服务的基本 URI 返回为 URI 对象。

UriBuildergetBaseUriBuilder

将基础 URI 返回为 javax.ws.rs.core.UriBuilder 对象。UriBuilder 类对于为服务实施的其他资源创建 URI 很有用。

获取路径

请求 URI 的路径 部分是用来选择当前资源的 URI 的部分。它不包括基本 URI,但不包括 URI 中包含的任何 URI 模板变量和列表参数。

路径值取决于所选的资源。例如,在 获取资源路径 中定义的资源的路径将是:

  • rootPath/monstersforhire/
  • getterPath/mostersforhire/nightstalker

    GET 请求在 /monstersforhire/nightstalker 上进行。

  • putterPath/mostersforhire/911

    PUT 请求在 /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 “访问资源路径的方法” 描述返回资源路径的方法。

表 52.3. 访问资源路径的方法

方法Desription

字符串getPath

将资源的路径作为已解码的 URI 返回。

字符串getPath布尔值解码

返回资源的路径。指定 false 可禁用 URI 解码。

list<PathSegment&gt;getPathSegments

将解码的路径作为 javax.ws.rs.core.PathSegment 对象的列表返回。路径的每个部分(包括列表参数)都放入列表中的唯一条目。

例如,资源路径 box/round#tall 将导致列表,包括三个条目: 舍入tall

list<PathSegment&gt;getPathSegments布尔值解码

将路径返回为 javax.ws.rs.core.PathSegment 对象列表。路径的每个部分(包括列表参数)都放入列表中的唯一条目。指定 false 可禁用 URI 解码。

例如,资源路径 box#tall/round 的结果是带有三个条目的列表: tallround

获取完整请求 URI

表 52.4 “访问完整请求 URI 的方法” 描述返回完整请求 URI 的方法。您可以选择返回请求 URI 或资源的绝对路径。不同之处在于,请求 URI 包含附加到 URI 的任何查询参数,绝对路径不包含查询参数。

表 52.4. 访问完整请求 URI 的方法

方法Desription

URIgetRequestUri

返回完整的请求 URI,包括查询参数和列表参数,作为 java.net.URI 对象。

UriBuildergetRequestUriBuilder

返回完整的请求 URI,包括查询参数和列表参数,作为 javax.ws.rs.UriBuilder 对象。UriBuilder 类对于为服务实施的其他资源创建 URI 很有用。

URIgetAbsolutePath

返回完整的请求 URI,包括列表参数,作为 java.net.URI 对象。绝对路径不包括查询参数。

UriBuildergetAbsolutePathBuilder

返回完整请求 URI,包括列表参数,作为 javax.ws.rs.UriBuilder 对象。绝对路径不包括查询参数。

对于使用 URI http://fusesource.org/montersforhire/nightstalker?12 的请求,getRequestUri() 方法将返回 http://fusesource.org/montersforhire/nightstalker?12getAbsolutePath() 方法将返回 http://fusesource.org/montersforhire/nightstalker