49.3. クライアント呼び出しのビルド
概要
WebTarget
ビルダークラスを使用してターゲット URI を構築した後、次の手順では HTTP ヘッダーやクッキーなどの他のものを設定します。これは、Invocation.Builder
クラスを使用します。呼び出しの構築における最後のステップは、適切な HTTP 動詞 (GET、POST、PUT、または DELETE) を呼び出して、必要に応じてメッセージボディーを指定します。
Invocation.Builder クラス
javax.ws.rs.client.Invocation.Builder
ビルダークラスは、Fluent API の一部を提供し、HTTP メッセージの内容を構築し、HTTP メソッドを呼び出すことができます。
呼び出しビルダーを作成します。
Invocation.Builder
インスタンスを作成するには、javax.ws.rs.client.WebTarget
インスタンス上で request
メソッドのいずれかを呼び出します。以下に例を示します。
// Java import javax.ws.rs.client.WebTarget; import javax.ws.rs.client.Invocation.Builder; ... WebTarget books = client.target("http://example.org/bookstore/books/123"); Invocation.Builder invbuilder = books.request();
HTTP ヘッダーの定義
以下のように、header
メソッドを使用してリクエストメッセージに HTTP ヘッダーを追加できます。
Invocation.Builder invheader = invbuilder.header("From", "fionn@example.org");
クッキーの定義
以下のように、cookie
メソッドを使用してクッキーをリクエストメッセージに追加できます。
Invocation.Builder invcookie = invbuilder.cookie("myrestclient", "123xyz");
プロパティーの定義
以下のように、プロパティーメソッドを使用して、このリクエストのコンテキストでプロパティーを設定できます。
Invocation.Builder invproperty = invbuilder.property("Name", "Value");
許可されるメディアタイプ、言語、またはエンコーディングの定義
以下のように、受け入れられるメディアタイプ、言語、またはエンコードを定義できます。
Invocation.Builder invmedia = invbuilder.accept("application/xml") .acceptLanguage("en-US") .acceptEncoding("gzip");
HTTP メソッドを呼び出します。
REST 呼び出しを構築するプロセスは、HTTP 呼び出しを実行する HTTP メソッドを呼び出して終了します。以下のメソッド (javax.ws.rs.client.SyncInvoker
ベースクラスから継承) を呼び出すことができます。
get post delete put head trace options
呼び出す特定の HTTP 動詞がこのリストにない場合は、汎用 method
メソッドを使用して HTTP メソッドを呼び出すことができます。
タイプが指定された応答
すべての HTTP 呼び出しメソッドには、型なしのバリアントと型付きバリアント (追加の引数を取る) が用意されています。デフォルトの get()
メソッド (引数を取らない) を使用してリクエストを呼び出すと、javax.ws.rs.core.Response
オブジェクトがその呼び出しから返されます。以下に例を示します。
Response res = client.target("http://example.org/bookstore/books/123") .request("application/xml").get();
ただし、get(Class<T>)
メソッドを使用して、レスポンスを特定の型として返すように要求することもできます。たとえば、リクエストを呼び出して、BookInfo
オブジェクトとしてレスポンスを返すように要求するには、次のようにします。
BookInfo res = client.target("http://example.org/bookstore/books/123") .request("application/xml").get(BookInfo.class);
ただし、これを機能させるには、application/xml
レスポンス形式をマッピングできる Client
インスタンスで、適切なエンティティープロバイダー をリクエストされた型に登録する必要があります。エンティティープロバイダーの詳細は、「要求と応答の解析」 を参照してください。
送信メッセージの POST または PUT の指定
HTTP メソッド (POST または PUT など) の要求にメッセージボディーが含まれる場合に、そのメッセージボディーをメソッドの最初の引数として指定する必要があります。メッセージボディーは javax.ws.rs.client.Entity
オブジェクトとして指定する必要があります。ここで、Entity
はメッセージの内容とそれに関連するメディア型をカプセル化します。たとえば、メッセージの内容が String
型として提供される POST メソッドを呼び出すには、以下のようにします。
import javax.ws.rs.client.Entity; ... Response res = client.target("http://example.org/bookstore/registerbook") .request("application/xml") .put(Entity.entity("Red Hat Install Guide", "text/plain"));
必要に応じて、Entity.entity()
コンストラクターメソッドが、登録済みエンティティープロバイダーを使用して、提供されたメッセージインスタンスを自動的に指定のメディア型にマップします。メッセージボディーは、常に単純な String
型として指定できます。
遅延呼び出し
すぐに HTTP リクエストを呼び出す代わりに (get()
メソッドを呼び出すなど)、後で呼び出すことのできる javax.ws.rs.client.Invocation
オブジェクトを作成するオプションがあります。Invocation
オブジェクトは、HTTP メソッドを含む、保留中の呼び出しの詳細を すべて カプセル化します。
以下のメソッドは、Invocation
オブジェクトの構築に使用できます。
buildGet buildPost buildDelete buildPut build
たとえば、GET Invocation
オブジェクトを作成し、後で呼び出すには、以下のようなコードを使用することができます。
import javax.ws.rs.client.Invocation; import javax.ws.rs.core.Response; ... Invocation getBookInfo = client.target("http://example.org/bookstore/books/123") .request("application/xml").buildGet(); ... // Later on, in some other part of the application: Response = getBookInfo.invoke();
非同期呼び出し
JAX-RS 2.0 クライアント API は、クライアント側での非同期呼び出しをサポートします。非同期呼び出しを行うには、request()
の後のメソッドのチェーンで async()
メソッドを呼び出します。以下に例を示します。
Future<Response> res = client.target("http://example.org/bookstore/books/123") .request("application/xml") .async() .get();
非同期呼び出しを行うと、戻り値は java.util.concurrent.Future
オブジェクトになります。非同期呼び出しの詳細は、「クライアントの非同期処理」 を参照してください。