11.4.1 Webリソースクライアントのユースケース
ここでは,RESTful Webサービス用クライアントAPIの基本的なユースケースについて説明します。Webリソースを呼び出すには,次の三つの方法があります。
-
Java型を指定してHTTPリクエストおよびHTTPレスポンスを送受信する方法
-
Java型を指定してHTTPリクエストを送信し,汎用型(ClientResponse)でHTTPレスポンスを受信する方法
-
汎用型(ClientRequestおよびClientResponse)でHTTPリクエストおよびHTTPレスポンスを送受信する方法
それぞれのパターンについて次に説明します。
- 〈この項の構成〉
(1) Java型を指定してHTTPリクエストおよびHTTPレスポンスを送受信する
Java型を指定してHTTPリクエストおよびHTTPレスポンスを送受信する場合のユースケースを次の図に示します。
- 注※1
-
マップに含まれるプロパティはさまざまな方法で参照・変更できます。詳細は「11.4.3 プロパティとフィーチャの設定」を参照してください。
- 注※2
-
クライアントAPIのさまざまなメソッドを利用してリクエストを生成できます。詳細は「11.4.3 プロパティとフィーチャの設定」を参照してください。
- 注※3
-
HTTPリクエストのエンティティボディを文字列の形式で,HTTP POSTメソッドを使用して送信し,同様に文字列の形式でHTTPレスポンスのエンティティボディを受信します。
クライアントAPIではDELETE,GET,HEAD,OPTIONS,PUTの各HTTPメソッドに対応するメソッドもあります。詳細は「11.4.3 プロパティとフィーチャの設定」を参照してください。
- 注※4
-
HttpURLConnectionが行います。JAX-RSエンジンはHTTPメッセージの作成まで行い,HTTP通信についてはJava SEのHttpURLConnectionに委譲しています。
図11-1に対応したコーディング例は次のとおりです。
Client client = Client.create(); Map<String, Object> properties = client.getProperties(); properties.put(ClientConfig.PROPERTY_READ_TIMEOUT, 10000); WebResource proxy = client.resource( "http://example.org/helloworld" ); WebResource.Builder builder = proxy.accept( MediaType.APPLICATION_JSON_TYPE ); builder = builder.type( MediaType.TEXT_PLAIN_TYPE ); String response = builder.post( String.class, "Some Request" );
この例での処理の流れについて説明します。
-
Clientクラスのcreate()スタティックメソッドを使用してClientオブジェクトを生成します。
-
ClientクラスのgetProperties()メソッドで取得した変更可能なプロパティマップにプロパティを設定します。なお,プロパティは別の方法でも設定できます。プロパティとフィーチャの詳細については「11.4.3 プロパティとフィーチャの設定」を参照してください。
-
Clientクラスのresource()メソッドを呼び出してWebResourceオブジェクトを生成し,WebResourceオブジェクトのメソッドを呼び出してHTTPリクエストを作成していきます。WebResourceクラスはビルダパターンでデザインされており,HTTPリクエストを生成する各種メソッドが含まれています。
-
WebResource.Builderクラスのpost()メソッドを呼び出してHTTP通信を行います。WebResourceクラスには,DELETE,GET,HEAD,OPTIONS,PUTの各HTTPメソッドに対応するメソッドもあります。
(2) Java型を指定してHTTPリクエストを送信し,汎用型(ClientResponse)でHTTPレスポンスを受信する
受信するHTTPレスポンスは汎用型,つまりClientResponseオブジェクトでも取得できます。ClientResponseオブジェクトで取得した場合,ユーザは受信したHTTPレスポンスの各種情報(HTTPヘッダ,エンティティボディ,およびステータスコード)を取得できます。
エンティティボディは,getEntity()メソッドを使用することで,Java型を指定して取得できます。ClientResponseクラスでサポートしているメソッドについては「25.1 クライアントAPIのインタフェースおよびクラスのサポート範囲」を参照してください。
受信するHTTPレスポンスをClientResponseオブジェクトで取得する方法は次のとおりです。
WebResourceオブジェクトを使用してHTTPリクエストを生成する場合は,HTTPレスポンスのJava型を指定するパラメタにClientResponse.classを指定してください。「11.4.1(1) Java型を指定してHTTPリクエストおよびHTTPレスポンスを送受信する」で示したコーディング例では,String.classの代わりにClientResponse.classを指定してください。
Clientクラスを使用してHTTPリクエストを直接送信する場合は,HTTPレスポンスは常にClientResponseです。Clientクラスの詳細については,「11.4.1(3) 汎用型でHTTPリクエストおよびHTTPレスポンスを送受信する」を参照してください。
(3) 汎用型でHTTPリクエストおよびHTTPレスポンスを送受信する
汎用型(ClientRequestおよびClientResponse)でHTTPリクエストおよびHTTPレスポンスを送受信する場合のユースケースを次の図に示します。
- 注※1
-
マップに含まれるプロパティはさまざまな方法で参照・変更できます。詳細は「11.4.3 プロパティとフィーチャの設定」を参照してください。
- 注※2
-
クライアントAPIのさまざまなメソッドを利用してリクエストを生成できます。詳細は「11.4.3 プロパティとフィーチャの設定」を参照してください。
- 注※3
-
HTTPリクエストのエンティティボディを文字列の形式で,HTTP POSTメソッドを使用して送信し,同様に文字列の形式でHTTPレスポンスのエンティティボディを受信します。
クライアントAPIではDELETE,GET,HEAD,OPTIONS,PUTの各HTTPメソッドに対応するメソッドもあります。詳細は「11.4.3 プロパティとフィーチャの設定」を参照してください。
- 注※4
-
HttpURLConnectionが行います。JAX-RSエンジンはHTTPメッセージの作成まで行い,HTTP通信についてはJava SEのHttpURLConnectionに委譲しています。
上記の図に対応したコーディング例は次のとおりです。
Client client = Client.create(); Map<String, Object> properties = client.getProperties(); properties.put(ClientConfig.PROPERTY_READ_TIMEOUT, 10000); ClientRequest ro; ClientRequest.Builder builder = ClientRequest.create(); builder.accept( MediaType.APPLICATION_JSON_TYPE ); builder.type( MediaType.TEXT_PLAIN_TYPE ); builder.entity("Some Request"); ro = builder.build(new URI("http://example.org/helloworld"), "POST"); ClientResponse clientResponse = client.handle(ro); //The actual response in the form of String String response = clientResponse.getEntity(String.class);
この例での処理の流れについて説明します。
-
Clientクラスのcreate()スタティックメソッドを使用してClientオブジェクトを生成します。
-
ClientクラスのgetProperties()メソッドで取得した変更可能なプロパティマップにプロパティを設定します。プロパティとフィーチャの詳細については,「11.4.3 プロパティとフィーチャの設定」を参照してください。
-
ClientRequestクラスのcreate()メソッドを呼び出してClientRequest.Builderオブジェクトを生成し,ClientRequest.Builderオブジェクトのメソッドを呼び出してHTTPリクエストを作成していきます。ClientRequest.Builderクラスはビルダパターンでデザインされており,HTTPリクエストを生成する各種メソッドが含まれています。
-
ClientRequest.Builderクラスのbuild()メソッドを呼び出しClientRequestオブジェクトを生成します。次にClientクラスのhandle()メソッドを呼び出してHTTP通信を行います。