Oracle® Fusion Middleware Oracle WebLogic Server RESTful Webサービスの開発と保護 12c (12.2.1.1.0) E79317-01 |
|
前 |
この付録の内容は次のとおりです。
注意:
この項で説明されているクライアント・パッケージ(com.sun.jersey
パッケージ、ネストされたパッケージおよびweblogic.jaxrs.api.client
パッケージを含む)のサポートは、WebLogic Serverのこのリリースでは非推奨となっています。
JAX-RS 2.0クライアントAPIを使用するように、RESTfulクライアント・アプリケーションを早急に更新することをお薦めします。詳細は、「RESTful Webサービス・クライアントを開発するタスクの概要」を参照してください
Jersey 1.xのサーバー側APIはサポートされなくなりました。かわりに、対応する標準のJAX-RS 2.0またはJersey 2.xサーバーAPIを使用する必要があります。
次の表に、RESTful Webサービス・クライアントを開発するのに必要なタスクの一部をまとめます。高度なタスクの詳細は、「高度なRESTful Webサービス・クライアント・タスク」を参照してください
表A-1 RESTful Webサービス・クライアントを開発するタスクの概要
タスク | 詳細情報 |
---|---|
|
|
Webリソースのインスタンスを作成します。 |
|
リソースへリクエストを送信します。たとえば、リソース情報をGET、PUT、POSTおよびDELETEするHTTPリクエストです。 |
|
リソースからレスポンスを受信します。 |
Oracle JDeveloperを使用したRESTful Webサービス・クライアントの開発の詳細は、Oracle JDeveloperによるアプリケーションの開発のRESTful Webサービスおよびクライアントの作成を参照してください。
次に、例2-1で定義されたRESTful Webサービスを呼び出す場合に使用できる簡単なRESTful Webサービス・クライアントの例を示します。この例の内容は次のとおりです。
Client
インスタンスがクライアントAPIにアクセスするために作成されます。詳細は、「クライアント・インスタンスの作成と構成」を参照してください
WebResource
インスタンスがWebリソースにアクセスするために作成されます。詳細は、「Webリソース・インスタンスの作成」を参照してください
get
リクエストがリソースに送信されます。詳細は、 「リソースへのリクエストの送信」を参照してください
レスポンスは文字列値で返されます。レスポンスの受信についての詳細は、「リソースからのレスポンスの受信」を参照してください
追加の例を「RESTful Webサービスの詳細」に示します
例A-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
クラスのインスタンスを作成することもできます。
クライアント・インスタンスの作成時、com.sun.jersey.api.client.config.ClientConfig
を定義してcreate
メソッドに情報を渡すことで、必要に応じて、表A-2で定義しているクライアント構成プロパティを渡すことができます。詳細は、『jersey-bundle 1.18 API』の
ClientConfigインタフェースを参照してください。
表A-2 RESTful Webサービス・クライアント構成プロパティ
プロパティ | 説明 |
---|---|
|
クライアントがレスポンス・エンティティをバッファリングする必要があるかどうかと、ある場合には |
|
チャンク化されたエンコードのサイズを指定する整数値です。0以下の値はデフォルトのチャンク・サイズが使用されることを示します。設定されない場合、チャンクは使用されません。 |
|
接続タイムアウト間隔をミリ秒単位で指定する整数値です。このプロパティが0または設定されない場合、間隔は無限です。 |
|
|
|
読取りタイムアウト間隔をミリ秒単位で指定する整数値です。このプロパティが0または設定されない場合、間隔は無限です。 |
例A-2にクライアント・インスタンスの作成方法の例を示します。
例A-2 クライアント・インスタンスの作成
import weblogic.jaxrs.api.client.Client; ... public static void main(String[] args) { Client c = Client.create(); ...
例A-3に、クライアント・インスタンスを作成し、構成プロパティをcreate
に渡す方法の例を示します。
例A-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メソッドを呼び出すことで、クライアントの作成後にクライアント・インスタンスを構成することもできます。
例A-4に、クライアントを作成した後で構成する方法の例を示します。この例の内容は次のとおりです。
PROPERTY_FOLLOW_REDIRECTS
はgetProperties
メソッドから戻されたマップにプロパティを設定することにより構成されます。
PROPERTY_CONNECT_TIMEOUT
はsetterメソッドを使用して構成されます。
例A-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); ...
例A-5に、基本認証を使用するようにクライアント・インスタンスを構成する方法の例を示します。
例A-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つのクライアント・インスタンスを再利用することを推奨します。
例A-6に、http://example.com/helloworld
にホストされたWebリソースへのインスタンスを作成する方法の例を示します。
例A-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"); ...
例A-7に、http://example.com/helloworld
にホストされた非同期Webリソースへのインスタンスを作成する方法の例を示します。
例A-7 非同期Webリソース・インスタンスの作成
import com.sun.jersey.api.client.*; import weblogic.jaxrs.api.client.Client; ... public static void main(String[] args) {\ ... Client c = Client.create(); AsyncWebResource asyncResource = c.asyncResource("http://example.com/helloWorld"); ...
次の項で説明するように、WebResource
またはAsyncWebResource
インスタンスを使用して、関連するWebリソースへのリクエストを構築します。
Webリソースへのリクエストは、com.sun.jersey.api.client.RequestBuilder
インタフェースで定義したように、ビルダー・パターンを使用して構造化されます。RequestBuilder
インタフェースはcom.sun.jersey.api.client.WebResource
、com.sun.jersey.api.client.AsyncWebResource
およびその他のリソース・クラスにより実装されます。
表A-3で定義されたメソッドを使用してリクエストを構築でき、HTTPリクエスト・メソッドが続きます(HTTPリクエストの送信方法を参照)。リクエストの構築方法の例を次の項で示します。
詳細は、『jersey 1.18 bundle API』の
RequestBuilderのメソッドを参照してください。
表A-3 リクエストの構築
メソッド | 説明 |
---|---|
|
有効なメディア・タイプを定義します。「Acceptヘッダーの構成方法」を参照してください |
|
|
|
設定するcookieを追加します |
|
リクエスト・エンティティを構成します。「リクエスト・エンティティの構成方法」を参照してください |
|
HTTPヘッダーおよび値を追加します。「Acceptヘッダーの構成方法」を参照してください |
|
メディア・タイプを構成します。「リクエスト・エンティティの構成方法」を参照してください |
表A-4に、HTTPリクエストの送信に使用できるWebResource
およびAsyncWebResource
の各メソッドを示します。
AsyncWebResource
の場合、java.util.concurrent.Future<V>
オブジェクトが返されます。このオブジェクトは後で、実行を妨げずに計算結果へアクセスする際に使用できます。詳細は、Java Platform, Standard Edition 6 API仕様のFuture<V>
インタフェース・メソッドを参照してください。
表A-4 HTTPリクエストを送信するためのWebResourceメソッド
メソッド | 説明 |
---|---|
|
リソースの表現を取得するためにHTTP GETメソッドを呼び出します。 |
|
リソースのメタ情報を取得するためにHTTP HEADメソッドを呼び出します。 |
|
JAX-RSサービスがサポートするHTTPメソッドを取得するためにHTTP OPTIONSメソッドを呼び出します。 |
|
指定したリソースの表現を作成または更新するためにHTTP POSTメソッドを呼び出します。 |
|
リソースの表現を更新するためにHTTP PUTメソッドを呼び出します。 |
|
リソースの表現を削除するためにHTTP DELETEメソッドを呼び出します。 |
レスポンスにエンティティ(または表現)が含まれる場合、インスタンスのJavaタイプはHTTPメソッド内で宣言される必要があります。
例A-8に、HTTP GETリクエストの送信方法の例を示します。この例では、レスポンス・エンティティはString
のインスタンスであることが要求されます。レスポンス・エンティティはString
インスタンスにデシリアライズされます。
例A-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); ...
例A-9に、HTTP PUTリクエストの送信とエンティティfoo:bar
のWebリソースへの配置方法を示します。この例では、レスポンス・エンティティはcom.sun.jersey.api.client.ClientResponse
のインスタンスであることが要求されます。
例A-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
オブジェクトを作成する必要があります。詳細は、jersey-bundle 1.18 APIのGenericType
クラスを参照してください。
例A-10に、汎用型を保持するGenericType
を使用する、汎用型を使用したHTTPリクエストの送信方法の例を示します。
例A-10 汎用型を使用したHTTP GETリクエストの送信
import com.sun.jersey.api.client.WebResource; ... public static void main(String[] args) { ... WebResource resource = c.resource("http://example.com/helloWorld"); List<String> list = resource.get(new GenericType<List<String>>() {}); ...
javax.ws.rs.core.MultivaluedMap
を定義し、WebリソースでqueryParams
メソッドを使用して、HTTPリクエストの一部としてマップを渡すことで、GETリクエスト内の問合せパラメータを渡すことができます。
詳細は、Java EE 6 API仕様の
MultivaluedMapインタフェースを参照してください。
例A-11に、GETリクエスト内のパラメータをhttp://example.com/helloworld
にホストされたWebリソースに渡し、次のリクエストURIの結果となる例を示します: http://example.com/base?param1=val1¶m2=val2
例A-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
ヘッダーを構成します。
例A-12に、http://example.com/helloworld
にホストされたWebリソースへのGETリクエストに、有効なMIMEメディア・タイプとしてtext/plain
を指定する方法の例を示します。
例A-12 Acceptヘッダーの構成
import com.sun.jersey.api.client.WebResource; ... public static void main(String[] args) { ... WebResource resource = c.resource("http://example.com/helloWorld"); String response = resource.accept("text/plain").get(String.class); ...
Webリソースでheader
メソッドを使用して、カスタム・ヘッダーをリクエストに追加します。
例A-13に、値BAR
を含むカスタム・ヘッダーFOO
を、http://example.com/helloworld
にホストされたWebリソースへのGETリクエストに追加する方法の例を示します。
例A-13 カスタム・ヘッダーの追加
import com.sun.jersey.api.client.WebResource; ... public static void main(String[] args) { ... WebResource resource = c.resource("http://example.com/helloWorld"); String response = resource.header("FOO", "BAR").get(String.class); ...
Webリソースでentity
メソッドを使用して、リクエスト・エンティティとタイプを構成します。または、Webリソースでtype
メソッドのみを使用してリクエスト・エンティティのタイプを構成することもできます。
例A-14に、リクエスト・エンティティおよびタイプの構成方法の例を示します。
例A-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); ...
例A-15に、リクエスト・エンティティのメディア・タイプのみを構成する方法の例を示します。
例A-15 リクエスト・エンティティのメディア・タイプのみの構成
import com.sun.jersey.api.client.WebResource; ... public static void main(String[] args) { ... WebResource resource = c.resource("http://example.com/helloWorld"); String response = resource.type(MediaType.TEXT_PLAIN_TYPE).get(String.class); ...
「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を参照してください。
例A-16に、レスポンスのステータス・コードにアクセスする方法の例を示します。
例A-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
メソッドを使用して、レスポンス・エンティティを取得します。
例A-17に、レスポンス・エンティティを取得する方法の例を示します。
例A-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); ...
下位互換性のために、表A-5で示したサーブレット・クラスを参照するデプロイメントがサポートされています。次の表に、RESTful Webサービス・アプリケーションを3.0以前のサーブレットとパッケージ化するために、web.xml
デプロイメント記述子で更新する要素を示します。
表A-5 RESTful Webサービス・アプリケーションの3.0以前のサーブレットとのパッケージ化
要素 | 説明 |
---|---|
|
この要素を対象のサーブレット名に設定します。 |
|
この要素を、すべてのWebリクエストをJerseyサーブレットに委任するように、次のいずれかのクラスに設定します。
|
|
この要素を、 <init-param>
<param-name>
javax.ws.rs.Application
</param-name>
<param-value>
ApplicationSubclassName
</param-value>
</init-param>
また、次のようにアプリケーション内でパッケージを宣言することもできます。 <init-param>
<param-name>
com.sun.jersey.config.property.packages
</param-name>
<param-value>
project1
</param-value>
</init-param>
|
|
サーブレットにマップされる基底URIパターンとして設定します。 指定されない場合、次の優先順位に従って、次の値のいずれかが使用されます。
この情報がリソースの基底URIで使用される方法の詳細は、「実行時の処理: 基底URIの構成方法」を参照してください |
次に、javax.ws.rs.core.Application
を拡張するクラスがweb.xml
とパッケージ化されない場合、web.xml
ファイルを更新する方法の例を示します。
例A-18 3.0以前のサーブレット用web.xmlの更新
<web-app> <servlet> <servlet-name>Jersey Web Application</servlet-name> <servlet-class>weblogic.jaxrs.server.portable.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.resourceConfigClass</param-name> <param-value>com.sun.jersey.api.core.PackagesResourceConfig</param-value> </init-param> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>org.foo.rest;org.bar.rest</param-value> </init-param> ... </servlet> ... </web-app>