レベル: 初級 Graham Glass (graham-glass@mindspring.com), CEO/Chief Architect, The Mind Electric
2000年 12月 この記事では、Web Servicesを開発する方法、必要なツール、それらをインストールする方法、コードを作成する方法、およびサービスを配置する方法について、段階的に説明します。次いで、インターネットを介して他のWeb Servicesを呼び出す方法についても説明します。
Web Servicesテクノロジーの進化的かつ革命的な性質を扱う、このコラムの第2回へようこそ。第1回では Web Servicesの概要、およびこのテクノロジーが主流となるために解決すべき問題を紹介しました。今回は、初めてWeb Servicesを構築して配置する上で知っておくべきことをすべて説明します。既にインターネット上に配置されているWeb Servicesを呼び出す方法も説明します。
ツールとインストール
初めてWeb Servicesを構築するために踏むべき最初のステップは、ツール・セットを選択することです。使用するツールは次のとおりです。
-
Apache SOAP 2.0 - これは、SOAPのオープン・ソースのJavaインプリメンテーションであり、SOAP 1.1仕様の便利なサブセットのサポートが含まれています。既存のWebサーバーとの統合性も良好です。このソフトウェアをダウンロードするには、参考文献のセクションを参照してください。
-
Apache Jakarta Tomcat 3.2.1 -このオープン・ソースJava Webサーバーも、Javaサーブレット2.2 API仕様をインプリメントしています。この仕様は、Apache SOAP 2.0のホスティングを行うために必要です。このソフトウェアをダウンロードするには、参考文献のセクションを参照してください。
-
Apache Xerces XML Parser 1.2.3 -
このオープン・ソースのXMLパーサーは、最新のXML仕様の大部分をインプリメントしており、Apache SOAP 2.0で使用されます。このソフトウェアをダウンロードするには、参考文献のセクションを参照してください。
上記のダウンロード・ファイルのサイズの合計は6 MBを上回るので、高速なダウンロード・リンクが望まれます。わたしは自宅から28Kリンクでソフトウェアをダウンロードしましたが、コーヒーを何杯か飲んで、一走りしてくるのに足る時間がかかりました。
各パッケージをルート・ディレクトリーにunzipしたら、リスト1 に示すディレクトリー構造を作る必要があります。
リスト1: Apacheパッケージのディレクトリーのリスト
jakarta-tomcat-3.2
lib // webserver.jar、servlet.jar、jasper.jar、parser.jar、jaxp.jarを入れる
soap-2_0
lib // soap.jarを入れる
xerces-1_2_3 // xerces.jarを入れる
|
次にすることは、XercesとApache SOAPの.jar ファイルを、それぞれクラス・パスに追加することです。その際、
xerces.jar を先に指定するようにしてください。さもないと、Apache SOAPが間違ったXML.jar ファイルを見つけて、正しく機能しなくなる恐れがあります。わたしのシステムの場合は、クラス・パスに以下の項目を追加しました。
C:\xerces-1_2_3\xerces.jar
C:\soap-2_0\lib\soap.jar |
次の部分は少々面倒です。Tomcatのメイン・スクリプトには、それ自身のクラスを既存のクラス・パスの前に挿入するという明らかな間違いがあり、xerces.jar の順番が狂うという上述の問題が生じてしまいます。したがって、\jakarta-tomcat-3.2\bin\tomcat.bat (UNIXを使用する場合は .sh) を編集して、行の置換を行う必要があります。
set CP=%CP%;%CLASSPATH%
上記の行を、以下の行に置き換えます。
set CP=%CLASSPATH%;%CP%
UNIXの場合も、同様の変更を加えます。順序の入れ替えたので、xerces.jar ファイルは再び正しい検索位置に戻ったことになります。
最後に、Apache SOAPを自動的に検出するようTomcatを構成する必要があります。これは、\jakarta-tomcat-3.2\conf\server.xml を編集することにより行います。ファイル内の既存の項目の後ろに、リスト2 に示すとおり、<Context> 項目を追加します。
リスト2: server.xmlに追加する <Content> 項目
<Context
path="/soap"
docBase="C:/soap-2_0/webapps/soap"
reloadable="true">
</Context>
|
docBase 属性には、Apache SOAPのwebapps/soap サブディレクトリーに至る絶対パスを設定します。Windowsを使用する場合は、ドライブ文字を含めないと機能しません (これを突き止めるのに苦労しました)。
これで、初めてのWeb Servicesアプリケーションの構築に取り掛かる準備ができたことになります。
Webサーバーの始動
独自のWeb Servicesの作成方法を説明する前に、Tomcatを開始し、SOAPの ウェルカム・ページを活動化しましょう。アプリケーションの例を収めるために、\demo1 というディレクトリーを作成し、このディレクトリーに移動してから、次のように入力します。
tomcat run
すると、Tomcat Webサーバーが、ローカル・ホストのポート8080で実行を開始します。図1 に示す画面が表示されるはずです。
図1: Tomcat Webサーバーのブート
次に、Webブラウザーを起動し、http://localhost:8080/soap というURLを入力します。すると、Tomcatのserver.xml ファイルを編集したときに/soap にインストールされた、Apache SOAPシステムが活動化します。すべてが正常であれば、図2 に示す開始ページが表示されるはずです。
図2: Apache SOAPシステムのウェルカム・ページ
この時点で、ブラウザーを閉じ、Tomcatを停止します。これらを再始動するのは、Web Servicesを作成し、配置する準備が整ってからです。
Web Servicesの作成
Web Servicesを作成するのは、簡単な部分です。2国間の為替レートを計算する、単純なWeb Servicesを作成することにします。このサービス用のJavaインターフェースをリスト3 に示します。
リスト3: 単純なWeb ServicesのJavaインターフェース
public interface IExchange
{
float getRate( String country1, String country2 );
}
|
Apache SOAPでは、本来、インターフェースを宣言する必要はなく、インプリメンテーション・クラスから直接にメソッドを公表することができます。しかし、わたしは、プログラムの良い作法として、この方法を好んでいます。リスト4 は、これから使用するインターフェースの単純なインプリメンテーションを示しています。
リスト4: この例のためのJavaインターフェース
public class Exchange implements IExchange
{
public float getRate( String country1, String country2 )
{
System.out.println( "getRate( " + country1 +
", " + country2 + " )" );
return 144.52F; // always return the same value
for now
}
} |
クラス・パスに\demo1 を追加し、コードをコンパイルして\demo1\Exchange.class を作成します。これが済んだら、JavaクラスをWeb ServicesとしてTomcatに公表できます。
Web Servicesの配置
為替サービスを配置するには、\demo1 ディレクトリーからtomcat runと入力して、再びTomcatを立ち上げます。それから、ブラウザーで http://localhost:8080/soap というURLを入力し、ウェルカム画面が表示されたらRun the admin client (管理クライアントの実行) をクリックします。図3 に示す画面が表示されるはずです。
図3: 「SOAP Admin (SOAP管理)」ページ
この画面には、Tomcat/SOAPシステムでホスティングされるサービスの配置、配置解除、およびリストを行うための選択項目が備わっています。List (リスト) オプションをクリックするなら、開始するサービスがないことが分かります。為替サービスを配置するには、Deploy (配置) オプションをクリックし、図4 に示すとおりにフィールドを入力します。
図4: 為替サービスの配置
ここで、「Deploy (配置)」画面の各フィールドを説明します。
-
ID: Web ServicesのID。この例では、サービスのIDを
urn:demo1:exchange に設定します。これは、http://www.ietf.org/rfc/rfc2141.txt で推奨されているURNの命名規則に従ったもので、demoが名前空間、exchangeがサービス・ストリングです。
-
Scope (有効範囲): サービスの活動化モード。Request (要求) は、個々の要求が行われるたびに、新しいサービスのインスタンスが作成されるという意味です。選択可能な他のモードには、Session (セッション) とApplication (アプリケーション) があります。
-
Methods (メソッド): Web Servicesに公開するメソッドを、空白文字で区切ったリスト。一見、Web Servicesは、同じ名前を持つ2つのメソッドを公開できないように見えますが、それを禁じる規定はSOAP仕様にありません。
-
Provider (プロバイダー): Web Servicesのタイプ。今のところ、Apache/SOAPは、JavaクラスとBeanスクリプトしかサポートしていませんが、将来のバージョンにおいては、間違いなく、EJBと他の一般的なコンポーネントのタイプがサポートされることになります。
-
Provider Class (プロバイダー・クラス)/Static (静的): Javaクラスの名前。このクラスは、クラス・パスの設定を通して、使用可能でなければなりません。Static (静的) が真であれば、メソッドはJavaクラス上で静的であると見なされます。真でなければ、インスタンス・メソッドとして処理されます。
他のフィールドは、Apache/SOAPプラットフォームへの各社独自のアドオンに関係したものであり、この記事で扱う範囲を超えています。
フィールドに入力したら、スクロールダウンして、画面下部のdeploy (配置) ボタンをクリックします。サービスが配置されたことを示す画面が表示されるはずです。「List (リスト)」ボタンをクリックすれば、そのWeb ServicesのURNがリストされることでしょう。そのリンクをクリックすると、図5 に示す情報が表示されるはずです。
図5: Web ServicesのURNのリスト
お分かりのとおり、配置のプロセスは非常に容易で分かりやすいものです。現在配置されているサービスに関する情報はすべて、Tomcat/SOAPにより、現行ディレクトリーのDeployedServices.ds ファイルに保管されます。このファイルをわざわざ読もうなどと思わないでください。このファイルには、直列化されたJavaのハッシュ・テーブルが含まれているからです。
Web Servicesの呼び出し
JavaクライアントからWeb Servicesを呼び出すには、Apache/SOAPが必要とするさまざまなパッケージをインポートし、Callオブジェクトを構築して、そのフィールドを初期化することにより、リモートSOAP呼び出しを作成します。エンコードのスタイルは、通常、Constants.NS_URI_SOAP_ENC に設定されています。これは代替エンコード・スタイルであり、この記事の範囲を超えています。
各パラメーターは、引数の名前、引数のタイプ、引数の値 (プリミティブはそれに相当するObjectにラップされる)、および引数のエンコード・スタイル (ヌルの場合はデフォルトが選択される) を指定した、Parameterオブジェクトによって表されます。
メソッドの呼び出しを送信するには、SOAPエンドポイントのURLとSOAPAction値 (通常は空ストリング。次回のコラムで説明します) を指定して、invoke() メソッドを実行します。すべてが正常であれば、結果が戻され、プリミティブが、それに相当するオブジェクトにラップされます。リスト5 に、Javaクライアントのソース・コードを示します。
リスト5: Javaクライアントのコード
import java.net.*;
import java.util.*;
import org.apache.soap.*; // Body, Envelope, Fault, Header
import org.apache.soap.rpc.*; // Call, Parameter, Response
public class Client
{
public static void main( String[] args ) throws Exception
{
URL url = new URL( "http://localhost:8080/soap/servlet/rpcrouter" );
String urn = "urn:demo1:exchange";
Call call = new Call(); // prepare the service invocation
call.setTargetObjectURI( urn );
call.setMethodName( "getRate" );
call.setEncodingStyleURI( Constants.NS_URI_SOAP_ENC );
Vector params = new Vector();
params.addElement( new Parameter( "country1", String.class, "USA", null ) );
params.addElement( new Parameter( "country2", String.class, "japan", null ) );
call.setParams( params );
try
{
System.out.println( "invoke service\n" + " URL= " + url + "\n URN =" +
urn );
Response response = call.invoke( url, "" ); // invoke the service
if( !response.generatedFault() )
{
Parameter result = response.getReturnValue(); // response was OK
System.out.println( "Result= " + result.getValue() );
}
else
{
Fault f = response.getFault(); // an error occurred
System.err.println( "Fault= " + f.getFaultCode() + ", " +
f.getFaultString() );
}
}
catch( SOAPException e ) // call could not be sent properly
{
System.err.println( "SOAPException= " + e.getFaultCode() + ", " +
e.getMessage() );
}
}
}
|
java Client と入力してプログラムを実行すると、図6 に示す結果が表示されます。
図6: Javaクライアントの実行
最終的に、図7 に示すように、Web Servicesからの出力がTomcatの画面に表示されることになります。
図7: Tomcatに表示されるWeb Servicesの出力
おめでとうございます。これで、初めてのWeb Servicesを構築し、実行したことになります。ここからが本当に面白いところです。
インターネットを介したWeb Servicesの呼び出し
Web Servicesは、標準的なXMLフォーマットを使い、HTTPを介してメッセージングを行うので、インターネットを介してWeb Servicesを呼び出すのは非常に容易です。これを実際に見てみるには、XMethodsのサイト (参考文献を参照) にアクセスしてみてください。このサイトにはえり抜きのWeb Servicesがホスティングされており、それらのサービスは、この新しいテクノロジーを試してみるのに格好の例となっています。そのホーム・ページには、図8 に示すとおり、使用可能なWeb Servicesのリストが表示されています。
図8: XMethodsのWeb Servicesのリスト
この索引から、「Currency Exchange Rate (為替レート)」というWeb Servicesをクリックします。すると、URN、ルーター・エンドポイントのURL、およびデベロッパーに利用可能な各メソッドの説明など、Web Servicesの詳細をすべて記した画面 (図9 参照) が表示されます。
図9: Xmethodsの為替レートWeb Servicesの情報
次回のコラムで、Web Servicesについて、さらに詳細に調べることにします。今の時点では、XMethodsに公開されているWeb Servicesが、ここで構築したのと同じまったく同じメソッドを備えているということをご理解いただければ十分です。XMethodsのサービスを呼び出すには、JavaクライアントのURLとURN設定を、それぞれ http://services.xmethods.net:80/soap と urn:xmethods-CurrencyExchange に変更してから、クライアントを再実行してください。図10 に示す画面が表示されるはずです。
図10: 為替レートWeb Servicesの実行
初めてこの種のコードを実行したときのことを覚えていますが、メソッドの呼び出しが、インターネットを介して数千マイルも離れたところに届き、そこにあるサービスを呼び出すのは、不思議な感覚でした。
次回のコラムでは、XMLのオン・ザ・ワイヤー・フォーマット、エンコード・スキーム、およびWebサーバーとの統合も含め、SOAP内部の動作について説明します。
参考文献
著者について  | |  | Graham Glass氏はThe Mind Electric の創設者、CEO、主任設計士で、大規模分散コンピューティングの構築を専門としています。インターネットの進化は頭脳の進化を反映し、人々や企業が効率的にネットワークを形成するのを 助けるアーキテクチャーは、人々の頭脳をネットワークで結ぶアーキテクチャーにヒントを与えると 氏は考えています。
The Mind Electricの創設以前は、ダラスに本拠を置く、企業間統合に取り組むObjectSpace の会長、CTO、共同創設者でした。ObjectSpaceでは、Voyager製品ラインの設計者兼主任開発者として
分散コンピューティング、JGL Javaコレクション・ライブラリー、さらにクロス・プラットフォームのC++ ツールキットを手がけました。1996年にErnst and Young Entrepeneur年間賞を 受賞したのをはじめ、VoyagerおよびJGLの産業界の賞をいくつも受賞しています。
Graham Glass氏はまた、最先端テクノロジーのトレーニングを提供するObjectLesson社の創設者でした。UNIXおよびSTLに関するPrentice Hallの2冊の書籍を著作し、新しいテクノロジーに関する熱意にあふれた分かりやすい話をする 講演者としても知られています。
University of Southamptonで 数学およびコンピューター・サイエンスのBSc、University of Texasでコンピューター・サイエンスのMS、およびHaberdashers' Aske's Schoolで 英国 "O" レベルと "A" レベルをそれぞれ取得しました。産業界に身を転じる以前は、UTDで上級講師としてUNIX、C、C++、Smalltalk、およびプログラム言語を教えました。連絡先はgraham-glass@mindspring.com です。 |
記事の評価
|