ヘッダーをスキップ

Oracle Application Server Web Services開発者ガイド
10g(10.1.3.1.0)

B31868-01
目次
目次
索引
索引

戻る 次へ

15 J2SE Webサービス・クライアントのアセンブル

この章では、J2SEプラットフォーム向けのWebサービス・クライアントの開発に関する情報を提供します。この章の内容は、次のとおりです。

J2SE Webサービス・クライアントの概要

J2SEクライアントは、J2EEクライアントとは異なり、サービスのルックアップ、ならびにWebサービスにアクセスするクラスのインスタンスの作成およびメンテナンスなどの、基礎となる作業を行います。開発者は、コンテナに依存できないため、独自のサービスの作成および管理、ならびにWebサービスのアクセスに必要なすべてのランタイム環境の可用性の確保を自身で行う必要があります。

次の各項では、静的スタブ・クライアントおよびDynamic Invocation Interface(DII)クライアントについて説明します。

静的スタブ・クライアントの概要

WebServicesAssemblerコマンドのgenProxyは、指定されたWSDLドキュメントから静的スタブを生成します。生成されるスタブは、javax.xml.rpc.Stubインタフェースおよびサービス・エンドポイント・インタフェースを実装したものです。また、生成されるスタブは、HTTPトランスポートおよびSOAPプロトコルに明示的にバインドされます。生成されるスタブをインスタンス化し、そのメソッドを直接起動することで、リクエストを関連するWebサービスに送信できます。

さらに、WebServicesAssemblerは、クライアントが静的スタブによってWebサービスと対話できるようにするクライアント・ユーティリティ・クラスを生成します。このユーティリティ・クライアント・クラスの名前は<WSDL_port_name>Client.javaです。このクラスは、スタブのインスタンスの作成に必要なすべてのステップを処理します。ユーティリティ・クライアントは、インスタンス化して、リモート・サービスの操作を起動するために使用できます。


注意

クライアント・ユーティリティ・クラス・ファイルは、WebServicesAssemblerを実行するたびに再生成されます。独自のコードは別のファイルに格納しておくことを強くお薦めします。そうしないと、変更した内容が失われます。 


JAX-RPC Dynamic Invocation Interfaceの概要

JAX-RPC Dynamic Invocation Interfaceを使用すると、サービス名またはリモート・メソッドのシグネチャを実行時の前に確認できない場合でも、リモートWebサービス操作を起動できます。

DIIは、OC4Jでのjavax.xml.rpc.Callインタフェースの実装によってサポートされています。javax.xml.rpc.Serviceクラスは、オーバーロードされたService.createCall()メソッドを使用することで、Callインスタンスのファクトリとして動作します。Callインタフェースの作成後、このインタフェースに含まれるゲッターおよびセッターを使用して、ポート・タイプ、操作名、サービス・エンドポイント・アドレス、およびリモート・メソッドの実行に必要なその他の属性を構成します。

関連項目

DIIクライアントを使用してWebサービスを起動する例は、「Dynamic Invocation Interfaceを使用したWebサービスの起動方法」を参照してください。 

J2SE Webサービス・クライアントのアセンブル方法

この項の内容は、次のとおりです。

前提条件

開始する前に、次のファイルと情報を用意してください。

静的スタブを使用したJ2SE Webサービス・クライアントのアセンブル手順

