52.2. 完全な要求 URI の操作
概要
要求 URI には大量の情報が含まれます。この情報は、「リクエスト URI からのデータの注入」 に記載のメソッドパラメーターを使用してアクセスできますが、パラメーターを使用すると URI の処理方法に特定の制約が強制的に課されます。URI のセグメントにアクセスするためにパラメーターを使用しても、完全な要求 URI へのリソースにはアクセスできません。
URI コンテキストをリソースに注入することで、完全な要求 URI にアクセスできます。URI は UriInfo オブジェクトとして提供されます。UriInfo インターフェイスは、URI を複数の方法で破棄する関数を提供します。また、URI を UriBuilder オブジェクトとして提供して、クライアントに返す URI を作成することもできます。
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 を返すメソッドを示します。
メソッド | 詳細 |
---|---|
|
サービスのベース 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「リソースのパスにアクセスするメソッド」 では、リソースパスを返すメソッドについて説明します。
メソッド | 詳細 |
---|---|
| リソースのパスをデコードされた URI として返します。 |
|
リソースのパスを返します。 |
|
デコードされたパスを javax.ws.rs.core.PathSegment オブジェクトの一覧として返します。マトリックスパラメーターを含むパスの各部分は、リストの一意のエントリーに配置されます。
たとえば、リソースパス box/round#tall の場合は、 |
|
パスを javax.ws.rs.core.PathSegment オブジェクトの一覧として返します。マトリックスパラメーターを含むパスの各部分は、リストの一意のエントリーに配置されます。
たとえば、リソースパス box#tall/round の場合は、 |
完全な要求 URI の取得
表52.4「完全な要求 URI にアクセスする方法」 では、完全なリクエスト URI を返すメソッドを説明します。要求 URI またはリソースの絶対パスを返すオプションがあります。相違点は、要求 URI には URI に追加されるクエリーパラメーターが含まれ、絶対パスにはクエリーパラメーターが含まれないことです。
メソッド | 詳細 |
---|---|
|
クエリーパラメーターおよびマトリックスパラメーターを含む完全なリクエスト 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 コンテキストからパスパラメーターを返すメソッド」 のように) パスパラメーターの一覧を返す 2 つのメソッドを提供します。
例52.1 URI コンテキストからパスパラメーターを返すメソッド
MultivaluedMap<java.lang.String, java.lang.String>
getPathParameters
MultivaluedMap<java.lang.String, java.lang.String>
getPathParameters
boolean
decode
パラメーターを取らない 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"); } }