プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle WebLogic Server RESTful Webサービスの開発と保護
12c (12.2.1.3.0)
E90341-02
目次へ移動
目次

前

A 以前のJersey/JAX-RSリリースとの互換性

Jersey 1.x (JAX-RS 1.1 RI)機能の一部は、Oracle WebLogic Serverで非推奨またはサポート対象外になりましたが、下位互換性のために残されています。

Jersey 1.18 (JAX-RS 1.1 RI)を使用したRESTful Webサービス・クライアントの開発

いくつかのクライアント・パッケージ(com.sun.jerseyパッケージ、ネストされたパッケージおよびweblogic.jaxrs.api.clientパッケージを含む)のサポートは、Oracle 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サービス・クライアントを開発するタスクの概要

タスク 詳細情報

weblogic.jaxrs.api.client.Clientクラスのインスタンスを作成および構成します。

クライアント・インスタンスの作成および構成

Webリソースのインスタンスを作成します。

Webリソース・インスタンスの作成

リソースへリクエストを送信します。たとえば、リソース情報をGET、PUT、POSTおよびDELETEするHTTPリクエストです。

リソースへのリクエストの送信

リソースからレスポンスを受信します。

リソースからのレスポンスの受信

Oracle JDeveloperを使用したRESTful Webサービス・クライアントの開発の詳細は、Oracle JDeveloperによるアプリケーションの開発のRESTful Webサービスおよびクライアントの作成を参照してください。

RESTful Webサービス・クライアントの例

次に、RESTful Webサービス・クライアントを使用して、例2-1で定義されたRESTful Webサービスを呼び出す方法を示す簡単な例を示します。この例の内容は次のとおりです。

追加の例を「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 APIClientConfigインタフェースを参照してください。

表A-2 RESTful Webサービス・クライアント構成プロパティ

プロパティ 説明

PROPERTY_BUFFER_RESPONSE_ENTITY_ON_EXCEPTION

クライアントがレスポンス・エンティティをバッファリングする必要があるかどうかと、ある場合にはUniformInterfaceExceptionがスローされるとリソースを閉じるかどうかを指定するブール値です。このプロパティのデフォルトはtrueです。

PROPERTY_CHUNKED_ENCODING_SIZE

チャンク化されたエンコードのサイズを指定する整数値です。0以下の値はデフォルトのチャンク・サイズが使用されることを示します。設定されない場合、チャンクは使用されません。

PROPERTY_CONNECT_TIMEOUT

接続タイムアウト間隔をミリ秒単位で指定する整数値です。このプロパティが0または設定されない場合、間隔は無限です。

PROPERTY_FOLLOW_REDIRECTS

3xxレスポンスで宣言されたURIに自動的にリダイレクトされるかどうかを指定するブール値です。このプロパティのデフォルトはtrueです。

PROPERTY_READ_TIMEOUT

読取りタイムアウト間隔をミリ秒単位で指定する整数値です。このプロパティが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_REDIRECTSgetPropertiesメソッドから戻されたマップにプロパティを設定することにより構成されます。

  • 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);
...

Webリソース・インスタンスの作成

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.WebResourcecom.sun.jersey.api.client.AsyncWebResourceおよびその他のリソース・クラスにより実装されます。

表A-3で定義されたメソッドを使用してリクエストを構築でき、HTTPリクエスト・メソッドが続きます(HTTPリクエストの送信方法を参照)。リクエストの構築方法の例を次の項で示します。

jersey 1.18 bundle APIRequestBuilderのメソッドを参照してください。

表A-3 リクエストの構築

メソッド 説明

accept()

有効なメディア・タイプを定義します。「Acceptヘッダーの構成方法」を参照してください

acceptLanguage()

acceptLanguageメソッドを使用して有効な言語を定義します。

cookie()

設定するcookieを追加します

entity()

リクエスト・エンティティを構成します。「リクエスト・エンティティの構成方法」を参照してください

header()

HTTPヘッダーおよび値を追加します。「Acceptヘッダーの構成方法」を参照してください

type()

メディア・タイプを構成します。「リクエスト・エンティティの構成方法」を参照してください

HTTPリクエストの送信方法

表A-4に、HTTPリクエストの送信に使用できるWebResourceおよびAsyncWebResourceの各メソッドを示します。

AsyncWebResourceの場合、java.util.concurrent.Future<V>オブジェクトが返されます。このオブジェクトは後で、実行を妨げずに計算結果へアクセスする際に使用できます。Java Platform, Standard Edition 6 API仕様Future<V>インタフェース・メソッドを参照してください。

表A-4 HTTPリクエストを送信するためのWebResourceメソッド

メソッド 説明

get()

リソースの表現を取得するためにHTTP GETメソッドを呼び出します。

head()

リソースのメタ情報を取得するためにHTTP HEADメソッドを呼び出します。

options()

JAX-RSサービスがサポートするHTTPメソッドを取得するためにHTTP OPTIONSメソッドを呼び出します。

post()

指定したリソースの表現を作成または更新するためにHTTP POSTメソッドを呼び出します。

put()

リソースの表現を更新するためにHTTP PUTメソッドを呼び出します。

delete()

リソースの表現を削除するために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 APIGenericTypeクラスを参照してください。

例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&param2=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);
...

Acceptヘッダーの構成方法

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 APIClientResponseクラスを参照してください。

リクエストのステータスへのアクセス方法

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);
...

高度なRESTful Webサービス・クライアント・タスク

高度なRESTful Webサービス・クライアント・タスク(次に示すタスクを含む)の詳細は、『Jersey 1.18 User Guide』を参照してください。

  • 表現タイプの追加

  • フィルタの使用

  • HTTP URLConnectionを使用したセキュリティの有効化

Pre-3.0サーブレットとともにパッケージ化されるJersey 1.18 (JAX-RS 1.1 RI)デプロイメントのサポート

下位互換性のために、サーブレット・クラスのサブセットを参照しているデプロイメントは、このリリースのOracle WebLogic Serverでサポートされます。表A-5を参照してください。このようなサーブレット・クラスと、それに対応する要素がリストされています。RESTful Webサービス・アプリケーションを3.0以前のサーブレットにパッケージ化するには、その要素をデプロイメント記述子web.xmlで更新する必要があります。

表A-5 RESTful Webサービス・アプリケーションの3.0以前のサーブレットとのパッケージ化

要素 説明

<servlet-name>

この要素を対象のサーブレット名に設定します。

<servlet-class>

この要素を、すべてのWebリクエストをJerseyサーブレットに委任するように、次のいずれかのクラスに設定します。

  • weblogic.jaxrs.server.portable.servlet.ServletContainer

  • com.sun.jersey.spi.container.servlet.ServletContainer

<init-param>

この要素を、javax.ws.rs.core.Applicationを拡張するクラスを定義するように設定します。

<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> 

<servlet-mapping>

サーブレットにマップされる基底URIパターンとして設定します。

指定されない場合、次の優先順位に従って、次の値のいずれかが使用されます。

<servlet-mapping>@ApplicationPathの両方が指定されている場合、<servlet-mapping>が優先されます。

この情報がリソースの基底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>