WebServicesAssemblerで静的スタブを使用して、J2SE Webサービス・クライアントを作成できます。静的スタブを作成する手順は、次のとおりです。

  1. WSDLのURI、出力ディレクトリ名、パッケージ名および「前提条件」の項に記載したその他の情報およびファイルを、WebServicesAssemblerのgenProxyコマンドに入力します。次のコマンドは、クライアント・プロキシを生成し、build/src/clientに格納します。クライアント・アプリケーションはこのスタブを使用して、リモート・サービスでの操作を起動します。

    コマンドライン:

    java -jar wsa.jar -genProxy 
                      -output build/src/client/ 
                      -wsdl http://localhost:8888/hello/HelloService?WSDL 
                      -packageName oracle.demo.hello
    

    Antタスク:

    <oracle:genProxy
                wsdl="http://localhost:8888/hello/HelloService?WSDL"
                output="build/src/client"
                packageName="oracle.demo.hello"/>
    

    このコマンドおよびAntタスクの説明:

    • genProxy: J2SE Webサービス・クライアントから使用可能な静的プロキシ・スタブを作成します。「genProxy」を参照してください。

    • wsdl: WSDLドキュメントの絶対ファイル・パス、相対ファイル・パスまたはURLを指定します。「wsdl」を参照してください。

    • output: 生成されるファイルを格納するディレクトリを指定します。そのディレクトリが存在しない場合は、作成します。「output」を参照してください。

    • packageName: JAX-RPCマッピング・ファイルにパッケージ名が宣言されていない場合に、生成されたクラス用に使用されるパッケージ名を指定します。「packageName」を参照してください。

    genProxyの必須およびオプションの引数の詳細は、「genProxy」を参照してください。

  2. genProxyによって作成されたクライアント・ユーティリティ・クラス・ファイルを、アプリケーション・クライアントとして使用するか、またはテンプレートとして使用して独自のクライアント・コードを記述します。クライアント・ユーティリティ・クラス・ファイルは、genProxyによって作成されるいくつかのファイルの1つです。

    また、クライアント・ユーティリティ・クラス・ファイルは、エンドポイントをテストするためにも使用できます。クライアント・ユーティリティ・クラス・ファイルの作成例は、例15-2「HelloInterfacePortClient.javaのリスト」を参照してください。このファイルの詳細は、「Webサービス・クライアント・アプリケーションの記述」を参照してください。

  3. クライアント・ファイルをコンパイルし、クラスパスに置きます。

    クライアントをコンパイルする前に、クラスパス上にある適切なJARをリストします。クライアントのクラスパスで使用可能なすべてのJARファイルのリストについては、表A-2「クライアント・サイド・プロキシを使用するクライアントのクラスパス・コンポーネント」を参照してください。個々のJARをリストするかわりに、クライアントのクラスパスにクライアント側のJARとしてwsclient_extended.jarを含めることができます。このJARファイルには、Webサービス・クライアントをコンパイルおよび実行するために必要なすべてのクラスが含まれます。これらのクラスは、表A-2にリストされている各JARファイルに含まれているものです。wsclient_extended.jarおよびクライアントのクラスパスの詳細は、「Webサービス・プロキシのクラスパスの設定」を参照してください。

  4. J2SEクライアントをコマンドラインから実行します。

サンプルのWSDLファイル

例15-1は、クライアント生成に使用するHelloService.wsdlのリストの一部です。このWSDLから生成されるファイルの1つが、例15-2のクライアント・ユーティリティ・クラス・ファイルです。

リスト断片には、クライアント・ユーティリティ・クラス・ファイルの生成に使用される、WSDLファイル内のいくつかのエントリが記載されています。次に例を示します。

これらの各要素は、HelloService.wsdlのリスト断片では太字で示されています。

例15-1    クライアント・ユーティリティ・クラス・ファイルで使用される要素を含むWSDLフラグメント

<definitions 
    ... 
  >
    <types>
        <schema targetNamespace="http://hello.demo.oracle/" ... 
xmlns="http://www.w3.org/2001/XMLSchema"
           ...
            <complexType name="sayHello">
                <sequence>
                    <element name="name" nillable="true" type="string"/>
                </sequence>
            </complexType>
            <complexType name="sayHelloResponse">
                <sequence>
                    <element name="result" nillable="true" type="string"/>
                </sequence>
            </complexType>
            <element name="sayHelloElement" type="tns:sayHello"/>
            <element name="sayHelloResponseElement" type="tns:sayHelloResponse"/>
        </schema>
    </types>
    <message name="HelloInterface_sayHelloResponse">
        <part name="parameters" element="tns:sayHelloResponseElement"/>
    </message>
    <message name="HelloInterface_sayHello">
        <part name="parameters" element="tns:sayHelloElement"/>
    </message>
    <portType name="HelloInterface">
        <operation name="sayHello">
            <input message="tns:HelloInterface_sayHello"/>
            <output message="tns:HelloInterface_sayHelloResponse"/>
        </operation>
    </portType>
    <binding name="HelloInterfacePortBinding" type="tns:HelloInterface">
        <soap:binding style="document" 
transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="sayHello">
            <soap:operation soapAction="http://hello.demo.oracle/:sayHello"/>
            <input>
                <soap:body use="literal" parts="parameters"/>
            </input>
            <output>
                <soap:body use="literal" parts="parameters"/>
            </output>
        </operation>
    </binding>
    <service name="HelloService">
        <port name="HelloInterfacePort" binding="tns:HelloInterfacePortBinding">
            <soap:address location="HelloService"/>
        </port>
    </service>
