| Oracle® Fusion Middleware Oracle WebLogic Server 12.1.3 RESTful Webサービスの開発と保護 12c (12.1.3) E57546-02 |
|
![]() 前 |
![]() 次 |
この章では、Jersey 1.18 Java API for RESTful Web Services (JAX-RS) 1.1参照実装(RI)を使用して、Representational State Transfer (REST)アーキテクチャ・スタイルに従ったWebLogic Server 12.1.3内のJava EE Webサービス・クライアントを開発する方法について説明します。
この章の内容は次のとおりです:
次の表に、RESTful Webサービス・クライアントを開発するのに必要なタスクの一部をまとめます。高度なタスクの詳細は、「高度なRESTful Webサービス・クライアント・タスク」を参照してください。
表4-1 RESTful Webサービス・クライアントを開発するタスクの概要
| タスク | 詳細情報 |
|---|---|
|
|
|
|
Webリソースのインスタンスを作成します。 |
|
|
リソースへリクエストを送信します。たとえば、リソース情報をGET、PUT、POSTおよびDELETEするHTTPリクエストです。 |
|
|
リソースからレスポンスを受信します。 |
|
Oracle JDeveloperを使用したRESTful Webサービス・クライアントの開発の詳細は、『Oracle JDeveloperによるアプリケーションの開発』のRESTful Webサービスおよびクライアントの作成に関する項を参照してください。
|
注意: この項で説明されているクライアント・パッケージ(com.sun.jerseyパッケージ、ネストされたパッケージおよびweblogic.jaxrs.api.clientパッケージを含む)のサポートは、WebLogic Serverのこのリリースでは非推奨となっています。
Jersey 2.5.1 (JAX-RS 2.0 RI)クライアントAPIを使用するように、RESTfulクライアント・アプリケーションを早急にアップデートすることをお薦めします。詳細は、「Jersey 2.5.1 (JAX-RS 2.0 RI)を使用したRESTful Webサービス・クライアントの開発」を参照してください。 ただし、Oracle Web Services Manager (OWSM)のポリシーを使用してRESTfulクライアント・アプリケーションを保護する必要がある場合、現時点では、Jersey 2.5.1 (JAX-RS RI)クライアントAPIにアップデートできません。この機能は今後のリリースでサポートされる予定です。 |
次に、例3-1「簡単なRESTful Webサービス」で定義されたRESTful Webサービスの呼出しに使用できる簡単なRESTful Webサービス・クライアントの例を示します。この例の内容は次のとおりです。
ClientインスタンスがクライアントAPIにアクセスするために作成されます。詳細は、「クライアント・インスタンスの作成と構成」を参照してください。
WebResourceインスタンスがWebリソースにアクセスするために作成されます。詳細は、「Webリソース・インスタンスの作成」を参照してください。
getリクエストがリソースに送信されます。詳細は、 「リソースへのリクエストの送信」を参照してください。
レスポンスは文字列値で返されます。レスポンスの受信についての詳細は、「リソースからのレスポンスの受信」を参照してください。
追加の例を「RESTful Webサービスの詳細」に示します。
例4-1 Jersey 1.18 (JAX-RS 1.1 RI)を使用した簡単なRESTful Webサービス・クライアント
package samples.helloworld.client;
import weblogic.jaxrs.api.client.Client;
import com.sun.jersey.api.client.WebResource;
public class helloWorldClient {
public helloWorldClient() {
super();
}
public static void main(String[] args) {
Client c = Client.create();
WebResource resource = c.resource("http://localhost:7101/RESTfulService/jersey/helloworld");
String response = resource.get(String.class);
System.out.println(response);
}
}
Jersey JAX-RS RIクライアントAPIにアクセスするには、weblogic.jaxrs.api.client.Clientクラスのインスタンスを作成します。
|
注意: かわりに、com.sun.jersey.api.client.Clientクラスのインスタンスを作成することもできます。ただし、「OWSMポリシーを使用したRESTful Webサービスとクライアントの保護」で説明しているような、Oracle Web Services Manager (OWSM)ポリシーを使用したRESTfulクライアントの保護などのOracle拡張機能は利用できません。 |
クライアント・インスタンスの作成時、com.sun.jersey.api.client.config.ClientConfigを定義してcreateメソッドに情報を渡すことで、必要に応じて、表4-2で定義しているクライアント構成プロパティを渡すことができます。詳細は、『jersey-bundle 1.18 API』のClientConfigインタフェースを参照してください。
表4-2 RESTful Webサービス・クライアント構成プロパティ
| プロパティ | 説明 |
|---|---|
|
|
クライアントがレスポンス・エンティティをバッファリングする必要があるかどうかと、ある場合には |
|
|
チャンク化されたエンコードのサイズを指定する整数値です。0以下の値はデフォルトのチャンク・サイズが使用されることを示します。設定されない場合、チャンクは使用されません。 |
|
|
接続タイムアウト間隔をミリ秒単位で指定する整数値です。このプロパティが0または設定されない場合、間隔は無限です。 |
|
|
|
|
|
読取りタイムアウト間隔をミリ秒単位で指定する整数値です。このプロパティが0または設定されない場合、間隔は無限です。 |
例4-2にクライアント・インスタンスの作成方法の例を示します。
例4-2 クライアント・インスタンスの作成
import weblogic.jaxrs.api.client.Client;
...
public static void main(String[] args) {
Client c = Client.create();
...
例4-3に、クライアント・インスタンスを作成し、構成プロパティをcreateに渡す方法の例を示します。
例4-3 クライアント・インスタンスの作成および構成
import com.sun.jersey.api.client.*;
import weblogic.jaxrs.api.client.Client;
...
public static void main(String[] args) {
ClientConfig cc = new DefaultClientConfig();
cc.getProperties().put(ClientConfig.PROPERTY_FOLLOW_REDIRECTS, true);
Client c = Client.create(cc);
...
また、getPropertiesメソッドから戻されたマップにプロパティを設定するか、または特定のsetterメソッドを呼び出すことで、クライアントの作成後にクライアント・インスタンスを構成することもできます。
例4-4に、クライアントを作成した後で構成する方法の例を示します。この例の内容は次のとおりです。
PROPERTY_FOLLOW_REDIRECTSはgetPropertiesメソッドから戻されたマップにプロパティを設定することにより構成されます。
PROPERTY_CONNECT_TIMEOUTはsetterメソッドを使用して構成されます。
例4-4 クライアント・インスタンスの作成後の構成
import com.sun.jersey.api.client.*;
import weblogic.jaxrs.api.client.Client;
...
public static void main(String[] args) {
Client c = Client.create();
c.getProperties().put(ClientConfig.PROPERTY_FOLLOW_REDIRECTS, true);
c.setConnectTimeout(3000);
...
例4-5に、基本認証を使用するようにクライアント・インスタンスを構成する方法の例を示します。
例4-5 基本認証を使用するクライアント・インスタンスの構成
import javax.ws.rs.core.MediaType;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
...
Client c = Client.create();
c.addFilter(new HTTPBasicAuthFilter("weblogic", "weblogic1"));
WebResource resource = c.resource("http://localhost:7001/management/tenant-monitoring/datasources/JDBC%20Data%20Source-0");
String response = resource.accept("application/json").get(String.class); //application/xml
// resource.accept(MediaType.APPLICATION_JSON_TYPE).get(String.class);
System.out.println(response);
...
RESTful Webサービスにリクエストを送信するには、URIで指定したリソースにアクセスするためにcom.sun.jersey.api.client.WebResourceまたはcom.sun.jersey.api.client.AsyncWebResourceのインスタンスを作成する必要があります。WebResourceまたはAsyncWebResourceインスタンスはクライアント・インスタンスに対して定義された構成を継承します。詳細は、『jersey-bundle 1.18 API』で次を参照してください。
|
注意: クライアント・インスタンスはコストの高いリソースなので、複数のWebリソースを作成する場合、可能ならば1つのクライアント・インスタンスを再利用することを推奨します。 |
例4-6に、http://example.com/helloworldにホストされたWebリソースへのインスタンスを作成する方法の例を示します。
例4-6 Webリソース・インスタンスの作成
import com.sun.jersey.api.client.*;
import weblogic.jaxrs.api.client.Client;
...
public static void main(String[] args) {\
...
Client c = Client.create();
WebResource resource = c.resource("http://example.com/helloWorld");
...
例4-6に、http://example.com/helloworldにホストされた非同期Webリソースへのインスタンスを作成する方法の例を示します。
次の項で説明するように、WebResourceまたはAsyncWebResourceインスタンスを使用して、関連するWebリソースへのリクエストを構築します。
Webリソースへのリクエストは、com.sun.jersey.api.client.RequestBuilderインタフェースで定義したように、ビルダー・パターンを使用して構造化されます。RequestBuilderインタフェースはcom.sun.jersey.api.client.WebResource、com.sun.jersey.api.client.AsyncWebResourceおよびその他のリソース・クラスにより実装されます。
表4-3で定義されたメソッドを使用してリクエストを構築することができ、HTTPリクエスト・メソッドが続きます(「HTTPリクエストの送信方法」を参照)。リクエストの構築方法の例を次の項で示します。
詳細は、『jersey 1.18 bundle API』のRequestBuilderのメソッドを参照してください。
表4-3 リクエストの構築
| メソッド | 説明 |
|---|---|
|
|
有効なメディア・タイプを定義します。「Acceptヘッダーの構成方法」を参照してください。 |
|
|
|
|
|
設定するcookieを追加します |
|
|
リクエスト・エンティティを構成します。「リクエスト・エンティティの構成方法」を参照してください。 |
|
|
HTTPヘッダーおよび値を追加します。「Acceptヘッダーの構成方法」を参照してください。 |
|
|
メディア・タイプを構成します。「リクエスト・エンティティの構成方法」を参照してください。 |
表4-4に、HTTPリクエストを送信するのに使用できるWebResourceおよびAsyncWebResourceの各メソッドを示します。
AsyncWebResourceの場合、java.util.concurrent.Future<V>オブジェクトが返されます。このオブジェクトは後で、実行を妨げずに計算結果へアクセスする際に使用できます。詳細は、Java EE 6 Platform API仕様のFuture<V>インタフェースのメソッドを参照してください。
表4-4 HTTPリクエストを送信するためのWebResourceメソッド
| メソッド | 説明 |
|---|---|
|
|
リソースの表現を取得するためにHTTP GETメソッドを呼び出します。 |
|
|
指定したリソースの表現を作成または更新するためにHTTP POSTメソッドを呼び出します。 |
|
|
リソースの表現を更新するためにHTTP PUTメソッドを呼び出します。 |
|
|
リソースの表現を削除するためにHTTP DELETEメソッドを呼び出します。 |
レスポンスにエンティティ(または表現)が含まれる場合、インスタンスのJavaタイプはHTTPメソッド内で宣言される必要があります。
例4-8に、HTTP GETリクエストの送信方法の例を示します。この例では、レスポンス・エンティティはStringのインスタンスであることが要求されます。レスポンス・エンティティはStringインスタンスにデシリアライズされます。
例4-8 HTTP GETリクエストの送信
import com.sun.jersey.api.client.WebResource;
...
public static void main(String[] args) {
...
WebResource resource = c.resource("http://example.com/helloWorld");
String response = resource.get(String.class);
...
例4-9に、HTTP PUTリクエストの送信とエンティティfoo:barのWebリソースへの配置方法を示します。この例では、レスポンス・エンティティはcom.sun.jersey.api.client.ClientResponseのインスタンスであることが要求されます。
例4-9 HTTP PUTリクエストの送信
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.ClientResponse;
...
public static void main(String[] args) {
...
WebResource resource = c.resource("http://example.com/helloWorld");
ClientResponse response = resource.put(ClientResponse.class, "foo:bar");
...
汎用型を使用してHTTPリクエストを送信する場合、実行時に型のイレイジャを回避するために、汎用型を保持するcom.sun.jersey.api.client.GenericTypeオブジェクトを作成する必要があります。詳細は、Java EE 6 Platform API仕様のGenericTypeクラスを参照してください。
例4-10に、汎用型を保持するGenericTypeを使用する、汎用型を使用したHTTPリクエストの送信方法の例を示します。
javax.ws.rs.core.MultivaluedMapを定義し、WebリソースでqueryParamsメソッドを使用して、HTTPリクエストの一部としてマップを渡すことで、GETリクエスト内の問合せパラメータを渡すことができます。
詳細は、Java EE 6 API仕様のMultivaluedMapインタフェースを参照してください。
例4-11に、GETリクエスト内のパラメータをhttp://example.com/helloworldにホストされたWebリソースに渡し、次のリクエストURIの結果となる例を示します: http://example.com/base?param1=val1¶m2=val2
例4-11 問合せパラメータを渡す
import com.sun.jersey.api.client.WebResource;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.MultivaluedMapImpl;
...
public static void main(String[] args) {
...
WebResource resource = c.resource("http://example.com/helloWorld");
MultivaluedMap queryParams = new MultivaluedMapImpl();
queryParams.add("param1", "val1");
queryParams.add("param2", "val2");
String response = resource.queryParams(queryParams).get(String.class);
...
Webリソースでacceptメソッドを使用して、リクエストのAcceptヘッダーを構成します。
例4-12に、http://example.com/helloworldにホストされたWebリソースへのGETリクエストに、有効なMIMEメディア・タイプとしてtext/plainを指定する方法の例を示します。
Webリソースでheaderメソッドを使用して、カスタム・ヘッダーをリクエストに追加します。
例4-13に、値BARを含むカスタム・ヘッダーFOOを、http://example.com/helloworldにホストされたWebリソースへのGETリクエストに追加する方法の例を示します。
Webリソースでentityメソッドを使用して、リクエスト・エンティティとタイプを構成します。または、Webリソースでtypeメソッドのみを使用してリクエスト・エンティティのタイプを構成することもできます。
例4-14に、リクエスト・エンティティおよびタイプの構成方法の例を示します。
例4-14 リクエスト・エンティティの構成
import com.sun.jersey.api.client.WebResource;
...
public static void main(String[] args) {
...
WebResource resource = c.resource("http://example.com/helloWorld");
String response = resource.entity(request, MediaType.TEXT_PLAIN_TYPE).get(String.class);
...
例4-15に、リクエスト・エンティティのメディア・タイプのみを構成する方法の例を示します。
「HTTPリクエストの送信方法」で説明したように、HTTPメソッドの呼出し時に、レスポンスにエンティティのJavaタイプ(または表現)を定義します。
レスポンス・メタデータが必要な場合、Javaタイプcom.sun.jersey.api.client.ClientResponseをレスポンス・タイプとして宣言します。ClientResponseタイプを使用すると、ステータス、ヘッダーおよびエンティティ情報にアクセスできます。
次の項で、ClientResponseを使用してアクセスできるレスポンス・メタデータについて説明します。詳細は、『jersey-bundle 1.18 API』のClientResponseクラスを参照してください。
ClientResponseオブジェクトでgetStatusメソッドを使用して、クライアント・レスポンスのステータスにアクセスします。有効なステータス・コードのリストは、『jersey-bundle 1.18 API』のClientResponse.Statusを参照してください。
例4-12に、レスポンスのステータス・コードにアクセスする方法の例を示します。
例4-16 リクエストのステータスへのアクセス
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.ClientResponse;
...
public static void main(String[] args) {
...
WebResource resource = c.resource("http://example.com/helloWorld");
ClientResponse response = resource.get(ClientResponse.class);
int status = response.getStatus();
...
ClientResponseオブジェクトでgetEntityメソッドを使用して、レスポンス・エンティティを取得します。
例4-12に、レスポンス・エンティティを取得する方法の例を示します。
例4-17 レスポンス・エンティティの取得
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.ClientResponse;
...
public static void main(String[] args) {
...
WebResource resource = c.resource("http://example.com/helloWorld");
ClientResponse response = resource.get(ClientResponse.class);
String entity = response.getEntity(String.class);
...
高度なRESTful Webサービス・クライアント・タスク(次に示すタスクを含む)の詳細は、『Jersey 1.18 User Guide』を参照してください。
表現タイプの追加
フィルタの使用
HTTP URLConnectionを使用したセキュリティの有効化
Oracle Fusion MiddlewareまたはWebLogic Serverがローカルにインストールされていない環境からRESTful Webサービスを呼び出す場合、CLASSPATHにOracle Fusion MiddlewareまたはWebLogic Serverクラスの完全なセットが含まれていれば、スタンドアロン・クライアントJARファイルを使用してWebサービスを呼び出すことができます。
スタンドアロン・クライアントJARは、基本的なJAX-RSのクライアント側の機能およびOWSMセキュリティ・ポリシーをサポートしています。
クライアント・アプリケーションでスタンドアロン・クライアントJARファイルを使用するには、次の手順を実行します。
Oracle JDeveloperなど好みのIDEを使用して、Java SEクライアントを作成します。詳細は、『Oracle JDeveloperによるアプリケーションの開発』のWebサービスとクライアントの開発および保護に関する項を参照してください。
ORACLE_HOME/oracle_common/modules/clients/com.oracle.jersey.fmw.client_12.1.3.jarファイルを、Oracle Fusion Middlewareをホストするコンピュータからクライアント・コンピュータにコピーします。ORACLE_HOMEは、Oracle Fusion Middlewareのインストール時にOracleホームとして指定したディレクトリです。
たとえば、クライアント・アプリケーションで使用している他のクラスが格納されているディレクトリにファイルをコピーします。
JARファイルをCLASSPATHに追加します。
|
注意: CLASSPATHには、スタンドアロン・クライアントJARファイルで使用されるAntクラスのサブセットを含むJARファイル(ant.jar)が確実に格納されるようにしてください。このJARファイルは通常、Antディストリビューションのlibディレクトリ内にあります。 |
Oracle Web Services Manager (OWSM)ポリシーの環境を構成します。この手順は任意であり、OWSMセキュリティ・ポリシーをRESTfulクライアントにアタッチする場合にのみ必要です。
|
注意: この手順は、このリリースではOWSMポリシーを使用して保護できないため、Jersey 2.5.1 (JAX-RS 2.0 RI)を使用して構築されたRESTful Webサービスおよびクライアントに適用されません。 |
必要な構成手順は、アタッチされるポリシーのタイプによって異なります。以下に例を示します。その他の構成要件は、『Oracle Platform Security Servicesによるアプリケーションの保護』のOPSSを使用するためのJava SEアプリケーションの構成に関する項を参照してください。
|
注意: Jersey JAX-RS RIクライアントAPIにアクセスするには、weblogic.jaxrs.api.client.Clientクラスのインスタンスを作成する必要があります。
かわりに、 |
例: 基本認証
たとえば、oracle/wss_http_token_client_policyセキュリティ・ポリシーを使用して基本認証をサポートするには、次の手順を実行します。
jps-config-jse.xmlファイルおよびaudit-store.xmlファイルを、domain_home/config/fmwconfigディレクトリ(domain_homeはドメインの名前と場所)から、RESTfulクライアントにアクセス可能な場所にコピーします。
手順2でファイルをコピーした場所にウォレット(cwallet.sso)を作成します。このウォレットには、oracle.wsm.securityという名前のマップと、クライアント・アプリケーションが使用する資格証明キー名(たとえばweblogic-csf-key)を定義します。
ファイルcwallet.ssoの場所は、構成ファイルjps-config-jse.xmlの<serviceInstance要素で指定されます。詳細は、『Oracle Platform Security Servicesによるアプリケーションの保護』のウォレットベースの資格証明ストアの使用に関する項を参照してください。
Javaコマンド・ラインで次のプロパティを渡して、手順1でコピーしたJPS構成ファイルを定義します。
-Doracle.security.jps.config=<pathToConfigFile>
詳細は、『Oracle Platform Security Servicesによるアプリケーションの保護』の「シナリオ3: Java SEアプリケーションの保護」を参照してください。
例: SSL
たとえば、SSLポリシーをサポートするには、次の手順を実行します。
jps-config-jse.xmlファイルおよびaudit-store.xmlファイルを、domain_home/config/fmwconfigディレクトリ(domain_homeはドメインの名前と場所)から、RESTfulクライアントにアクセス可能な場所にコピーします。
Javaコマンド・ラインで次のプロパティを渡して、手順1でコピーしたJPS構成ファイルを定義します。
手順1でコピーしたJPS構成ファイルを定義する:
-Doracle.security.jps.config=<pathToConfigFile>
詳細は、『Oracle Platform Security Servicesによるアプリケーションの保護』の「シナリオ3: Java SEアプリケーションの保護」を参照してください。
信頼できる証明書を含むトラスト・ストアを定義する:
-Djavax.net.ssl.trustStore=<trustStore>
詳細は、『Oracle Platform Security Servicesによるアプリケーションの保護』のLDAPへの一方向SSL接続の設定に関する項に記載されている、Java SEアプリケーションの場合のWebLogic Serverの設定に関する項を参照してください。
トラスト・ストアのパスワードを定義する:
-Djavax.net.ssl.trustStorePassword=<password>
次の表に、RESTful Webサービス・クライアントを開発するのに必要なタスクの一部をまとめます。
表4-5 RESTful Webサービス・クライアントを開発するタスクの概要
| タスク | 詳細情報 |
|---|---|
|
|
『Jersey 2.5.1 User Guide』の「Creating and configuring a Client instance」 |
|
Webリソースをターゲット指定します。 |
『Jersey 2.5.1 User Guide』の「Targeting a web resource」 |
|
WebTargetでリソースを指定します。 |
『Jersey 2.5.1 User Guide』の「Targeting a web resource」 |
|
HTTPリクエストを呼び出します。 |
『Jersey 2.5.1 User Guide』の「Invoking a HTTP request」 |
Oracle JDeveloperを使用したRESTful Webサービス・クライアントの開発の詳細は、『Oracle JDeveloperによるアプリケーションの開発』のRESTful Webサービスおよびクライアントの作成に関する項を参照してください。
次に、例3-1「簡単なRESTful Webサービス」で定義されたRESTful Webサービスの呼出しに使用できる簡単なRESTful Webサービス・クライアントの例を示します。この例の内容は次のとおりです。
Clientインスタンスが作成され、WebTargetが定義されます。
Webリソースにアクセスするためのリソース・パスが定義されます。
Invocation.Builderを使用してgetリクエストがリソースに送信されます。
レスポンスは文字列値で返されます。
例4-18 Jersey 2.5.1 (JAX-RS 2.0 RI)を使用した簡単なRESTful Webサービス・クライアント
package samples.helloworld.client;
...
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
public class helloWorldClient{
public static void main(String[] args) {
Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:7101/restservice");
WebTarget resourceWebTarget;
resourceWebTarget = target.path("resources/helloworld");
Invocation.Builder invocationBuilder;
invocationBuilder = resourceWebTarget.request(
MediaType.TEXT_PLAIN_TYPE);
Response response = invocationBuilder.get();
System.out.println(response.getStatus());
System.out.println(response.readEntity(String.class));
...
}
...
}
詳細は、『Jersey 2.5.1 User Guide』の「Client API」を参照してください。