Wsdl2BiWs は既存のウェブサービスへのアクセスを提供する Bindows™ JavaScript クラスを生成する Bindows™ ユーティリティです。Wsdl2BiWs は、アクセスされたウェブサービスについて記述する WSDL ファイルを入力として受け取ります。このファイルを分析して、クライアントアプリケーションがこのサービスで提供されるオペレーション (WSDL に記述されている) を呼び出すことができるように Bindows™ フレームワークに基づく JavaScript コードを生成します。生成されたコードは、サービスで提供されるオペレーションに対応した関数を含む web-service stub と呼ばれる単一のクラスで構成されます。
ウェブサービススタブの作成に加えて、Wsdl2BiWs はスタブとウェブサービスのテストに使用できる完全な Bindows™ アプリケーションも作成します。このテストアプリケーションを使用すると、ユーザが任意のパラメータでウェブサービスオペレーションを呼び出し、その結果を見ることができます。テストアプリケーションは、ウェブサービスとの通信にウェブサービススタブを使用します。テスト目的の用途以外として、生成されたウェブサービススタブの使用方法をデモするサンプルアプリケーションとしても使用できます。
このドキュメントは、自動化されたプロセスを利用して、少ない労力でウェブサービスクライアントを開発、テストするための Wsdl2BiWs の使用方法の手引きです。
第 2 章では、Wsdl2BiWs の使用方法をステップバイステップで説明します。この章を通じて、Bindows™ Center ウェブサービスを使用する Bindows™ アプリケーションを実際に作成します。Bindows™ Center ウェブサービスは、Bindows™ デベロッパーコミュニティに、進化に合わせて Bindows™ プラットフォームを最新にするためのツールを提供します。これから作成するアプリケーションは、製品のニュースを表示して、Bindows™ の最新版をダウンロードする手段を提供するためにこのサービスを利用します。Bindows™ Center ウェブサービスは、このアプリケーションで利用しない追加機能性を提供していることに注意してください。
このステップバイステップガイドは Bindows™ フレームワークの基本的な知識を持っていることを前提にしています。ここでは、ウェブサービスを利用するのに直接関係しないアプリケーション開発に関することについては議論しません。ここで開発されたアプリケーションは、ここからダウンロードできるこれらの局面についても考慮したスケルトンアプリケーションを基にしています。
このガイドの各ステップは、その目的と、それをどのようにして達成することができるかに関する一般的な議論から始まります。この議論に続いて、そのステップを完成させるために行われる具体的な事柄が、このように枠で囲まれて記述されています。この具体例を使用して実際に Bindows™ Center クライアントアプリケーションを作成するには、まず最初に以下のことを実行してください。
c:\bindows にインストールされていると想定しています。c:\bindows\samples\BindowsCenter に解凍したと想定しています。この Bindows™ Center サンプルアプリケーションはブラウザで、c:\bindows\samples\BindowsCenter\BindowsCenterApp.html を開くことで実行できます。このアプリケーションがどのようなものか概要を理解するために一度実行することをお勧めします。
一般的に言うと、ウェブサービスは HTTp プロトコルを使用してクライアントと通信するサーバアプリケーションです。ほとんどのウェブサービスは要求をエンコードして HTTp を介して応答を送信するために SOAP (Simple Object Access protocol) と呼ばれる XML ベースのプロトコルを利用します。SOAP は要求と応答のために 1 つの XML ドキュメント構造を定義します。 -- それには、要求パラメータエンコーディング、プロトコル管理情報などが含まれます。SOAP ウェブサービスは、ポート (インターフェース) に集合化される 1 つ以上のオペレーション (ファンクション) をサポートしています。各オペレーションは、それを特定するために使用されるユニークな名前空間修飾名を持っています。ポートも同様です。
サーバと SOAP を通じて交信したいクライアントは、一般的には SOAP リクエスト XML で構成されるポストされたコンテンツで HTTp pOST 要求をサーバに発行します。一般に、これは以下のようになります。
<SOAP-ENV:Envelope
SOAP-ENV:encodingStyle=
"http://schemas.xmlSOAP.org/SOAP/encoding/"
xmlns:SOAP-ENC=
"http://schemas.xmlSOAP.org/SOAP/encoding/"
xmlns:xsi=
"http://www.w3.org/1999/XMLSchema-instance"
xmlns:xsd=
"http://www.w3.org/1999/XMLSchema"
xmlns:SOAP-ENV=
"http://schemas.xmlSOAP.org/SOAP/envelope/">
<SOAP-ENV:Body>
<m:sayHello xmlns:m=
"http://tempuri.org">
<who xsi:type="xsd:string">Bob</who>
</m:sayHello>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
クライアントによって発行された HTTP 要求への応答は、そのコンテンツとして SOAP 応答メッセージを持っています。以下は、上述した要求に合った応答メッセージの例です。
<SOAP-ENV:Envelope
xmlns:SOAP-ENV=
"http://schemas.xmlSOAP.org/SOAP/envelope/"
xmlns:xsd="http://www.w3.org/1999/XMLSchema"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance">
<SOAP-ENV:Body>
<m:sayHelloResponse xmlns:m=
"http://tempuri.org">
<m:sayHelloReturn>Hello Bob!</m:sayHelloReturn>
</m:sayHelloResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
簡潔にするために簡素化しています。要求と応答を読むと、上に引用したこの交信は sayHello (http://tempuri.org の名前空間内) という名前のオペレーションの呼び出しであったことが明白です。
クライアントがウェブサービスで交信することができるように、ウェブサービスによって公開されているインタフェースの知識がクライアント (または、作成者) に用意されるべきです。この知識は、WSDL と呼ばれる形式で伝えられます。1 つの WSDL ファイルは、1 つ以上のサービスまたはポートを記述した 1 つの XML ファイルです。それには、以下のような情報が含まれます。
WSDL ファイルを調べることによって、クライアントはウェブサービスとの交信方法の完全な理解を得ます。SOAP ベースのウェブサービスのコンテキストでは、これは SOAP 要求と応答の正確な構造、HTTp 要求が発行されるべき URL などを含みます。
WSDL ファイルはウェブサービスインターフェースの特定のセマンティックを指定するわけではないことに注意してください。セマンティックは、WSDL の自由形式な言語で埋め込まれているか、または WSDL メカニズム以外の方法で言い表されるかもしれません。
Bindows™ では、
BiWebService クラスを通してウェブサービスへアクセスします。このクラスは、SOAP ベースのウェブサービスへプログラムアクセスを可能にします。 BiWebService を使用するには、常にアクセスするウェブサービスを記述した WSDL を提供することから始めます。いったん WSDL ファイルが読み込まれたら、以下のような様々な方法でウェブサービスへアクセスすることができます。
BiWebService は実行時に各ウェブサービスのオペレーションに対応するメソッドを含む 1 つのオブジェクトを作成します。
これらのメソッドの呼び出しは、対応するウェブサービスのオペレーションを呼び出す SOAP 要求を発行します。
メソッドはウェブサービスから返された値を返します。
例) var lService = BiWebService(); lService.useService("$BindowsCenterWsdl", "BindowsCenter"); alert(lService.BindowsCenter.GetLatestVersionId("bindows"));
このコードは、Bindows™ Center ウェブサービスの GetLatestVersionId オペレーションを呼び出します。
ウェブサービスオブジェクトは実行時に WSDL から作成されるので、ウェブサービスメソッドの実際の
JavaScript コードの定義が開発者にとって利用可能ではないことに注意してください。
サービス ApI の唯一のドキュメンテーションはサービス WSDL によって利用可能です。
BiWebService メソッドを使用すると、開発者はその文字列の名前で特定されるウェブサービスオペレーションを
呼び出すことができます。
例) var lService = BiWebService(); lService.useService("$BindowsCenterWsdl", "BindowsCenter"); alert(lService.BindowsCenter.callService("GetLatestVersionId", "bindows"));
このコードは、前の例と同じ呼び出しを実行します。
この場合も、ウェブサービスメソッドの実際の JavaScript コードの定義は開発者が利用できません。
このメソッドを使用すると、実行前にウェブサービス WSDL からスタブクラスが自動的に作成されます。このクラスは、サービスオペレーションに同期または非同期にアクセスする ApI を提供します。このスタブの実装は上述した前者の呼び出し方法に依っています。
前者の呼び出しのテクニックとは対照的に、このメソッドではサービス ApI を記述している JavaScript コードが実際に生成されて開発者がそれを利用可能です。
以降の説明は、Wsdl2BiWs を利用したウェブサービスへのアクセスに焦点を絞ります。別のテクニックについての詳細は、
BiWebService クラスのドキュメンテーションを参照してください。
Wsdl2BiWs を使用したウェブサービスクライアントアプリケーションを開発するためには、以下を持っている必要があります。
Bindows™ Center サンプルアプリケーションの WSDL ファイルは http://www.bindows.net/BindowsCenter/BindowsCenter.asmx?WSDL で取得できます。
Wsdl2BiWs は Bindows™ フレームワークと供にインストールされます。それは、<bindows>/util/Wsdl2BiWs にあります。<bindows> は Bindows™ インストールのルートパスです。Wsdl2BiWs を実行するには、Wsdl2BiWs ディレクトリ内の Wsdl2BiWs.py を実行するために python interpreter を呼び出します。Bindows™ が c:\bindows にインストールされた ウインドウズ pC では、次のコマンドを実行します。
c:\bindows\util\Wsdl2BiWs>Wsdl2BiWs.py [コマンドライン引数]
Wsdl2BiWs.py が存在するパスをシステムのサーチパスに追加することをお勧めします。
コマンドライン引数に何も指定しないと、Wsdl2BiW にヘルプ画面を表示することを要求することになります。
c:\bindows\util\Wsdl2BiWs>Wsdl2BiWs.py
このコマンドは、Wsdl2BiWs を正しく実行できるようにシステムがコンフィギュレーションされているか確認するために使用できます。提供されている完全なコマンドライン引数のリストは、3.1 章にも記載されています。
Bindows™ Center サンプルアプリケーションの各開発段階では、Wsdl2BiWs.py はシステムのサーチパス内にあり、実行するために完全なパスを指定しないことを想定しています。さらに、Bindows™ が c:\bindows にあると想定しています。
Bindows™ と Wsdl2BiWs のインストールが完了して、アクセスをするウェブサービスについて理解した後、Wsdl2BiWs を使用してウェブサービススタブを生成することができます。このスタブは、後でウェブサービスのオペレーションを呼び出すために使用されます。
スタブを作成するためには、Wsdl2BiWs を起動してコマンドライン引数としてスタブの生成に使用する WSDL の URL を指定します。
Wsdl2BiWs.py wsdl-url
ファイルシステムにある WSDL を Wsdl2BiWs に使用させるには、file:[path] の形式の URL を使用することができます。たとえば、c:\temp\sample.wsdl のファイルを基にスタブを作成するには、このようにします。
Wsdl2BiWs.py file:c:\temp\sample.wsdl
デフォルトでは、生成されたスタブは、URL のサフィックスを除いた最後のパスコンポーネントで名前付けされた JavaScript ファイル内にあります。たとえば、file:c:\temp\sample.wsdl の URL では、カレントディレクトリの sample.js に生成されます。この名前を、コマンドラインオプションで、-o[filename] または --out=[filename] と指定することによって変更できます。
したがって、c:\temp\sample.wsdl のスタブを c:\stubs\SampleStub.js ファイルへ出力するには、以下のコマンドを実行します。
Wsdl2BiWs.py --out=c:\stubs\SampleStub.js file:c:\temp\sample.wsdl
Wsdl2BiWs は、供給された WSDL の各サービス単位でスタッブのクラスを生成します。各クラスは、各サービスのメソッドに対応するメソッドのペアになります。 -- 1 つは非同期オペレーションで、もう 1 つは同期オペレーション用です。スタブの正確な構造と名前は 3.2 で説明されています。その中のいくつかしか必要でない場合には、スタブにより生成されるクラスとメソッドを制限することができます。
WSDL ファイル内のいくつかのサービスだけを生成するには、-s[service name] または --service=[service name] のコマンドラインオプションを使用します。このオプションをそれぞれ必要なサービスに 1 つずつ複数指定することができます。サービス名を指定するには、[[namespace-uri]][service-name] の形式を使用する必要があります。[namespace-uri] はサービス名が定義されているターゲットの名前空間の URI を表します。[service-name] は WSDL ファイル内に指定されているサービス名です。
生成されるサービスの各オペレーションに対してどのメソッドが生成されるかを制御するためには、-t[calltype]
または --calltype[calltype] オプションを使用します。[calltype] は次のどちらかが使用できます。
| [calltype] 値 | 生成されるコード |
|---|---|
async |
サービスオペレーションの非同期呼び出しのためのメソッドのみを生成します。 |
sync |
サービスオペレーションの同期呼び出しのためのメソッドのみを生成します。 |
both |
サービスオペレーションの非同期、同期呼び出しのために両方のメソッドのみを生成します。 |
たとえば、c:\temp\sample.wsdl に存在する WSDL ファイルを基にして、http://tempuri.org/ の名前空間に定義された Sample サービスのための同期呼び出しだけを生成するには、以下のコマンドを実行します。
Wsdl2BiWs.py --service=[http://tempuri.org/]Sample -tsync file:c:\temp\sample.wsdl
ウェブサービススタブ自体に加えて、Wsdl2BiWs は 2 つの目的のためにこのスタブを使用するサンプルアプリケーションも作成することができます。
-a[filename] または --app=[filename] コマンドラインオプションを含むことで、Wsdl2BiWs にサンプルアプリケーションを生成させます。[filename] は、サンプルアプリケーションの JavaScript コードが生成されるファイル名 (パスを含む) です。
このバージョンでは、このファイルはスタブと同じディレクトリである必要があります。そうでない場合には、Wsdl2BiWs は動作しません。
このサンプルアプリケーションは 3 つのファイルから構成されます。
-a または -app= オプションで指定されるテストクライアントアプリケーションコードを含む JavaScript ファイル。.js サフィックスを .xml で置き換えた名前になります。.js サフィックスを .html で置き換えた名前になります。次のコマンドは、Wsdl2BiWs に、c:\temp\sample.wsdl の WSDL ファイルに定義されたすべてのサービスと交信するウェブサービススタブを c:\stubs\SampleStub.js に生成します。また、このスタブのテストクライアントを c:\stubs\TestSampleStub.js ファイルに生成します。コードの生成が完了すると、Wsdl2BiWs はブラウザでテストクライアントを起動します。
Wsdl2BiWs.py --out=c:\stubs\SampleStub.js --app=c:\stubs\TestSampleStub.js file:c:\temp\sample.wsdl
コードの生成が完了したときに、Wsdl2BiWs に自動的にテストクライアントを起動させないようにするには、以下の例が示すように --nolaunch コマンドラインオプションを指定できます。
Wsdl2BiWs.py --out=c:\stubs\SampleStub.js --app=c:\stubs\TestSampleStub.js --nolaunch file:c:\temp\sample.wsdl
ランチャー HTML (この場合は、c:\stubs\TestSampleStub.html) をブラウザで開くことでいつでもテストクライアントを起動できます。
通常は、生成されたアプリケーションは Wsdl2BiWs が呼び出された Bindows™ インストールを使用します。別の Bindows™ インストレーションを使用してアプリケーションを生成するには、-b[bindowsdir] または --bindows=[bindowsdir] オプションを使用します。[bindowsdir] は使用したい Bindows™ バージョンのルートディレクトリになります。次の例はこのオプションの使用方法を示しています。 c:\temp\sample.wsdl の WSDL ファイルに定義されたすべてのサービスのためのスタブを c:\stubs\SampleStub.js ファイルに作成して、スタブテストクライアントを c:\stubs\TestSampleStub.js に作成します。.このスタブテストクライアントは Wsdl2BiWs がどこから呼び出されたかにかかわらず c:\bindows11 をルートにする Bindows™ インストレーションを使用します。コードの生成が完了すると、生成されたテストアプリケーションが起動されます。
Wsdl2BiWs.py --out=c:\stubs\SampleStub.js --app=c:\stubs\TestSampleStub.js
--bindows=c:\bindows11 file:c:\temp\sample.wsdl
Bindows™ Center サンプルアプリケーションでは、スタブをサービスの WSDL から生成します。正確なサービスは、BindowsCenter サービスで、http://www.bindows.net/ws/BindowsCenter/ 名前空間に定義されています。デフォルトの同期、非同期の両方のメソッドを使用します。このサンプルアプリケーションのディレクトリの中に、BCService.js という名前でスタブを生成します。
さらに、テストクライアントも生成させます。 -- 実際のクライアントアプリケーションを作成する前に Bindows™ Center ウェブサービスを体験できます。このサンプルアプリケーションのディレクトリの中に、 BCServiceTester.js という名前でテストクライアントを生成します。まだ、このサンプルアプリケーションは実行しないようにします。
このステップを完了するためには、以下のコマンドを実行します。
Wsdl2BiWs.py --service=[http://www.bindows.net/ws/BindowsCenter/]BindowsCenter -oc:\bindows\samples\BindowsCenter\BCService.js --app=c:\bindows\samples\BindowsCenter\BCServiceTester.js $BindowsCenterWsdl --nolaunch
これで、このスタブをテストするためにウエブブラウザで
c:\bindows\samples\BindowsCenter\BCServiceTester.html ファイルを開くことができます。 -- 次のステップでこれを行います。
完全なウェブサービスアプリケーションを書く前に、テストクライアントを使用して生成されたスタブをテストすることをお勧めします。 2.4.2 章には、Wsdl2BiWs を使用した テストクライアントの生成方法が解説されています。この章では、アクセスされたウェブサービスを体験するためにどのようにこのテストクライアントを操作することができるかについて解説します。
2.4.2 章で解説されたようにテストクライアントアプリケーションが起動されると、UI が表示されます。このテストクライアントアプリケーションの UI は、情報領域、サービスリスト、サービスポートタブから構成されます。以下に、テストクライアントアプリケーションに注釈を付けて UI を示します。

テストクライアントの UI の最上部は情報領域です。情報領域は、アクセスされたウェブサービスとサンプルクライアントに関する一般的な情報を表示しています。これには、ウェブサービススタブのソースコードファイル、サンプルアプリケーションのソースコード、スタブの基になった WSDL ファイルへのリンクが含まれます。
この情報領域の下の右側には、サービスリストがあります。サービスリストはこのスタブで対応されるすべてのサービス (WSDL ファイルのすべてのサービスかまたは、2.4.1 で解説したように --service=[servicename] または -s[servicename]で指定されたサービス) を含んでいます。各サービスの名前は、[[namespace-uri]][service-name] の形式で表示されます。[namespace-uri] はサービスが定義されている名前空間の URI で、[service-name] はそのサービスの名前です。サービスリストからサービスを選択することで、どのサービスと交信するかを選択することができます。どの時点でも、サービスを切り替えることができます。
サービスリストからサービスを選択すると、そのサービスのすべてのポートがサービスポートタブ に表示されます。各ポートはこのタブリストの 1 ページに表示されます。このページ内に、このポート内の各オペレーションに対するオペレーション・インボーカーがあります。オペレーション・インボーカーは、それがバインドされたオペレーションを明示しているタイトル、オペレーションが受け入れる各引数のためのエディットボックス、オペレーションを呼び出すボタンで構成されます。ボタンは表示はウェブサービススタブに依存して、同期呼び出し(Invoke sync のラベル) と 非同期呼び出し (Invoke async のラベル) のボタンを含みます。
オペレーションを呼び出すには、オペレーションのインボーカーのエディットボックスに呼び出しの引数を入力することから始めます。引数は、JavaScript 表記で入力します。初期状態では、各引数の予期される型がスキーマ datatype 用語を使用して対応するエディットボックスに表示されます。この表記の入力はデータの型と一致しなければなりません。
オペレーション・インボーカーのエディットボックスに引数の表記が入力が完了すると、呼び出しボタンを使用してオペレーションを呼び出すことができます。オペレーションが同期または非同期に呼び出されると、オペレーションの結果がポップアップメッセージボックスに表示されます。このポップアップメッセージボックスは、それがオブジェクトである場合には結果のすべてのプロパティをリスト表示します。簡単なスカラーである場合にはその値を表示します。
前のステップで生成されたサンプルテストアプリケーションを Bindows™ Center スタブのテストのために使用します。これをするためには、BCServiceTester.html をウェブブラウザにロードして、次のことを行います。
GetLatestVersionId オペレーションを同期呼び出しします。リテラル "bindows" を aproduct エディットボックスに入力して、GetNews オペレーションを非同期に呼び出します。配列のリテラル ["release", "kb"] を aCategories エディットボックスに入力して Invoke async ボタンをクリックします。少し遅れて、ニュースのフィードをエンコーディングしている XML ファイルが受信されます。GetproductDownloadUrl オペレーションを試します。リテラル "bindows" を aproduct エディとボックスに入力して、リテラル "1.10" を aVersion エディットボックスに入力します。そして、Invoke sync ボタンをクリックします。Bindows™ のバージョン 1.10 をダウンロードする URL が返されます。 スタブの生成が完了すると、ウェブサービスを呼び出すアプリケーションでそれを使用することができます。.そのためには、まず最初にアプリケーションの ADF ファイルにそのスタブのリファレンスをインクルードします。これは、<script src="..."> 要素を ADF の <resources> 要素に追加することで行います。下の例では、2.4.1 章で生成された SampleStub.js ファイルへのリファレンスをc:\appcode ディレクトリにある ADF ファイルに追加する方法を示しています。
<?xml version="1.0"?>
<application>
...
<resources>
<script src="..\SampleStub.js"/>
<!-- Relative path to stub file specified -->
...
</resources>
...
</application>
Bindows™ Center サンプルアプリケーションでは、前のステップでテストしたサービススタブをアプリケーションスケルトンの ADF ファイルに追加します。太字の行を、c:\bindows\samples\BindowsCenter\BindowsCenterApp.xml ファイルに追加します。
<?xml version="1.0"?>
<application>
<window caption="Bindows Center"/>
<resources>
<script src="BCService.js"/>
<script src="BindowsCenterApp.js"/>
</resources>
</application>
この ADF ファイルに追加されたスタブソースファイルへのリファレンスにより、スタブクラスはアプリケーションのどこからでもウェブサービスへアクセスするために使用することができます。スタブクラスの構造の完全なリファレンスは 3.2 章に記載されています。以下の節は、ウェブサービススタブの使用法について基本的な事柄について解説します。
スタブを通じてウェブサービスにアクセスするためには、まず最初にサービスのためのスタブをコンストラクトする必要があります。スタブは、サービスの名 (サービスの名前空間の URI を除いた) をとって命名されたクラスのオブジェクトです。そして、サービスと交信するために BiWebService デリゲートオブジェクトを利用します。スタブオブジェクトはウェブサービスオペレーションに対応するメソッドを実装します。これらのメソッドはウェブサービスオペレーションを呼び出すためにクライアントアプリケーションから呼び出されます。
デリゲートオブジェクト BiWebService はサービスを記述している WSDL への URL (これは通常、スタブを生成したときに使用された URL ですが、別のコンパチブルな WSDL である可能性もあります) と供にコンストラクションの際にスタブに提供されます。
スタブのコンストラクタに渡される BiWebService オブジェクトは完了状態でなければならないことに注意してください (すなわち、オブジェクトの readyState プロパティは "complete" である必要があります)。この条件に合うことを確実にするためには、onreadystatechange ハンドラを BiWebService オブジェクトにアタッチして、このエベントのコンテキストでオブジェクトの状態を確認した後にスタブをコンストラクトするようにします。ウェブサービススタブのコンストラクトのコードは、通常次のようになります。
// BiWebService オブジェクトをコンストラクトする関数。
// onreadystatechange にハンドラをフックする。
MyApp.protoype.SetupWebServiceConnection = function ()
{
this._ws = new BiWebService();
var lThis = this;
this._ws.onreadystatechange = function ()
{
lThis.onWebServiceStateChanged();
};
}
// BiWebService の onreadystatechange イベントハンドラ --
// "completed" 状態にあるときに、BiWebService オブジェクト
// に接続されるスタブをコンストラクトする。
MyApp.protoype.onWebServiceStateChanged = function ()
{
if ( this._webService.readyState ==
"complete" )
{
this._sampleService = new Sample
(this._ws,"http://www.samples.com/sample.wsdl");
}
}
サービススタブをセットアップするためにコードを追加して、上述した方法を用いて Bindows™ Center サービスに接続します。最初に、BiWebService オブジェクトをコンストラクトするコードを追加します。そして、その onreadystatechange イベントをイベントハンドラに接続します。太字の行を、 c:\bindows\samples\BindowsCenter\BindowsCenterApp.js ファイルに追加します。
BindowsCenterApp.prototype.setupWebService = function()
{
// ウェブサービスのセットアップコードはここに置きます。
this._webService = new BiWebService();
var lThis = this;
this._webService.onreadystatechange = function()
{
lThis.onWebServiceStateChanged();
}
}
次に、onreadystatechange イベントハンドラ自体を加えます。このイベントハンドラは、Bindows™ Center サービス 用のスタブをコンストラクトして、それからユーザが Bindows™ Center からデータを取得できるように、UI の Get Data ボタンを有効にします。そうするには、以下の行を c:\bindows\samples\BindowsCenter\BindowsCenterApp.js ファイルに追加してください。
BindowsCenterApp.prototype.onWebServiceStateChanged = function()
{
if(this._webService.readyState == "complete" )
{
this._bindowsCenter = new BindowsCenter
(this._webService, "$BindowsCenterWsdl");
this._getData.setEnabled(true);
}
}
サービススタブのインスタンスが与えられて、ウェブサービスオペレーションを呼び出すためにそのメソッドを呼び出すことができます。スタブには、2 つの種類のサービスの呼び出しメソッドが生成されています。同期と、非同期です。どちらが生成されるかは、2.4.1 章で解説した Wsdl2BiWs -t パラメータによって決定されます。サービススタブのメソッドは、対応するオペレーション名、オペレーションのポート名、そしてメソッドの種類に従って名前付けされます。たとえば、ポート Barport のオペレーション FooOperation の同期呼び出しメソッドの名前は sync_Barport_FooOperation になります。同じオペレーションの非同期呼び出しメソッドの名前は、async_Barport_FooOperation となります。
サービスを同期呼び出しするには、sync_ メソッドを適切な引数を伴って呼び出すだけです。メソッドはウェブサービスからの結果を返すか、もし呼び出し中にエラーが起きた場合には例外を投げます。次のようになります。
MyApp.protoype.showFooValue = function ()
{
var lRes;
lRes = this._sampleService.sync_Barport_FooOperation
("Hello", "World!");
alert('Result: ' + lRes);
}
ユーザが Get Data ボタンをクリックすると、このサンプルアプリケーションはいくつかのことを実行します。1 つ目は、最新バージョンの Bindows™ をダウンロードできるハイパーリンクをウインドウの下に表示します。2 つ目は、メインペインに Bindows™ Center のニュースをロードして表示します。1 番めのタスクでは同期呼び出しを用います (見てお分かりのように、このタスクは 2 つ の連続した短い呼び出しを必要とするので、ここでは同期呼び出しを使います。また、このようなケースでは同期呼び出しの方がより簡単に使用できます)。バージョンアップデート機能を実装するためには、以下のリストの太字のコードを追加します。
BindowsCenterApp.prototype.onGetDataClick = function()
{
// GetData ボタンで実行したい機能をここに実装します。
// 最新バージョンの Bindows と
ダウンロードのための URL をウェブサービスから取得します。
var lLatestVer =
this._bindowsCenter.sync_BindowsCenterSOAP_
GetLatestVersionId("bindows");
var lLatestVerUrl =
this._bindowsCenter.sync_BindowsCenterSOAP_
GetproductDownloadUrl("bindows", lLatestVer);
// 画面の下にリンクを作成します。
var lLinkHtml =
'<p align="center">
<a href="' + lLatestVerUrl + '">
Latest Bindows™ Version is '
+ lLatestVer + '.</a></p>';
this._versionLabel.setHtml(lLinkHtml);
}
サービスオペレーションを非同期に呼び出すには、async_ メソッドを使用します。非同期呼び出しメソッドは、2 つの追加引数 (コールバックメソッドとこのコールバックメソッドの this 値) でプレフィックスされた SOAP オペレーション引数を受け取ります。呼び出されると、非同期呼び出しメソッドはそのオペレーションの呼び出し要求と受け取った引数をウェブサービスに送信して直ちに戻ります。ウェブサービスが応答すると、呼び出しに渡されたコールバックメソッドがサービスオペレーション呼び出しで指定された値に設定された this を伴って実行されます。
非同期コールバックメソッドは、BiWebService から返されたものとしてウェブサービス呼び出し結果オブジェクトを含む単一の引数を受け取ります。この結果のオブジェクトの 2 つの重要なメンバは呼び出し中にエラーが発生したかどうかを示す error と、サービスから実際に返された値を含む value です (エラーが発生してなければ)。
非同期サービスオペレーション呼び出しの典型的なコードは次のようになります。
MyApp.protoype.showFooValue = function ()
{
var lRes;
lRes = this._sampleService.async_Barport_FooOperation
(this.handleFooValueResult, this, "Hello", "World!");
}
MyApp.protoype.handleFooValueResult =
function (aResult){ if(!aResult.error)
{
alert('Result: ' + aResult.result);
} else
{
alert('Error invoking FooValue.');
}
}
アプリケーションで Bindows™ Center のニュースのロードを処理します。ニュースの内容は非常に長いかもしれませんので、GetNews オペレーションを非同期で呼び出すことにします。そして、ニュース XML 応答を受け取るとそれを変換して UI のニュースの部分に表示します。まず最初に、Get Data ボタンのクリックで GetNews オペレーションを非同期で呼び出すようにします。このために、次の例の太字の行を追加します。
BindowsCenterApp.prototype.onGetDataClick = function()
{
// GetData ボタンで実行したい機能をここに実装します。
// 最新バージョンの Bindows と
// ダウンロードのための URL をウェブサービスから取得します。
var lLatestVer =
this._bindowsCenter.sync_BindowsCenterSOAP_
GetLatestVersionId("bindows");
var lLatestVerUrl =
this._bindowsCenter.sync_BindowsCenterSOAP_
GetproductDownloadUrl("bindows", lLatestVer);
// 画面の下にリンクを作成します。
var lLinkHtml =
'<p align="center">
<a href="' + lLatestVerUrl + '">
Latest Bindows™
Version is ' + lLatestVer + '.</a></p>';
this._versionLabel.setHtml(lLinkHtml);
// ニュースの非同期ロードを開始します。
this._bindowsCenter.async_BindowsCenterSOAP_
GetNews(this.handleNewsReceived, this, ["release", "kb"]);
}
これで残りは、非同期呼び出しを完了する関数 handleNewsReceived を実装するだけです。
次の行をアプリケーションファイルに追加します。
BindowsCenterApp.prototype.handleNewsReceived = function(aResult)
{ if(aResult.error)
{ this._newsSection.setText("Error obtaining news: " + aResult.errorDetail.string); }
else { this._loadNewsXml(aResult.value); } }
このコードは、スケルトンに実装されたメソッド _loadNewsXml を使用してニュースの XML を HTML の断片に変換してそれを表示しています。
これで、サンプルウェブサービスクライアントの作成が完了しました。さらに機能を高めてください!
Wsdl2BiWs の一般構文は以下のとおりです。
Wsdl2BiWs.py [options] [wsdl-url]
[options] は下で定義するコマンドラインオプションの配列です。 [wsdl-url] はスタブが生成される基になる WSDL への URL です。
| オプション | 説明 |
|---|---|
version |
Wsdl2BiWs のバージョン情報を表示して終了します。 |
-v,--verbose |
コードを生成している間にユーザに追加情報を表示します。 |
-h,--help |
利用可能なオプションの外相を含むヘルプメッセージを表示します。 |
| オプション | 説明 |
|---|---|
-c[comments],--comments [comments] |
スタブコード内に生成されるコメントの種類を選択します。サンプルアプリケーションにも適用されます。 default または none が選択できます。デフォルトは、default です。 |
-t[call-type],--calltype [call-type] |
スタブコード内にどの種類のメソッドを生成するか選択します。サンプルアプリケーションにも適用されます。非同期オペレーション呼び出しメソッドのみを生成するには async を指定します。同期オペレーション呼び出しメソッドのみを生成するには sync を指定します。両方を生成するには both を指定します。デフォルトは、both です。 |
-o[output-file-name],--output [output-file-name] |
生成されたスタブソースコードをデフォルトの名前以外でファイルを作成するときに指定します。 |
-s[service-name],--service [service-name] |
[service-name] で指定されたサービスだけにスタブを生成します。複数指定されると、指定されたすべてのサービスに対して生成されます。このオプションをまったく指定しないと、処理される WSDL ファイル中のすべてのサービスに対して生成されます。サービス名の形式は、[[namespace-uri]][name] です。[namespace-uri] はサービスが定義されている名前空間の URI で、[name] はその名前空間内でのサービスのローカルな名前です。 |
| オプション | 説明 |
|---|---|
-a[app-name],--app [app-name] |
生成されたスタブ用のサンプルアプリケーションを生成することを要求します。このサンプルアプリケーションは 3 つのファイルから構成されます。[app-name] という名前の JavaScript ファイルと、同じ名前でサフィックスが .xml で置き換えられた ADF ファイルと、同じ名前でサフィックスが .html で置き換えられた HTMLファイル が生成されます。 |
-b[bindows-path],--bindows [bindows-path] |
Wsdl2BiWs の Bindows™ バージョンとは異なるバージョンの Bindows™ を使用してサンプルアプリケーションを作成することを要求します。[bindows-path] はサンプルアプリケーションが使用する Bindows™ インストレーションへのパスです。 |
--nolaunch |
生成されたアプリケーションを起動しないときに指定します。 |
ウェブサービススタブのために Wsdl2BiWs によって生成されたソースコードは一連のスタブのクラス (各ウェブサービスにつき 1 つ) から構成されます。各クラスは接続するサービスのローカル名で名付けられます。たとえば、サービス [http://tempuri.org]Sample では、これは Sample になります。スタブクラスは BiObject から継承され、以下のパブリックメソッドを持ちます。
function Stub(aWebService, aWsdl)
このスタブコンストラクタは 2 つの引数を受け取ります。
aWebService: ウェブサービスと交信するために使用する BiWebService オブジェクト。これは、完了した readyState 状態である必要があります。aWsdl: サービスを定義している WSDL への URL。これは通常、サービスを生成するのに使用された同じ WSDL になります。Stub.prototype.sync_portName_OperationName(operation_parameter1, ...)
同期オペレーション呼び出しメソッドはウェブサービスのオペレーションを同期呼び出しするために使用されます。ウェブサービスから応答を受けた後にだけ戻ります。これらのメソッドの戻り値はウェブサービスから返された結果になります。ウェブサービスがサービスとの通信中に SOAP fault 応答を返すと、例外が投げられます。
同期オペレーション呼び出しメソッドは、オペレーションとオペレーションのポートで名前付けされます。あるオペレーションの呼び出しメソッドは、上の portName をオペレーションのポートのローカル名で置き換え、OperationName をオペレーションのローカル名で置き換えた名前で生成されます。
同期オペレーション呼び出しメソッドへ渡されるすべての引数はオペレーションのメッセージ部分で定義されます。
Stub.prototype.async_portName_OperationName(aCallback, aCallbackThis, operation_parameter1, ...)
非同期オペレーション呼び出しメソッドはウェブサービスのオペレーションを非同期呼び出しするために使用されます。これらのメソッドは直ちに返り、呼び出しはバックグラウンドで処理されます。エラーが起きたとき、またはウェブサービスから応答があったときに、呼び出しメソッドに渡されたコールバック関数が結果またはエラーを記述したオブジェクトを伴って呼び出されます。
非同期オペレーション呼び出しメソッドは、オペレーションとオペレーションのポートで名前付けされます。あるオペレーションの呼び出しメソッドは、上の portName をオペレーションのポートのローカル名で置き換え、OperationName をオペレーションのローカル名で置き換えた名前で生成されます。
次の引数が非同期オペレーション呼び出しメソッドに渡されます。
aCallback: オペレーションの結果が得られたときに呼び出されるコールバック関数。この関数はただ 1 つの引数を受け取ります。そこには、BiWebService のために定義される結果のオブジェクトが返されます。aCallbackThis: コールバック呼び出しで、this 値として使用されるオブジェクト。 aCallback がターゲットのインスタンスを必要としなければ、null とすることができます。