</definitions>

Webサービス・クライアント・アプリケーションの記述

この項の内容は、次のとおりです。

クライアント・ユーティリティ・クラス・ファイルの概要

genProxyコマンドにより、Webサービス・メソッドの起動に使用できるクライアント・ユーティリティ・クラス・ファイルが生成されます。このファイルを、アプリケーション・クライアントとして使用するか、またはテンプレートとして使用して独自のアプリケーション・クライアント・コードを記述できます。


注意

クライアント・ユーティリティ・クラス・ファイルは、genProxyを実行するたびに再生成されます。テストするためにこのファイルにコードを追加した場合、プロキシを再生成すると、その変更が失われます。本番用コードとして使用するクライアント・コードは、このユーティリティ・クラスの外部に保管する必要があります。  


genProxyコマンドは、クライアント・ユーティリティ・クラス・ファイル名を導出する際、ポート名に接尾辞Clientを追加します。たとえば、ポート名がHelloInterfacePortの場合は、genProxyにより、ファイルHelloInterfacePortClient.javaが生成されます。

関連項目

genProxyコマンドによって生成されたクライアント・ユーティリティ・クラス・ファイルの例は、例15-2「HelloInterfacePortClient.javaのリスト」を参照してください。 

クライアント・ユーティリティ・クラスは、Webサービス実装のプロキシとしての役割を持ちます。クライアント・サイド・プロキシ・コードにより、SOAPリクエストの構成、パラメータのマーシャリングおよびアンマーシャリングが実行されます。プロキシ・クラスを使用すると、WebサービスへのアクセスやWebサービスのレスポンス処理に関する、SOAPリクエストの作成作業およびデータのマーシャリング作業が軽減されます。

クライアント・ユーティリティ・クラス・ファイルの最も重要な部分は、javax.xml.rpc.Serviceオブジェクトを作成し、サービスで使用可能な操作を取得するファクトリ・コードです。Serviceオブジェクトは、生成されるスタブ・クラスのインスタンスとして動作します。

クライアント・ユーティリティ・クラス・ファイルの次のコード行に注目してください。

public HelloInterfaceClient() throws Exception {
    ServiceFactory factory = ServiceFactory.newInstance();
    _port = ((HelloService)factory.loadService
                 (HelloService.class)).getHelloInterfacePort();
}

独自のアプリケーション・クライアントを記述する場合は、このコードを追加して、サービス・ファクトリを作成し、ポートの実装を取得する必要があります。

サービス・ファクトリの作成手順

次の手順は、このコードの説明です。

  1. javax.xml.rpc.ServiceFactoryの新しいインスタンスを作成するか、または既存のインスタンスを使用します。

    ServiceFactory factory = ServiceFactory.newInstance();
    
  2. loadServiceメソッドを使用して、特定のサービス・エンドポイント・インタフェースに対してサービスをロードします。これにより、Service型のオブジェクトが戻されます。さらに、このオブジェクトにより、リクエストしたサービス・エンドポイント・インタフェースが実装されます。

    (HelloService)factory.loadService(HelloService.class)
    

    この例では、戻されたServiceが、サービス・エンドポイント・インタフェースHelloServiceにキャストされています。

  3. get...()メソッドを使用して、必要なポートを取得します。省略記号("...")は、WSDLのport name要素の値を表します。

    HelloService.getHelloInterfacePort();
    

    この例では、メソッド名はgetHelloInterfacePort()です。この名前の中のHelloInterfacePortは、WSDL内のport nameの値です。メソッドにより、HelloInterfacePortのJava実装が戻されます。

例15-2は、クライアント・ユーティリティ・クラス・ファイルHelloInterfacePortClient.javaを示します。これは、例15-1HelloService.wsdlからgenProxyコマンドで生成されたものです。

Serviceオブジェクトを作成し、サービスで使用可能な操作を取得するコード行は、太字で示されています。生成されたコードを使用して、SESSION_MAINTAIN_PROPERTYシステム・プロパティを設定し、Webサービスがステートフルであることをクライアントに警告できることに注意してください。クライアントがサーバー・サイドのステートフルWebサービスと連携して動作するとき、セッションは維持されます。セッションを維持することで、サービスに対する以降のリクエストが高速になります。

例15-2    HelloInterfacePortClient.javaのリスト

