第9章
この章では、Webサービスコンシューマ(Webサービスにアクセスするプログラム)を生成する「Webサービスウィザード」の使用について、基本手順と一般的なシナリオを説明します。トピックは次のとおりです。
Webサービスを作成する場合のウィザードの使用手順とシナリオについては、を参照してください。
Novell exteNd Director 開発環境のWebサービスウィザードを使用すると、Javaベースのコンシューマプログラムに必要なコードを生成し、標準(SOAPベース)のWebサービスにアクセスすることができます。生成されたコードでは、背後で行われるすべてのHTTP SOAP処理を取り扱い、コンシューマプログラムでWebサービスを「Javaリモートオブジェクト」(RMIを使用)として呼び出したり、そのメソッドを呼び出したりできるようにします。
入力する際、ウィザードでは、アクセスするWebサービスを説明するWSDLファイルが必要です。このファイルでは、次のようなさまざまなWebサービスの実装を処理できます。
ウィザードでは、JAX-RPC (Java API for XML-based RPC)およびNovell exteNd Web Services SDK (Novell exteNdに含まれているJAX-RPX実装)に基づいて、Javaソースファイルを生成します。JAX-RPCは、Webサービスサポートを提供するJ2EE仕様です。
生成されたファイルは、そのまま使用したり、必要に応じて変更したりできます。このJava指向の方法には、低レベルのSOAP APIをコーディングする代わりに、熟知しているRMIおよびJ2EEの技術を使用してWebサービスを処理できるという利点があります。
Webサービスの概念、標準、および技術の紹介については、を参照してください。
コンシューマプログラムの開発プロセスには、次の作業が含まれます。
プロジェクトのセットアップによる生成の準備
ウィザードによりコンシューマコードを生成するWebサービスを説明するWSDLファイルの提供
ウィザードの使用によるコンシューマファイルの生成
次に対するJavaソースを含む、ウィザードが作成する生成されたファイルの検査
実行するメソッド呼び出しおよび参照先Webサービスの場所を調整するための、生成されたファイルの編集
そのままの状態、または他のJavaアプリケーションにコンシューマコードを含むことによる、生成されたファイルの使用
開発環境(テスト用)および運用環境でのコンシューマプログラムの実行
Webサービスウィザードの使用を準備するには、次の操作を行います。
exteNd Director 開発環境で適切なプロジェクトをセットアップします。
作成するプロジェクトのタイプは、ウィザードによって生成されるコンシューマコードの最終的な使用方法により異なります。例を次に示します。
コンシューマコードの使用場所 |
作成するプロジェクト |
---|---|
標準のJavaアプリケーション(おそらくウィザードによって生成する単純なJavaクライアントクラスに基づく) |
JARプロジェクト |
J2EEアプリケーションクライアント |
CARプロジェクト |
JSPページまたはサーブレット |
WARプロジェクト |
Enterprise JavaBean |
EJB JARプロジェクト |
次に示すWebサービスSDK に必要なアーカイブを、プロジェクトに追加します。
生成、編集された後でコンシューマクラスをコンパイルできるように、プロジェクトのクラスパスを編集します。次のアーカイブを含める必要があります。
wssdk.jar、および(必要に応じて)Step 2に示したJARファイル
J2EEプロジェクトには、j2ee_api_1_n.jar (J2EEプロジェクトを作成するとexteNd Director 開発環境に自動的に含まれます)も必要です。
コンシューマコードを生成するには、ターゲットWebサービスを説明するWSDLファイルをWeb Service Wizardに提供する必要があります。ウィザードを開始する前に、このWSDLファイルの場所またはURLを取得しておくことが推奨されます。
一般的なシナリオは次のとおりです。
コンシューマコードを生成して、EMI (Equated Monthly Instalment) Calculatorという名前でXMethodsパブリックレジストリに一覧表示されているAutoloan .NET Webサービスを使用するとします。このWebサービスでは、特定の期間(月数)における毎月の返済額、利率、およびローン金額が計算され返されます。
この場合、www.xmethods.netというWebサイトにアクセスすると、対応する次のWSDLファイルのURLを見つけることができます。
http://upload.eraserver.net/circle24/autoloan.asmx?wsdl
このURLを提供すると、WebサービスウィザードではWSDKファイルを読み込み、Autoloan Webサービスについて必要な情報を取得します。
<?xml version="1.0" encoding="utf-8"?> <definitions xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s0="http://circle24.com/webservices/" targetNamespace="http://circle24.com/webservices/" xmlns="http://schemas.xmlsoap.org/wsdl/"> <types> <s:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://circle24.com/webservices/"> <s:element name="Calculate"> <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="Months" type="s:double" /> <s:element minOccurs="1" maxOccurs="1" name="RateOfInterest" type="s:double" /> <s:element minOccurs="1" maxOccurs="1" name="Amount" type="s:double" /> </s:sequence> </s:complexType> </s:element> <s:element name="CalculateResponse"> <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="CalculateResult" nillable="true" type="s:string" /> </s:sequence> </s:complexType> </s:element> <s:element name="string" nillable="true" type="s:string" /> </s:schema> </types> <message name="CalculateSoapIn"> <part name="parameters" element="s0:Calculate" /> </message> <message name="CalculateSoapOut"> <part name="parameters" element="s0:CalculateResponse" /> </message> <message name="CalculateHttpGetIn"> <part name="Months" type="s:string" /> <part name="RateOfInterest" type="s:string" /> <part name="Amount" type="s:string" /> </message> <message name="CalculateHttpGetOut"> <part name="Body" element="s0:string" /> </message> <message name="CalculateHttpPostIn"> <part name="Months" type="s:string" /> <part name="RateOfInterest" type="s:string" /> <part name="Amount" type="s:string" /> </message> <message name="CalculateHttpPostOut"> <part name="Body" element="s0:string" /> </message> <portType name="AutoloanSoap"> <operation name="Calculate"> <input message="s0:CalculateSoapIn" /> <output message="s0:CalculateSoapOut" /> </operation> </portType> <portType name="AutoloanHttpGet"> <operation name="Calculate"> <input message="s0:CalculateHttpGetIn" /> <output message="s0:CalculateHttpGetOut" /> </operation> </portType> <portType name="AutoloanHttpPost"> <operation name="Calculate"> <input message="s0:CalculateHttpPostIn" /> <output message="s0:CalculateHttpPostOut" /> </operation> </portType> <binding name="AutoloanSoap" type="s0:AutoloanSoap"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> <operation name="Calculate"> <soap:operation soapAction="http://circle24.com/webservices/Calculate" style="document" /> <input> <soap:body use="literal" /> </input> <output> <soap:body use="literal" /> </output> </operation> </binding> <binding name="AutoloanHttpGet" type="s0:AutoloanHttpGet"> <http:binding verb="GET" /> <operation name="Calculate"> <http:operation location="/Calculate" /> <input> <http:urlEncoded /> </input> <output> <mime:mimeXml part="Body" /> </output> </operation> </binding> <binding name="AutoloanHttpPost" type="s0:AutoloanHttpPost"> <http:binding verb="POST" /> <operation name="Calculate"> <http:operation location="/Calculate" /> <input> <mime:content type="application/x-www-form-urlencoded" /> </input> <output> <mime:mimeXml part="Body" /> </output> </operation> </binding> <service name="Autoloan"> <documentation>This Web Service mimics a Simple Autoloan calculator.</documentation> <port name="AutoloanSoap" binding="s0:AutoloanSoap"> <soap:address location="http://upload.eraserver.net/circle24/autoloan.asmx" /> </port> <port name="AutoloanHttpGet" binding="s0:AutoloanHttpGet"> <http:address location="http://upload.eraserver.net/circle24/autoloan.asmx" /> </port> <port name="AutoloanHttpPost" binding="s0:AutoloanHttpPost"> <http:address location="http://upload.eraserver.net/circle24/autoloan.asmx" /> </port> </service> </definitions>
Autoloan WSDLでは、HttpGetおよびHttpPostの定義(message、portType、binding、およびservice portを含む)を無視できます。Soapの定義のみ、開発しているWebサービスコンシューマプログラムに適用されます。
このWebサービスでは、calculate()という1つのメソッドが表示されています。このメソッドは、3つのdouble (Months、RateOfInterest、およびAmount)を含むCalculateオブジェクトを取得し、1つのString (CalculateResult)を含むCalculateResponseオブジェクトを返します。Webサービスウィザードでは、このメソッドの呼び出しをサポートするために、対応するリモートインタフェースをJavaで生成します。
typesセクションは、CalculateおよびCalculateResponseのXMLスキーマ定義を指定します。Webサービスウィザードでは、これらのオブジェクトを表現するために、対応するタイプクラスをJavaで生成します。
AutoloanSoapのbindingセクションを参照すると、このWebサービスがRPCスタイルではなく、ドキュメントスタイルとして定義されていることが確認できます。これは、.NET Webサービスで一般的に見られます。バインドスタイルは、SOAPメッセージの形式を説明します。また、他のWebサービス環境との相互運用性に影響を与える場合があります。
Webサービスウィザードでは、指定のバインドスタイルの処理に必要なJavaコードを生成します。
AutoloanSoapのport定義(WSDLファイルの最後)は、Webサービスにアクセスできる場所のアドレス(URL)を指定します(次を参照)。
http://upload.eraserver.net/circle24/autoloan.asmx
Webサービスウィザードでは、Webサービスを呼び出すために生成するサービスクラスおよびスタブクラスでこのURLを使用します。
プロジェクトをセットアップして、適切なWSDLファイルを見つけたら、Web Service Wizardを使用する準備が整ったことになります。ウィザードでは一度に1つのWebサービスコンシューマが作成されるため、複数を開発する場合は、Webサービスコンシューマを複数回使用する必要があります。
ウィザードを起動するたびに、WSDLファイルおよび指定した他の入力が使用され、1セットのコンシューマソースファイルが生成されます。このプロセスの要約は次のとおりです。
[ファイル]>[新規作成]の順に選択して[新規ファイル]ダイアログボックスを表示し、[Webサービス]タブに移動します。
プロジェクトの場所についての情報を入力するようウィザードで要求されたら、次の項目を指定します。
たとえば、Autoloan Webサービスのコンシューマを生成するとします。この場合、ターゲットJARプロジェクトとしてWebServiceConsumerSampleを指定し、生成されたクラスのパッケージとしてcom.exsamp.netを指定できます。
ウィザードの指示に従って、ターゲットWebサービスを説明するWSDLファイルを指定します。
たとえば、Autoloan Webサービスのコンシューマを生成する場合は、XMethodsパブリックレジストリから取得したWSDLファイルのURLを指定します。
クラス生成およびSOAPオプションを入力するようウィザードで要求されたら、作成するコードについての詳細を指定する必要があります。
Webサービスコンシューマに必要なファイルを取得するには、[スタブを生成する]をオンにします([スケルトンを生成する]はオフのままにします)。
WSDLで複雑なタイプのタイプクラスを自動的に生成するには、[完全なXMLタイプをJavaタイプにマップする]をオンにします。
たとえば、これらのオプションによって、Autoloan Webサービスの適切なコンシューマソースファイル(タイプクラスを含む)が生成されます。
注記: jBroker Web 1.xアプリケーションのサポートは、旧製品との互換性のオプションを使用して有効にできます。詳細については、(前の章の)jBroker Web 1.xとの互換性を選択した場合を参照してください。
ウィザードを終了すると、Webサービスコンシューマに対して指定したものがすべて生成され、プロジェクトの他の部分は、サポートする変更内容で更新されます。
ファイル名を生成する場合、Webサービスウィザードでは、JAX-RPCによって指定された名前付けルールに従います。Webサービスコンシューマでは、結果として付けられるファイル名は、WSDL内の定義に基づきます。
簡単にするため、このマニュアルでは、WSDL定義から派生して生成されたWebサービスコンシューマのファイル名の一部を表すのにxxxを使用します。
Webサービスウィザードでは、Webサービスコンシューマのファイル(前のリストを参照)を生成する際に、背後でWebサービスSDKコンパイラを使用します。場合によっては、次のようなアプリケーションに固有の要件をサポートするために、これらのコンパイラによって追加コードやファイルが生成されることがあります。
詳細については、Web Services SDKヘルプを参照してください。
Autoloan Webサービスに対してWebサービスウィザードにより生成されたコンシューマコードは、次のWebサービスアクセスの標準ファイルから構成されます。
AutoloanSoap.javaは、スタブクラスによって使用されるリモートインタフェースで、Autoloan Webサービスのメソッド呼び出しをサポートします。
Autoloan.javaは、JAX-RPCで使用されるサービスインタフェースで、Webサービスのスタブをクライアントで取得できるようにします。
AutoloanImpl.javaは、スタブ(AutoloanSoap_Stub)のインスタンス化を処理するサービス実装クラスです。
AutoloanSoap_Stub.javaはスタブクラスです。メソッド呼び出しをHTTP SOAP要求としてAutoloan Webサービスに渡します。
AutoloanSoapClient.javaは、(サービスオブジェクトを通じて)スタブを取得し、そのスタブを使用してAutoloan Webサービスのcalculate()メソッドを呼び出す、単純なクライアントアプリケーションです(このメソッド呼び出しはコメントとして生成されます。詳細は、少し後の生成されたファイルの編集で説明します)。
また、WSDLで定義された次の複雑なタイプをマップするためのアプリケーション固有のファイルから構成されます。
CalculateMarshaler.javaは、Calculateのシリアル化およびその非シリアル化を行うクラスです。
CalculateHolder.javaは、Calculateのタイプマッピングサポートを実装するためにJAX-RPCによって必要とされるHolderクラスです。このクラスは、holdersサブディレクトリに生成されます。
CalculateResponse.javaクラスは、WSDLで定義された複雑なタイプCalculateResponseを表します。
CalculateResponseMarshaler.javaは、CalculateResponseのシリアル化および非シリアル化を行うクラスです。
CalculateResponseHolder.javaは、CalculateResponseのタイプマッピングサポートを実装するためにJAX-RPCによって必要とされるHolderクラスです。このクラスは、holdersサブディレクトリに生成されます。
autoloan.asmx.xmlrpc.type.mappingsの設定は、CalculateおよびCalculateResponseのタイプマッピングの設定方法をWebサービスSDKに通知します。これらのマッピングは、データがXMLからJavaに、またはJavaからXMLに変換される場合に適用されます。
生成されたスタブおよびサービスクラスによってマッピングが自動的に設定されるため、このmappingsファイルは通常は必要ありません。これは、特別な状況(マッピングを無効にしたい場合など)のために提供されています。
これらのファイルは、作成すると、指定したディレクトリパスにあるプロジェクトにウィザードによって追加されます。
Webサービスウィザードによって生成されたファイルを編集する場合は、次のガイドラインに従います。
ガイドライン |
詳細 |
---|---|
編集する必要のあるファイル |
|
編集してはいけないファイル |
It痴 OK to edit any of the other generated files, but not typically required.
生成されたxxxClient.javaファイルを使用する前に、次のことを確認してください。
ターゲットWebサービスの1つまたは複数のメソッドを呼び出すには、process()メソッドを編集しなければなりません。
ターゲットWebサービスにアクセスするための正しい場所(バインド)を指定するには、getRemote()メソッドを編集しなければならない場合があります。
process()メソッドでは、生成されたクライアントアプリケーションによってWebサービスのメソッドが呼び出されます。ここでは、生成されたリモートインタフェースで定義された各メソッドを呼び出して、コンソールに戻り値を表示する、コメント付きのコードを示します。たとえば次のように使います。
public void process(String[] args) throws Exception { AutoloanSoap remote = getRemote(args); // The following code has been generated for your testing convenience.In // order to successfully test your Web Service, you must uncomment one or // more of these lines and supply meaningful arguments where necessary. // Once you have modified the test method(s) below, compile this class and // execute it from a command line with your class path set appropriately. // System.out.println("Test Result = " + remote.calculate(com.exsamp.net.Calculate)); }
このコードは、次のように変更する必要があります。
ハードコード化された値またはランタイム時に提供されるパラメータとして、各メソッド呼び出しに適切な引数を提供します。ランタイム引数には、指定された値を検証するコードを追加することもできます。
戻りデータタイプをチェックし、toString()を使用して変換できることを確認します。toString()を使用して変換できない場合は、System.out.printlnに代わるものを使用して、返されたデータを表示します。
編集後のcalculate()メソッド呼び出しの行は、次のようになります。
System.out.println("Autoloan Web Service\n " +
"Loan input data:\n 24 months, 8%, $15000\n " +
"Output from the Web Service:\n " +
remote.calculate(new com.exsamp.net.Calculate(24, 8, 15000)));
この節では、getRemote()メソッドの基本的な使用方法、およびバインド情報を指定する必要がある場合のgetRemote()メソッドの修正方法について説明します。
基本的な使用方法 getRemote()メソッドでは、Webサービスへのメソッド呼び出しを処理するために、生成されたクライアントアプリケーションによってリモートオブジェクトが取得されます。このリモートオブジェクトは、生成されたスタブクラス(xxx_Stub)のインスタンスです。スタブインスタンスを作成するために、getRemote()では次のことが実行されます。
getRemote()に対して生成された一般的なコードの例は、次のようになります。通常は、このコードを編集する必要はありません。
public AutoloanSoap getRemote(String[] args) throws Exception { InitialContext ctx = new InitialContext(); String lookup = "xmlrpc:soap:com.exsamp.net.Autoloan"; Autoloan service = (Autoloan)ctx.lookup(lookup); AutoloanSoap remote = (AutoloanSoap)service.getAutoloanSoap(); return remote; }
バインド情報の指定 ウィザードにより、ターゲットWebサービスのバインド情報が、生成されたスタブクラス(xxx_Stub.java)およびサービス実装クラス(xxxServiceImpl.java)に含まれます。バインドでは、Webサービスにアクセスできる場所の「サービスエンドポイントアドレス」が提供されます。WSDLファイルでは、このアドレスは、soap:address location要素のURLです。
別の方法として、getRemote()メソッドでスタブインスタンスを作成する際に、使用するバインドを指定することもできます。この方法を使用すると、(Webサービスが新しい場所に移動した場合などに)スタブクラスのバインドを無効にできます。スタブのアドレスプロパティを設定するために、次のように1行のコードを追加するだけで、これを実行できます。
public AutoloanSoap getRemote(String[] args) throws Exception { InitialContext ctx = new InitialContext(); String lookup = "xmlrpc:soap:com.exsamp.net.Autoloan"; Autoloan service = (Autoloan)ctx.lookup(lookup); AutoloanSoap remote = (AutoloanSoap)service.getAutoloanSoap(); ((javax.xml.rpc.Stub)remote)._setProperty("javax.xml.rpc.service.endpoint.address", "http://upload.eraserver.net/circle24/autoloan.asmx"); return remote; }
この時点でのWebサービスコンシューマコードの使用方法は、開発しているアプリケーションの性質によって異なります。たとえば、場合によっては、生成されたxxxClient.javaファイルを強化してアプリケーションに含める必要があったり、xxxClient.javaから独自のクラスに構文をコピーすることだけが必要になったりします。しかし、いずれの場合でも、生成されたリモートインタフェース、サービス、およびスタブファイルが常に必要となります。
アプリケーション固有のコード化を開始する前に、基本的なxxxClientをテストして、コンシューマコードが期待どおりに機能することを確認しておくことを推奨します。まず、ソースファイルをコンパイルするためにプロジェクトを作成する必要があります。その後、次の節で説明するように、xxxClientを実行できます。
生成されたWebサービスコンシューマプログラムであるxxxClientは、標準のJavaアプリケーションです。このプログラムは、次のいずれかの方法で実行できます。
生成されたクライアントをすばやく簡単にテストできるようにするために、exteNd Director 開発環境にはWeb Service Wizard Client Runnerが装備されています。この機能によって、現在のプロジェクトのクライアントアプリケーションがリストされ、実行するクライアントアプリケーションを選択できます。クライアントアプリケーションを実行するたびに、必要なファイルをすべて含むようにクラスパスが自動的に設定され、コマンドライン引数を指定できるようになります。
たとえば、生成されたAutoloanSoapClientクラスをClient Runnerを使用して実行すると、次のようになります。
AutoloanSoapClientが実行されると、Autoloan Webサービスのcalculate()メソッドが呼び出され、ローンデータ(期間、率、金額)を含むCalculateオブジェクトが渡されます。calculate()メソッドは、支払い情報の文字列を含むCalculateResponseオブジェクトを返します(これは、AutoloanSoapClientによって画面に表示されます)。
Running com.exsamp.net.AutoloanSoapClient... ********************* Autoloan Web Service Loan input data: 24 months, 8%, $15000 Output from the Web Service: com.exsamp.net.CalculateResponse= {_calculateResult=Equated Monthly Instalment (EMI) For the Amount $15000 is $678} *********************
生成されたクライアントは、オペレーティングシステムのコマンドプロンプトから実行することもできます。この場合、必要なファイル(生成されたコンシューマクラス、wssdk.jarなど)をすべて含むようにクラスパスを設定する必要があります。
クライアントのコマンドラインを表示してコピーするには、Web Service Wizard Client Runnerを使用する方法が推奨されます(前の節の説明を参照)。その後、コマンドラインをコマンドプロンプトに貼り付けて実行できます。
クライアントを他のコンピュータ(開発コンピュータ以外)で実行する場合は、このコマンドラインにリストされるすべてのファイルにアクセスできることを確認してください。
Copyright © 2004 Novell, Inc. All rights reserved. Copyright © 1997, 1998, 1999, 2000, 2001, 2002, 2003 SilverStream Software, LLC. All rights reserved. more ...