Webサービスを作ってみよう
セットアップが終わったら、こんどはWebサービスを構築する番だ。WSTKでは、JavaBeans、EJB、COMなどからSOAP-RPC型Webサービスを簡単に作ることができる。現状では、多くの人がこのSOAP-RPCによるWebサービスの構築に興味があるだろう。ここでは、Webサービスを提供するサーバとして「hostname」というDNS名を使って、そのWebサービス構築方法を解説しよう。以下から名前は適宜、ご自分のサーバ名に置き換えて読んでいただきたい。
■WSTKが提供するSOAP-RPC開発シナリオ
WSTKのWebサービス開発手順には、3つのシナリオがある。
■既存アプリケーションをWebサービス化する
- JavaBeans、EJB、COMなどを準備する。このため、ボトム・アップ型開発と呼ばれている。
- サービス生成ウィザード( wsdlgen.bat )を使い、WSDL、スケルトン・コード、SOAPディプロイメント記述などを生成する。
- 生成されたファイルの内容を一部調整する。
- WSDLをHTTP上で公開する。
- Webサービス・ブラウザ(browser.bat)を使って、SOAP(rpcrouter)、UDDIに登録する。
■WSDLから作る
- 既存WSDLを作る。例えば、どこかの団体などが制定したWSDLに準拠したサービスを作る際に利用できる。このため、トップダウン型開発と呼ばれている。
- WSDLファイルがHTTP経由でアクセスできることを前提に、サービス提供用Javaモジュールにひな形を生成する(servicegen.bat)。
- 生成されたひな型の中身を実装する。
- あとは、1.と同じような手順を踏む。
■アクセス用プロキシ・コードを作る
- サービス記述WSDLとインターフェイス記述WSDLが公開されていることを前提に、接続用クライアントコード(Webサービス・プロキシ)を自動生成できる。( proxygen.bat )
- Webサービスに接続したいクライアント・コードは、プロキシ・クラスをインスタンス化して、該当のメソッドにアクセスするだけでよい。
■WSTK-APIでダイナミックにアクセス
- WSTK-APIが提供している、WebServicesアーキテクチャ型のWebサービスを、アクセスするためのコードを記述する。
- これに、サービス名、ポート名、メソッド名(operation)、引数、などを渡すことにより、動的にアクセスが可能。
■試作するサービスの内容
試しに、以下のコードをWebサービス化して公開してみよう。本稿では、次に紹介する試作サービスをボトム・アップ型開発のシナリオで開発し、プロキシコード、WSTK-APIの両方の方法でアクセスする手順を紹介する。
import java.util.Properties; public class WstkTest { public static void main(String[] args) { WstkTest wt = new WstkTest(); String key = "java.vm.vendor"; if(args.length > 0) key = args[0]; System.out.println(key + "=" + wt.getSystemProperty(key)); } public String getSystemProperty(String key) { Properties p = System.getProperties(); return p.getProperty(key); } }
このプログラムは、与えられたストリングの名前のシステム・プロパティを返すというプログラムである。このプログラムのgetSystemPropertyメソッドをWebサービス化してみる。このプログラムをコンパイルし、Webサーバの都合の良いクラスパスに置く。ここでは、C:\WebSphere\AppServer\classesに置いておくこととする。
コンパイルして実行すると次のようになるのを確認しておく。
C:\WebSphere\AppServer\classes>java WstkTest java.vm.vendor =IBM Corporation C:\WebSphere\AppServer\classes>java WstkTest java.version java.versionjava.version=1.2.2
■WSDL、SOAP-DDの生成
SOAP-RPCとして公開するには、SOAPのrpcrouterに登録する必要がある。SOAPのrpcrouterに登録するには、Apache-SOAP形式のデプロイメント記述が必要である。また、外からアクセスすることを考え、WSDLを同時に生成する。
そのために、WSTKを導入したディレクトリのwstk\bin\wsdlgen.batを起動する。
最初にJavaBeans、EJB、COMの選択肢が出てくるので、JavaClassを選択して「Next」を押す。
次にクラスファイルを指定する画面6が出る。Class Name、Classpathを指定すると、ほかのフィールドは自動的に埋められる。下記に簡単なパラメータの説明をしておこう。
Class Name | クラス名 |
---|---|
Classpath | クラスを発見するためのクラスパス |
Output Filename | WSDLファイル名 |
画面下側の、サービス・プロパティ(Service Properties)には、WSDLの中身に埋められる内容が表示されている。特に「Binding URL」「WSDL URL prefix」に気をつけよう。Host:Port番号が「localhost:8080」になってしまうが、このまま使うには、Webサービスを実行するHTTPを8080で構成してやるか、トンネル・モニタ(WSTK付属のツール)でリダイレクトしてやる必要がある。また、ほかからアクセスするには都合が悪いので、この時点で「自分の固定ホスト名」に修正して使おう。単純にローカル環境で稼働確認をするのであれば、Port番号を削除してしまえばよい。これらの設定が終わったら「Next」ボタンを押す。
次の画面7では、メソッドの一覧が表示される。これは、どのメソッドをWebサービスとして公開するかを選択する画面だ。先ほどの「getSystemProperty(String)」を選択(反転表示)し、「Next」を押す。もちろん、ここで複数のメソッドを選択しても構わない。
この画面の次に「Finish」を押せば、これで、WSDL、デプロイメント記述が生成される。
生成されるWSDLファイルは2種類ある。サービス記述(WstkTest_Service.wsdl)とインターフェイス記述(WstkTest_Service-interface.wsdl)である。
インターフェイス記述には、DataTypes、Message、portTypes、bindingなどの要素が含まれ、提供するサービスが使うXMLメッセージの形式、トランスポートのバインディング情報が記述されている。サービス記述には、先程のインターフェイス情報を取り込む為のimport要素と、サービスを提供するURLなどを示すためのservice要素が含まれている。
インターフェース記述は、UDDIのtModelにURIとして登録されるし、サービス記述は、プロキシの生成やダイナミックバインディングを行うときのインプットにすることができる。また、次に出てくるWebサービス・ブラウザが、UDDIにbusinessServiceを登録するときに参照したりする。
■WSDLの公開
Webサービスを利用可能にする前に、生成されたWSDLファイルをHTTPで公開しておく必要がある。これらのファイルは、http://hostname/wsdl/xxxxx.wsdl という名前で参照するようにURLが作られてしまうので、C:\IBM HTTP Server\htdocs\wsdlというディレクトリを作って、そこにコピーしておく。
■SOAP、およびUDDIに登録
出来上がったファイルをSOAPランタイムおよび、UDDIに登録することでWebサービスが利用可能になる。これをWeb Servicesアーキテクチャでは「パブリッシュ」と呼んでいる。パブリッシュする簡単な方法は、「Webサービス・ブラウザ」を使うことだ。WSTKのbinディレクトリの「browser.bat」を起動すると下記のような画面になる。
左側のペインにはUDDIレジストリのツリーが、右側に詳細が表示される。「Service Providers」と「Service interfaces」を選択して、「Find」ボタンを押すと、それぞれをUDDIに問い合わせに行き、表示してくれる(画面10はこの状態)。
今回のプログラムは、このUDDIでは初めてのインターフェイスなので、まずインターフェイスの登録を行おう。UDDIのルートを選択しておき、「New Service interface」を押す。
インターフェイス記述を示すWSDLファイルと、サービス・カテゴリを入力する画面11が出るので、インターフェイス定義のWSDLファイル「WstkTest_Service-interface.wsdl」を指定する。サービス・カテゴリは何でもよいので、「Add」を押して「Category Selection」ウィンドウを出し、「Select TModel Key」から「NAICS」を選択して適当に選ぶ(ここではリストの一番上にあった、「11111:Soybean Farming」(大豆農園)を選んだ)。
「Publish」ボタンを押すとUDDIにアクセスし、インターフェイス定義がパブリッシュされる。このとき、このWSDLのURI(tModelに記述される)を聞かれるので、「http://hostname/wsdl/WstkTest_Service-interface.wsdl」を入力する。こうすることで、このtModelを使う利用者がWSDLを参照することができる。この時点でこのWSDLは、UDDI上で標準のインターフェイス定義として登録されたことになる。このインターフェイスと同じ機能を提供する人は、常にこのtModelを使うべきである。同じインターフェイスの機能を提供する人は、新しくtModelを登録するべきでない。
■ビジネスの登録
UDDIにサービスを登録するには、そのサービスを提供する企業(ビジネス)を登録する必要がある。そこで、例として新しいビジネス「Yonechan」を登録していくことする(画面12)。
ビジネスの登録が終わったら、UDDIブラウザでService Providersフォルダを選択して「Find」ボタンを押すと、新規に登録された「Yonechan」が出てくるようになる(画面13)。
では、Yonechanを選択して、「New Service」を押し、サービスの追加を行ってみよう。左側にツリーが表示されるので、サービス記述WSDL「WstkTest_Service.wsdl」、およびデプロイメント記述「DeploymentDescriptor.xml」の順に探し出してダブルクリックすると、該当のフィールドが埋まる。SOAP-rpcrouterにも同時に登録できるので、「Deploy with SOAP Service Manager」をチェックしておく。Webサービス・カテゴリは、例によって「大豆農園」にしておこう(画面14)。
「Publish」を押すと、このサービスに対してのサービス記述WSDLのURLを聞いてくるので、「http://hostname/wsdl/WstkTest_Service.wsdl」を入力して「OK」を押す。
これで、サービスが公開できた。UDDIには、企業「Yonechan」がサービス「大豆農園」を行っており、サービス記述の内容がbusinessServiceに記述された。インターフェイス記述はtModelとして登録されている。
■Webサービスにアクセスしてみよう
SOAP-RPCによるWebサービスは、見た目(いわゆるユーザーインターフェイス)が存在しない。そこで、プログラムを作ってこれにアクセスしてみることにする。ここからは、先ほどと違うマシンで作業していることにしていただきたい。(実際、別のマシンで稼働確認を行った。)先ほどの作業で、以下のものがサーバ上で提供されている。
- インターフェイス記述WSDL
- サービス記述WSDL
- SOAPとしての機能
さらに、UDDIには、
- ビジネス:Yonechan
- サービス:大豆農園
- バインディング情報:URLとtModelKey
これらを使って、Webサービスとして提供されているgetSystemPropertyにアクセスしてみよう。
Copyright © ITmedia, Inc. All Rights Reserved.