import oracle.webservices.transport.ClientTransport;
import oracle.webservices.OracleStub;
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.Stub;

public class HelloInterfacePortClient {
    private HelloInterface _port;

    public HelloInterfacePortClient() throws Exception {
        ServiceFactory factory = ServiceFactory.newInstance();
        _port =((HelloService)factory.loadService(
           HelloService.class)).getHelloInterfacePort();
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            HelloInterfacePortClient myPort = new HelloInterfacePortClient();
            System.out.println("calling " + myPort.getEndpoint());
            // Add your own code here

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     * delegate all operations to the underlying implementation class.
     */
    // sayHello
    public String sayHello(String name) throws java.rmi.RemoteException {
        return _port.sayHello(name);
    }

    /**
     * used to access the JAX-RPC level APIs
     * returns the interface of the port instance
     */
    public oracle.demo.hello.HelloInterface getPort() {
        return _port;
    }

    public String getEndpoint() {
        return (String) ((Stub)
_port)._getProperty(Stub.ENDPOINT_ADDRESS_PROPERTY);
    }

    public void setEndpoint(String endpoint) {
        ((Stub) _port)._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY,
endpoint);
    }

    public String getPassword() {
        return (String) ((Stub) _port)._getProperty(Stub.PASSWORD_PROPERTY);
    }

    public void setPassword(String password) {
        ((Stub) _port)._setProperty(Stub.PASSWORD_PROPERTY, password);
    }

    public String getUsername() {
        return (String) ((Stub) _port)._getProperty(Stub.USERNAME_PROPERTY);
    }

    public void setUsername(String username) {
        ((Stub) _port)._setProperty(Stub.USERNAME_PROPERTY, username);
    }

    public void setMaintainSession(boolean maintainSession) {
        ((Stub) _port)._setProperty(Stub.SESSION_MAINTAIN_PROPERTY, new
Boolean(maintainSession));
    }

    public boolean getMaintainSession() {
        return ((Boolean) ((Stub)
_port)._getProperty(Stub.SESSION_MAINTAIN_PROPERTY)).booleanValue();
    }

   /**
     * returns the transport context
     */
    public ClientTransport getClientTransport() {
        return ((OracleStub) _port).getClientTransport();
    }
} 

HTTP 1.1向けのチャンク・データ転送の有効化方法

プロトコルがHTTP 1.1の場合、OracleAS Web Servicesでは、メッセージのチャンク転送エンコーディングが可能です。チャンク・データ転送は、J2SEスタブ、J2EEスタブおよびDII Webサービス・クライアントから起動できます。

関連項目

この機能を有効化する方法の詳細は、「HTTP 1.1向けのチャンク・データ転送の有効化方法」を参照してください。 

J2SEクライアント上でのSOAPメッセージの文字コード設定方法

デフォルトでは、Oracle Application Server Web Servicesでアセンブルされたクライアントは、UTF-8の文字でエンコードされたSOAPエンベロープを持つリクエスト・メッセージを送信します。この動作をオーバーライドする場合は、次のOracle固有のプロパティを設定します。

oracle.webservices.ClientConstants.CHARACTER_SET_ENCODING

このプロパティは、J2SEクライアントまたはJ2EEクライアントの文字コードを設定するために使用します。

関連項目

CHARACTER_SET_ENCODINGプロパティの使用方法の詳細は、「SOAPメッセージの文字コードの設定方法」を参照してください。 

Webサービス・クライアント・スタブでのCookieの設定方法

クライアント・スタブは、HTTPリクエストで使用されるCookieの設定に使用できます。CookieクラスはHTTP Cookieを表し、Oracle Applications Server 10gHTTPClientパッケージにあります。Cookieに次のコンストラクタがあります。

Cookie (java.lang.String name, java.lang.String value, java.lang.String domain, java.lang.String path, java.util.Date expires, boolean secure)

expires以外のすべてのパラメータが、Cookieコンストラクタの必須パラメータです。

Cookieに対して指定するドメインは、次のいずれかである必要があります。

