52.2. 完全な要求 URI の操作


概要

要求 URI には大量の情報が含まれます。この情報は、「リクエスト URI からのデータの注入」 に記載のメソッドパラメーターを使用してアクセスできますが、パラメーターを使用すると URI の処理方法に特定の制約が強制的に課されます。URI のセグメントにアクセスするためにパラメーターを使用しても、完全な要求 URI へのリソースにはアクセスできません。

URI コンテキストをリソースに注入することで、完全な要求 URI にアクセスできます。URI は UriInfo オブジェクトとして提供されます。UriInfo インターフェイスは、URI を複数の方法で破棄する関数を提供します。また、URI を UriBuilder オブジェクトとして提供して、クライアントに返す URI を作成することもできます。

:experimental:

52.2.1. URI 情報の挿入

概要

UriInfo オブジェクトであるクラスフィールドまたはメソッドパラメーターに @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 コンテキストを使用する主な利点の 1 つとして、サービスのベース URI と選択したリソースの URI のパスセグメントにアクセスできることが挙げられます。この情報は、URI に基づいた処理の決定や、応答の一部として返す URI の計算など、多くの目的に役立ちます。たとえば、要求のベース URI に .com 拡張が含まれる場合に、このサービスでは米国ドルを、ベース URI に .co.uk 拡張が含まれる場合には、英国ポンドを使用するように選択できます。

UriInfo インターフェイスは、URI の一部にアクセスするためのメソッドを提供します。

  • ベース URI
  • リソースパス
  • 完全な URI

ベース URI の取得

ベース URI は、サービスが公開されるルート URI です。サービスの @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 にアクセスするメソッド
メソッド詳細

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 リソースのパスにアクセスするメソッド
メソッド詳細

StringgetPath

リソースのパスをデコードされた URI として返します。

StringgetPathbooleandecode

リソースのパスを返します。false を指定すると、URI のデコードが無効になります。

List<PathSegment>getPathSegments

デコードされたパスを javax.ws.rs.core.PathSegment オブジェクトの一覧として返します。マトリックスパラメーターを含むパスの各部分は、リストの一意のエントリーに配置されます。

たとえば、リソースパス box/round#tall の場合は、boxround、および tall の 3 つのエントリーのリストになります。

List<PathSegment>getPathSegmentsbooleandecode

パスを javax.ws.rs.core.PathSegment オブジェクトの一覧として返します。マトリックスパラメーターを含むパスの各部分は、リストの一意のエントリーに配置されます。false を指定すると、URI のデコードが無効になります。

たとえば、リソースパス box#tall/round の場合は、boxtall、および round の 3 つのエントリーのリストになります。

完全な要求 URI の取得

表52.4「完全な要求 URI にアクセスする方法」 では、完全なリクエスト URI を返すメソッドを説明します。要求 URI またはリソースの絶対パスを返すオプションがあります。相違点は、要求 URI には URI に追加されるクエリーパラメーターが含まれ、絶対パスにはクエリーパラメーターが含まれないことです。

表52.4 完全な要求 URI にアクセスする方法
メソッド詳細

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?12 を返します。getAbsolutePath() メソッドは http://fusesource.org/montersforhire/nightstalker を返します。

52.2.3. URI テンプレート変数の値の取得

概要

「パスの設定」 で説明されているように、リソースパスには、値に動的にバインドされた変数セグメントを含めることができます。多くの場合、これらの変数パスセグメントは、「URI のパスからのデータ取得」 で説明されているリソースメソッドへのパラメーターとして使用されます。ただし、URI コンテキストを使用してそれらにアクセスすることもできます。

パスパラメーターを取得する方法

UriInfo インターフェイスは、(例52.1「URI コンテキストからパスパラメーターを返すメソッド」 のように) パスパラメーターの一覧を返す 2 つのメソッドを提供します。

例52.1 URI コンテキストからパスパラメーターを返すメソッド

MultivaluedMap<java.lang.String, java.lang.String>getPathParametersMultivaluedMap<java.lang.String, java.lang.String>getPathParametersbooleandecode

パラメーターを取らない getPathParameters() メソッドは、パスパラメーターを自動的にデコードします。URI のデコードを無効にする場合は、getPathParameters(false) を使用します。

値は、テンプレート識別子をキーとして使用してマップに保存されます。たとえば、リソースの URI テンプレートが /{color}/box/{note} の場合、返されるマップには color キーと note キーを持つ 2 つのエントリーがあります。

例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

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.