52.2. 使用完整请求 URI


摘要

请求 URI 包含大量信息。大部分信息可以使用方法参数来访问,如 第 47.2.2 节 “从请求 URI 注入数据” 所述,但使用参数强制处理 URI 的具体限制。使用参数来访问 URI 片段,也不提供对完整请求 URI 的资源访问权限。

您可以通过将 URI 上下文注入资源来提供对完整请求 URI 的访问。URI 作为 UriInfo 对象提供。UriInfo 接口提供了以多种方式分离 URI 的功能。它还可以将 URI 提供为 UriBuilder 对象,允许您构建 URI 以返回到客户端。

:experimental:

52.2.1. 注入 URI 信息

概述

当为 UriInfo 对象进行解码的类字段或方法参数时,当前请求的 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

获取 Base URI

Base URI 是发布该服务的根 URI。它不包含在任何服务的 @Path 注释中指定的 URI 的任何部分。例如,如果实现 例 47.5 “禁用 URI decoding” 中定义的资源的服务已发布到 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

StringgetPath

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

StringgetPathbooleandecode

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

List<PathSegment>getPathSegments

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

例如,资源路径 box/round#tall 将导致一个含有三个条目的列表: boxroundtall

List<PathSegment>getPathSegmentsbooleandecode

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

例如,资源路径 box#tall/round 将生成三个条目的列表: boxtall、和 round

获取完整请求 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

52.2.3. 获取 URI 模板变量的值

概述

“设置路径”一节 所述,资源路径可以包含绑定到动态的值的变量片段。这些变量路径片段通常用作资源方法的参数,如 “从 URI 的路径获取数据”一节 所述。但是,您还可以通过 URI 上下文访问它们。

获取路径参数的方法

UriInfo 接口提供了 例 52.1 “从 URI 上下文返回路径参数的方法” 的两个方法,它返回路径参数列表。

例 52.1. 从 URI 上下文返回路径参数的方法

MultivaluedMap<java.lang.String, java.lang.String&gt;getPathParametersMultivaluedMap<java.lang.String, java.lang.String&gt;getPathParametersbooleandecode

不使用任何参数的 getPathParameters () 方法自动解码路径参数。如果要禁用 URI decoding,请使用 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");
  }
}
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.