次に説明するのは、HTTPリクエストでCookieを設定する方法の一般的な手順です。

  1. java.util.Mapオブジェクトを作成して、Cookieを組み込みます。

  2. Oracle Applications Server 10g HTTPClientパッケージに付属するCookieクラスを使用して、1つ以上のCookieを作成します。

  3. CookieをMapオブジェクトにロードします。

  4. プロパティoracle.webservices.ClientConstants.COOKIE_MAPを設定します。

    プロパティの値は、HTTPClient.Cookie型のアイテムおよびキーが含まれるjava.util.Mapオブジェクトです。

  5. javax.xml.rpc.session.SESSION_MAINTAIN_PROPERTYランタイム・プロパティ・セットをtrueに設定します。

    このプロパティは、Webサービスがステートフルであることをクライアントに警告しています。このプロパティをtrue以外に設定すると、Cookieが無視されます。

例15-3は、2つのCookieの値を設定するスタブ・コードを示しています。cookieMap変数は、java.util.Map型として宣言され、その値をHashMapから取得します。Cookieコンストラクタは、cookieおよびcookie2の2つのCookieの定義に使用されます。各cookieMap.put行で、CookieがHashMapに追加されます。ClientConstants.COOKIE_MAPcookieMapに設定されており、また、Stub.SESSION_MAINTAIN_PROPERTYが指定されてtrueに設定されています。

例15-3    クライアント・スタブのCookie設定

import HTTPClient.Cookie;
   Map cookieMap = new HashMap();
 
   Cookie cookie = new Cookie("name", "value", ".oracle.com", "/",  null, false);
   Cookie cookie2 = new Cookie("name2", "value2", ".oracle.com", "/", null, false);
   cookieMap.put(cookie, cookie);
   cookieMap.put(cookie2, cookie2);
 
   ((Stub) port)._setProperty(ClientConstants.COOKIE_MAP, cookieMap);
   ((Stub) port)._setProperty(Stub.SESSION_MAINTAIN_PROPERTY, Boolean.TRUE);
... 

Dynamic Invocation Interfaceを使用したWebサービスの起動方法

Dynamic Invocation Interface(DII)を使用してWebサービスを起動するには、いくつかのステップが必要です。各ステップでは、通常いくつかの選択が必要です。この項の終わりにある各例に、各ステップで行われた選択が示されます。

DIIを使用してWebサービスを起動する方法は、次のような全般的なステップで構成されます。

  1. コール・オブジェクトを作成します。

  2. パラメータを登録します。

  3. Webサービスを起動します。

コール・オブジェクトは、WSDLの有無を問わず作成できます。WSDLがないか、コールの動的作成にWSDLを使用しない場合は、「基本コール」の手順に従います。コールを構成するためのWSDLがある場合は、「構成コール」の手順に従います。

基本コール

基本コールでは、WSDLがなくても、コール・オブジェクトが動的に作成されます。基本コールの構成方法の詳細は、次の手順を参照してください。

  1. WSDLなしでコール・オブジェクトを動的に作成します。たとえば、次の例を参照してください。

  2. パラメータを登録します。

  3. Webサービスを起動します。Webサービスの起動は、SOAPElementを使用してもJavaバインディングを使用しても行えます。

構成コール

構成コールの場合、コール・オブジェクトはWSDLから構成されます。構成コールの構成方法の詳細は、次の手順を参照してください。

  1. コール・オブジェクトの構成用にWSDLを用意します。たとえば、次の例を参照してください。

  2. パラメータを登録します。構成コールでパラメータの登録が必要になるのは、次のようなケースです。

  3. Webサービスを起動します。Webサービスの起動は、SOAPElementを使用してもJavaバインディングを使用しても行えます。

DIIを使用するWebサービス・クライアントの例

この項では、基本コールまたは構成コールを使用してWebサービスを起動する様々なクライアントの例を示します。

次のコードSnippetは、後続のコード例で使用されるimport文です。

import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.Service;
import javax.xml.rpc.Call;
import javax.xml.rpc.ParameterMode;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPFactory;
import javax.xml.soap.SOAPElement;
import java.net.URL;
import oracle.webservices.OracleCall;
import oracle.xml.parser.v2.XMLElement;

例15-4    パラメータ登録とJavaバインディングのある基本コール

// (1) Creation of call object without WSDL. String endpoint = "http://localhost:8888/echo/DiiDocEchoService"; ServiceFactory sf = ServiceFactory.newInstance(); Service service = sf.createService(new QName("http://echo.demo.oracle/", "tns")); Call call = service.createCall(); // (2) Configuration of call and registration of parameters. call.setTargetEndpointAddress(endpoint); call.setProperty(Call.SOAPACTION_USE_PROPERTY, new Boolean(true)); call.setProperty(Call.SOAPACTION_URI_PROPERTY, ""); call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY, "http://schemas.xmlsoap.org/soap/encoding/"); call.setProperty(Call.OPERATION_STYLE_PROPERTY, "rpc"); QName QNAME_TYPE_STRING = new QName("http://www.w3.org/2001/XMLSchema", "string"); call.addParameter("s", QNAME_TYPE_STRING, ParameterMode.IN); call.setReturnType(QNAME_TYPE_STRING); // (3) Invocation. System.out.println("Response is " + call.invoke(new Object[]{"hello"}));

