このシリーズの 第1回 では、コマンド・ラインからWebサービス・プロバイダーを作成する方法について重点的に説明しました。シリーズ第2回のこの記事では、WSAD(WebSphere ® Studio Application Developer)やRAD(Rational ® Application Developer)などのIDE(Integrated Development Environment)を使用せずにWebサービス・クライアントを開発する方法について学びます。Webサービス・クライアントの作成がいかに簡単かおわかりいただけるでしょう。その過程でJava ™ コンパイラーとWSDL2Javaの使用方法を学びます。TCPMonitorのデモによってHTTPメッセージのトレース方法を説明します。
この記事では以下の前提条件が必要です。
- Windowsベースのオペレーティング・システム
- WebSphere Application Server 5.xまたは6.x。 試用版 をダウンロードして、この記事の手順に従ってください。
第1回 をお読みになっていない方は、WebSphere Application ServerのAdministration Consoleを使用して、「 ダウンロード 」のセクションにリンクされているWARファイルをインストールしてください。第1回から引き続いてこの記事をお読みになっていて、WARファイルをインストール済みの場合は、この手順を飛ばしてください。WARファイルをインストールするには、以下の手順を実行します。
Applications -> Enterprise Applications -> Install の順に選択します。Local Pathには HelloWorld.war の場所を指定します。Context Rootには HelloWorldWAR を指定します。
図1. Admin Consoleの表示
WSDLファイルを初めて作成したときに、ロケーションのパラメーターは"http://localhost:9080/HelloWorldWAR/services/HelloWorld"に設定されます。したがって、Context Rootは"HelloWorldWAR"となっているはずなので、手動で変更しなくてもWSDLファイルを使用してクライアントを生成することができます。
各種設定はすべてデフォルトのまま Next をクリックして手順を進めて、WARのインストールを終了します。変更はすべて保存してください。ここで最も重要な手順はWARファイルを起動することです。この手順を忘れないようにしてください。
Webサービス・プロバイダーが正常に起動しているのを確認したら、クライアントを作成することができます。基本的な手順は以下の3つです。
Webサービス・プログラミング・モデルの特長は、リモート・メソッドの呼び出しが容易なことです。WSDLを使用してスタブを作成し、次にスタブを使用してクライアント側のリモート・オブジェクトを表現します。
A) ディレクトリー(c:\temp\Client)を作成します。第1回で作成したHelloWorld.wsdlをコピーするか、「 ダウンロード 」のセクションからダウンロードしてください。
B) コマンド行プロンプトを開き、c:\temp\Clientに移動します。以下のコマンドを入力します。
リスト1.コマンド行プロンプトの設定
SET WAS_HOME=C:\Program Files\WebSphere\AppServer5.1
call "%WAS_HOME%\bin\setupcmdline.bat"
|
1行目では"WAS_HOME"環境変数をWebSphere Application Serverのインストール先に設定します。ここで正しいディレクトリーを指すようにしてください。2行目ではJAVA_HOMEなどの追加環境変数を設定するスクリプトを呼び出します。
C) WSDL2Javaコマンドを使用してクライアント・スタブを作成します。
リスト2.WSDL2Javaの実行
call "%WAS_HOME%\bin\WSDL2Java" -role client -verbose -output . HelloWorld.wsdl
|
使用するオプションについて、以下に説明します。
- Role - serverまたはclientを指定します。ここではクライアントを構築しますので、clientと指定します。
- Verbose - 手順ごとにコンソールに対してメッセージを出力します。
- Output - ここではピリオドを入力して現行ディレクトリーを指定します。
- WSDL file - 最後の引数は常にこれです。
このコマンドを実行すると、コンソールに以下のように表示されます。
リスト3.WSDL2Javaからの出力
WSWS3185I: Info: Parsing XML file: HelloWorld.wsdl
WSWS3282I: Info: Generating .\mypackage\HelloWorld.java.
WSWS3282I: Info: Generating .\mypackage\HelloWorldSoapBindingStub.java.
WSWS3282I: Info: Generating .\mypackage\HelloWorldService.java.
WSWS3282I: Info: Generating .\mypackage\HelloWorldServiceLocator.java.
WSWS3282I: Info: Generating .\mypackage\HelloWorldServiceInformation.java.
|
上記のファイルを含むmypackageというディレクトリーが作成されたのに気づいたことでしょう。各ファイルについての詳細を以下に説明します。
- HelloWorld.java - これはService Endpoint Interfaceです。
- HelloWorldSoapBindingStub.java - これはService Endpoint Interfaceの実装です。
- HelloWorldService.java - これはService Interfaceです。
- HelloWorldServiceLocator.java - これはService Interfaceの実装です。
ここでコンセプトとして次のことを理解しておく必要があります。
- Service Endpoint Interface :HelloWorldSoapBindingStubはHelloWorldを実装する
- Service Interface :HelloWorldServiceLocatorはHelloWorldServiceを実装する
これらについては次のセクションでクライアントを構築する際にさらに詳しく説明します。
★次の手順では、生成されたスタブを利用できるクラス・ファイルを作成します。"mypackage"ディレクトリー内に、HelloWorldClient.javaと名前を付けたファイルを作成します。以下のコードをペーストしてください。
リスト4.HelloWorldClient.java
package mypackage;
public class HelloWorldClient {
public static void main(String[] args) throws Exception
{
HelloWorldServiceLocator hwlocator = new HelloWorldServiceLocator();
HelloWorld hw = hwlocator.getHelloWorld();
String str = hw.sayHello();
System.out.println(str);
}
}
|
たったの3行でWebサービスを呼び出していることに注目してください。各行について以下に説明します。
A) HelloWorldServiceLocatorはサービス・オブジェクトです。サービス・オブジェクトは簡単に言うと、生成されたスタブの取得に用いられます。サービス・オブジェクトは以下の行で作成されます。
リスト5.HelloWorldServiceLocatorの作成
HelloWorldServiceLocator hwlocator = new HelloWorldServiceLocator();
|
サービス・オブジェクトの名前は常に*サービス名*Locatorとなります。*サービス名*はWSDLファイルのサービスの名前です。
注:J2EEのコンテキスト(サーブレット内またはEJB内)では、サービス・オブジェクトはJNDIを使用して取得する必要があります。ここではJ2SEクライアントを使用していますので、サービス・オブジェクトの取得にはこの方法しかありません。
B) 次に、クライアント・スタブを作成する必要があります。スタブはリモート・オブジェクトを表現します。スタブは以下のように取得します。
リスト6.スタブの取得
HelloWorld hw = hwlocator.getHelloWorld();
|
ポートを取得するメソッドは常にget*ポート名*となることに注目してください。*ポート名*はWSDLファイルのポートの名前です。
C) 最後に、スタブ上でリモート・メソッドを呼び出します。ここでは、スタブ上でsayHelloメソッドを使用して、戻り値をStringに書き込みます。
リスト7.スタブ上でのメソッド呼び出し
String str = hw.sayHello();
|
次の手順では実際にクライアントをコンパイルします。コンパイルするには以下のコマンドを発行します。
リスト8.クラスのコンパイル
"%JAVA_HOME%\bin\javac" -extdirs "%WAS_CLASSPATH%;%WAS_EXT_DIRS%;." mypackage\*.java
|
クラス・ファイルがmypackageディレクトリーに作成されます。最後にJavaアプリケーションを実行します。
リスト9.Javaアプリケーションの実行
"%JAVA_HOME%\bin\java"
-Djava.ext.dirs="%WAS_CLASSPATH%;%WAS_EXT_DIRS%;." mypackage.HelloWorldClient
|
コンソールに"Hello World!"というメッセージが表示されます。おめでとうございます! クライアントからWebサービスを呼び出せました。
ケーブルを行き交うデータを検証する手順について付け加えておきましょう。WebSphere Application Serverには、HTTPメッセージをトレースするためのTCPMonitorというツールが付属しています。TCPMonitorはクライアントとサーバーとの間に置いて使用します。現在、クライアントはサーバーと直接対話しています。これを、クライアントがTCPMonitorと対話し、TCPMonitorからサーバーにトラフィックを転送するように変更します。
A) TCPMonitorを利用するには、まずクライアントを変更する必要があります。HelloWorldClient.javaを以下のように編集します。
リスト10.HelloWorldClient.java
package mypackage;
import javax.xml.rpc.Stub;
public class HelloWorldClient {
public static void main(String[] args) throws Exception
{
HelloWorldServiceLocator hwlocator = new HelloWorldServiceLocator();
HelloWorld hw = hwlocator.getHelloWorld();
((Stub) hw)._setProperty("javax.xml.rpc.service.endpoint.address",
"http://localhost:1234/HelloWorldWAR/services/HelloWorld");
System.out.println(hw.sayHello());
}
}
|
クライアントがトラフィックを送信するエンドポイントを変更するために、((Stub) hw)._setProperty("javax.xml.rpc.service.endpoint.address", "http://localhost:1234/HelloWorldWAR/services/HelloWorld");の行が追加されています。エンドポイントのデフォルトのアドレスはHelloWorldServiceLocator.javaファイルに次の行で指定されています。private final java.lang.String helloWorld_address = "http://localhost:9080/HelloWorldWAR/services/HelloWorld";
ポートを9080から1234へと変更したことに注目してください。さらに、HelloWorldインスタンスをスタブ・オブジェクトにキャストするために、java.xml.rpc.Stubクラスをインポートする必要があります。
B) TCPMonitorを実行する際に重要なのは、WebSphere Application Serverに付属しているバージョンのJavaを使用することです。そうしないと、NullPointerExceptionを受け取る可能性があります。以下のコマンドを発行してください。
リスト11.TCPMonの実行
"%JAVA_HOME%" -Djava.ext.dirs="%WAS_EXT_DIRS%" com.ibm.ws.webservices.engine.utils.tcpmon
|
C) 以下の値を指定します。
リスト12.TCPMonの値
Listen Port - 1234
Target Hostname - localhost
Target Port # - 9080
|
ウィンドウは下図のようになります。
図2. TCPMonitorの値の設定
次に、Addボタンをクリックします。これで、TCPMonitorがポート1234でトラフィックを受け入れ、9080にリダイレクトするように構成されます。Addボタンをクリックすると、自動的にリスナーが実行されます。TCPMonitorの上部には、リスナーを示すタブが表示されます。
D) Webサービス・クライアントを再コンパイルして呼び出すために、以下のコマンドを入力します。
リスト13.HelloWorldClientの実行
"%JAVA_HOME%\bin\javac"
-extdirs "%WAS_CLASSPATH%;%WAS_EXT_DIRS%;." mypackage\*.java
"%JAVA_HOME%\bin\java"
-Djava.ext.dirs="%WAS_CLASSPATH%;%WAS_EXT_DIRS%;." mypackage.HelloWorldClient
|
E) TCPMonitorのウィンドウでトラフィックを調べます。SOAPのエンベロープは1行で表示されます。Webサービスのエンジンは、スペース節約のために改行文字を送信しません。
図3. TCPMonitorの出力
F) XMLを読みやすくするために、tcptrace.xmlというファイルを新規作成して、そこにXMLを貼り付けるという手もあります。次にMozilla FirefoxまたはMicrosoft Internet ExplorerでそのXMLファイルを開けば、書式が整えられたファイルを見ることができます。
Webサービス・プログラミング・モデルを使えば、スタブを生成し、そのスタブを使用してクライアント・アプリケーションからWebサービスを起動するように設定するのは、とても簡単です。ここで説明したクライアント構築方法を適用できるWebサービスは現在たくさんあります。現在、Google、Amazon、Ebay、Fedexなどの大手サイトでは利用可能なWebサービスを提供しています。ぜひ楽しんでください。
ダウンロード のセクションからダウンロードできるWebServiceTutorial.batを使えば、蒸気の手順を自動化することができます。まず、WebServiceTutorial.batを修正して、WAS_HOMEディレクトリーが現在のWASのインストール先ディレクトリーを指すようにします。次に、バッチ・ファイルを実行します。その出力は以下のようになります。
リスト14.WebServiceTutorial.batの出力
1. Creating Binding Classes...
WSWS3185I: Info: Parsing XML file: HelloWorld.wsdl
WSWS3282I: Info: Generating .\mypackage\HelloWorld.java.
WSWS3282I: Info: Generating .\mypackage\HelloWorldSoapBindingStub.java.
WSWS3282I: Info: Generating .\mypackage\HelloWorldService.java.
WSWS3282I: Info: Generating .\mypackage\HelloWorldServiceLocator.java.
WSWS3282I: Info: Generating .\mypackage\HelloWorldServiceInformation.java.
2. Compiling Java Client...
3. Running Java Client...
Hello World!
|
| 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|---|---|---|
| Hello World WAR file to install on server side | HelloWorld.war | 6KB | HTTP |
| Hello World WSDL file | HelloWorld.wsdl | 3KB | HTTP |
| Script to build the client automatically | WebServiceTutorial.bat | 1KB | HTTP |
| Final code | Finish.zip | 14KB | HTTP |
学ぶために
-
Develop a Web service without an IDE, Part 1: Focus
on the Server
--
このシリーズの第1回です。配置記述子やJavaクラスを含むWebサービス・プロバイダーの作成方法を説明し、Javaコンパイラー、およびJava2WSDL、WSDL2Javaコマンドライン・ツールのデモを行っています。
-
Develop, test, and deploy Web services using
Rational Application Developer V6.0
(developerWorks、2005年1月)-- RAD(Rational Application
Developer)を使用してWebサービス・プロバイダーとクライアントを作成する方法についてのチュートリアルを提供しています。
-
J2EE Web Services
-- この本はJ2EEテクノロジーを使用したWebサービスの開発と配置に関する包括的なガイドです。
-
W3Schools
--
Web構築のチュートリアルを提供しています。内容はHTMLとXHTMLの基礎から上級者向けのXML、マルチメディア、WAPに至ります。
-
WebSphere Version 6 Web Services Handbook
Development and Deployment
-- IBMのレッドブックで、Webサービスについて論じています。
-
WSDL2Java documentation
に関する資料はInfoCenterからご利用いただけます。
-
Java2WSDL documentation
の資料もInfoCenterから入手できます。
-
The Web services and SOA technical library
-- Webサービスに関するdeveloperWorksの記事を集めています。
-
SOA and Webサービス
--
Webサービス・アプリケーションの開発に関する数多くの解説記事や、初心者、中級者、上級者向けのチュートリアルを提供しています。
製品や技術を入手するために
-
WebSphere Application Server V6.0 Trial Version
から体験版をダウンロードして、この記事の手順に従ってください。
議論するために
-
ディスカッション・フォーラムに参加してください。
-
developerWorks blogs
-- developerWorksのコミュニティーに加わってください。