例15-5    Javaバインディングあり、パラメータ登録なしの構成コール

/// (1) Creation of call object using WSDL. String namespace = "http://www.xmethods.net/sd/CurrencyExchangeService.wsdl"; URL wsdl=new URL(namespace); ServiceFactory factory = ServiceFactory.newInstance(); QName serviceName = new QName(namespace, "CurrencyExchangeService"); Service service = factory.createService(wsdl, serviceName); QName portName = new QName(namespace, "CurrencyExchangePort"); Call call = service.createCall(portName); // (2) Registration of parameters. // -> taken from the WSDL // (3) Configuration of operation and invocation. QName operationName = new QName("urn:xmethods-CurrencyExchange", "getRate"); call.setOperationName(operationName); Float rate = (Float) call.invoke(new Object[]{"usa", "canada"}); System.out.println("getRate: " + rate);

例15-6    ラッパー・パラメータ登録とJavaバインディングのある構成コール

// (1) Creation of call object using WSDL. String namespace = "http://server.hello/jaxws"; ServiceFactory factory = ServiceFactory.newInstance(); QName serviceName = new QName(namespace, "HelloImplService"); URL wsdl=new URL(namespace+"?WSDL"); Service service = factory.createService(wsdl, serviceName); QName portName = new QName(namespace, "HelloImpl"); Call call = service.createCall(portName); // (2) Registration of SayHello and SayHelloResponse wrapper classes // These must be available in the classpath. String TYPE_NAMESPACE_VALUE = "http://server.hello/jaxws"; QName reqQname = new QName(TYPE_NAMESPACE_VALUE,"sayHelloElement"); QName respQName = new QName(TYPE_NAMESPACE_VALUE,"sayHelloResponseElement"); call.addParameter("name", reqQname, SayHello.class, ParameterMode.IN ); call.setReturnType(respQName, SayHelloResponse.class ); // (3) Invocation SayHello input = new SayHello("Duke"); Object[] params = new Object[] { input }; SayHelloResponse result = (SayHelloResponse) call.invoke( params ); String response = result.getResult();

例15-7    SOAPElementあり、パラメータ登録なしの基本コール

// (1) Creation of call object without WSDL ServiceFactory sf = ServiceFactory.newInstance(); Service service = sf.createService(new QName("http://echo.demo.oracle/", "tns")); Call call = service.createCall(); call.setTargetEndpointAddress("http://localhost:8888/echo/DiiDocEchoService"); // (2) No registration of parameters // (3a) Direct creation of payload as SOAPElement SOAPFactory soapfactory = SOAPFactory.newInstance(); SOAPElement m1 = soapfactory.createElement("echoStringElement", "tns", "http://echo.demo.oracle/"); SOAPElement m2 = soapfactory.createElement("s", "tns", "http://echo.demo.oracle/"); m2.addTextNode("Bob"); m1.addChildElement(m2); System.out.println("Request is: "); ((XMLElement) m1).print(System.out); // (3b) Invocation SOAPElement resp = (SOAPElement) ((OracleCall) call).invoke(m1); System.out.println("Response is: "); ((XMLElement) resp).print(System.out);

例15-8    WSDL、複合型戻り値/パラメータ登録およびJavaバインディングのある構成コール

// (0) Preparing a complex argument value Integer req_I = new Integer( Integer.MAX_VALUE ); String req_s = "testDocLitBindingAnonymAll & <body>"; Integer req_inner_I = new Integer( Integer.MIN_VALUE ); String req_inner_s = "<inner> & <body>"; int[] req_inner_i = {0,Integer.MAX_VALUE, Integer.MIN_VALUE}; InnerSequence req_inner = new InnerSequence(); req_inner.setVarInteger( req_inner_I ); req_inner.setVarString ( req_inner_s ); req_inner.setVarInt ( req_inner_i ); EchoAnonymAllElement req = new EchoAnonymAllElement(); req.setVarInteger ( req_I ); req.setVarString ( req_s ); req.setInnerSequence( req_inner); // (1) Creation of call object using the WSDL String TARGET_NS = "http://soapinterop.org/DocLitBinding"; String TYPE_NS = "http://soapinterop.org/xsd"; String XSD_NS = "http://www.w3.org/2001/XMLSchema"; QName SERVICE_NAME = new QName( TARGET_NS, "DocLitBindingService" ); QName PORT_NAME = new QName( TARGET_NS, "DocLitBindingPort"); String wsdlUrl = "http://"+getProperty("HOST")+ ":"+getProperty("HTTP_PORT")+ "/doclit_binding/doclit_binding"; QName operation = new QName(TARGET_NS, "echoAnonymAll"); ServiceFactory factory = ServiceFactory.newInstance(); Service srv = factory.createService( new URL(wsdlUrl + "?WSDL"), SERVICE_NAME); Call call = srv.createCall( PORT_NAME, operation ); // (2) Registration of complex return parameter call.setReturnType(new QName(TYPE_NS, "EchoAnonymAllElement"), EchoAnonymAllElement.class); // (3) Invocation EchoAnonymAllElement res = (EchoAnonymAllElement) call.invoke( new Object[]{req} ); System.out.println( "AnonymAll body : " +res.getVarString() ); System.out.println( "AnonymAll inner : " +res.getInnerSequence() );

例15-9    document-literal起動およびSOAPElementあり、パラメータ登録なしの基本コール

// (1) Creation of Basic Call ServiceFactory sf = ServiceFactory.newInstance(); Service service = sf.createService(new QName("http://echo.demo.oracle/", "tns")); String endpoint="http://localhost:8888/test/echo"; Call call = service.createCall(); call.setTargetEndpointAddress(endpoint); // (2) No parameter registration // (3) Invocation using SOAPElement SOAPFactory soapfactory = SOAPFactory.newInstance(); SOAPElement m1 = soapfactory.createElement("echoStringElement", "tns", "http://echo.demo.oracle/"); SOAPElement m2 = soapfactory.createElement("s", "tns", "http://echo.demo.oracle/"); m2.addTextNode("Bob"); m1.addChildElement(m2); System.out.println("Request is: "); ((XMLElement) m1).print(System.out); SOAPElement resp = (SOAPElement) ((OracleCall) call).invoke(m1); System.out.println("Response is: "); ((XMLElement) resp).print(System.out);

例15-10    rpc-encoded起動、複合型パラメータ登録およびJavaバインディングのある構成コール

// (1) Creation of ConfiguredCall using WSDL ServiceFactory sf = ServiceFactory.newInstance(); String endpoint="http://localhost:8888/test/echo"; Service service = sf.createService(new java.net.URL(endpoint + "?WSDL"), new QName("http://echo.demo.oracle/", "DiiRpcEchoService")); Call call = service.createCall(new QName("http://echo.demo.oracle/", "HttpSoap11"), new QName("http://echo.demo.oracle/", "echoStrings")); call.setProperty(Call.SOAPACTION_USE_PROPERTY, new Boolean(true)); call.setProperty(Call.SOAPACTION_URI_PROPERTY, ""); call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY, "http://schemas.xmlsoap.org/soap/encoding/"); call.setProperty(Call.OPERATION_STYLE_PROPERTY, "rpc"); // (2) Registration of complex input and return arguments QName stringArray = new QName("http://echo.demo.oracle/", "stringArray"); call.addParameter("s", stringArray, String[].class, ParameterMode.IN); call.setReturnType(stringArray, String[].class); // (3) Invocation String[] request = new String[]{"bugs", "little_pieces", "candy"}; String[] resp = (String[]) call.invoke(new Object[]{request}); System.out.println("Response is: "); for (int i = 0; i < resp.length; i++) { System.out.print(resp[i] + " "); } System.out.println();

J2SE Webサービス・クライアントのアセンブルに対するツールのサポート

Oracle JDeveloperで、Webサービスを使用するクライアント・アプリケーションを作成できます。Oracle JDeveloperでは、OC4J J2SE Webサービス・クライアントがサポートされます。これは、WebサービスWSDL記述からのJavaスタブの作成を可能にするという形で行われます。生成したスタブを使用して、既存のWebサービスにアクセスできます。詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。

追加情報

詳細は、次を参照してください。


戻る 次へ
Oracle
Copyright © 2006 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引