第3回 Webサービス・クライアントを作ろう

中林 紀彦
日本アイ・ビー・エム株式会社
2003/1/28

Webサービス・クライアント作成手法

 今回は、サービスを利用する側のアプリケーション(Webサービス・クライアント)を作っていきます。サービスの提供者は、XMethods(http://www.xmethods.com/)やWebサービス同好会(http://objectclub.esm.co.jp/webservice/)で公開されているデモ・サービスを利用します。

素因数分解Webサービスを使ったシンプルなアプリ

 最初に、素因数分解Webサービスを利用したアプリケーションを作ってみましょう。引数に整数を与えると素因数分解する、極めてシンプルなWebサービスで、Webサービス同好会が提供しています。

http://objectclub.esm.co.jp/webservice/services.html#SoinsuBunkai

 [ファイル]−[新規作成]−[アプリケーション]で新しいアプリケーションを準備します。これをそのまま[ファイル]−[すべて保存]として、ユニットとプロジェクトをUnit1.pas、Soinsu.dprという名称で保存します。

画面1 Kylixの[新規作成]ダイアログボックス

 次に、WSDLをインポートするために[ファイル]−[新規作成]−[その他]の[WebServices]タブでWSDLインポートウィザードを起動します。

 ウィザードが起動したら、WSDLソースのURLとして、

http://nile.esm.co.jp:8080/wsdl/SoinsuBunkai.wsdl

を入力します。すると、画面2のように型とインターフェイスが表示されるので[完了]ボタンを押してWSDLをインポートし、生成されたファイル(SoinsuBunkai.pas)を保存します。

画面2 素因数分解Webサービスの型とインターフェイス

 ここまで準備ができたら、Webサービスに整数を渡して結果を表示するためのフォームを作成します。フォームへ[Standard]タブからEditコンポーネント2つ(Edit1、Edit2)とButtonコンポーネント(Button1)をドロップし、画面3のように配置して大きさを調整します。ここでは、Form1のCaptionを「素因数分解」、Button1のCaptionを「O.K.」としました。また、Edit1、Edit2のTextプロパティは空白にしておきます。

画面3 Webサービス・クライアントのフォーム

画面4 HTTPRIO1の各プロパティを設定したところ

 ここからいよいよWebサービス・クライアントの実装です。[WebServices]タブからHTTPRIOコンポーネント(HTTPRIO1)をドロップします。HTTPRIOは、HTTPを使ってSOAPサーバ(Webサービス・プロバイダ)に接続し、公開されているサービス(メソッド)を利用するためのコンポーネントです。

 HTTPRIO1のWSDLLocationプロパティに、先ほどインポートしたWSDLのURLと同じhttp://nile.esm.co.jp:8080/wsdl/
SoinsuBunkai.wsdlをセットします。続いて、Serviceプロパティ、Portプロパティを順にドロップダウンから選択します。URLが正しければ、それぞれSoinsuBunkai_service、SuinsuBunkai_portが選択できるはずです。

 それでは、Webサービスを使う部分を作っていきましょう。[ファイル]−[ユニットを使う]で、Unit1.pasに「SoinsuBunkai」を追加します。すると、ソースの27行目に以下の行が追加されます。


    uses SoinsuBunkai;

 SoinsuBunkaiを追加したら、[O.K.]ボタンをダブルクリックしてクリック時のイベントを記述します。

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;                                         
  InterFaceObj: SoinsuBunkai_portType;                
begin
  try                                                 
    i := StrToInt(Edit1.Text);                        
  except                                              
    i := 100;                                         
  end;                                                

  InterFaceObj := HTTPRIO1 as SoinsuBunkai_portType;  
  Edit2.Text := InterFaceObj.getText(i)               

end;

整数iとWebサービスのインターフェイス・オブジェクト「InterFaceObj」の2つの変数を定義
Edit1に入力された文字を整数に変換してiへ代入
getTextメソッドを使って素因数分解を実行し、Edit2に表示

 Kylixではこのように、WSDLをインポートして生成したユニットに記述されたメソッドを使ってWebサービスにアクセスします。

 ここまで準備できたら実行してみましょう。Edit1に適当な整数(例では64)を入力し、[O.K.]ボタンを押します。画面5のように素因数分解の結果(編注)が表示されれば成功です。

画面5 アプリケーション実行画面

 素因数分解のロジックはまったく記述していないのに、素因数分解を行うアプリケーションができてしまうのはちょっと不思議な感じがします。しかし、言い換えるとこれがWebサービスなのです。ロジックはWebサービスを提供するリモート側にあって、利用者はロジックを意識しないで利用することができるのです。

編注:画面5はEditコンポーネントのサイズの関係で「2*2*2*2*2」と表示されているが、実際には2^6なので「2*2*2*2*2*2」である。

複数のWebサービスを組み合わせたアプリ

 アメリカの気温をZipコード(郵便番号)から検索するWebサービスのクライアントを作ってみましょう。これは、XMethodsが提供しています。

http://www.xmethods.com/ve2/ViewListing.po;jsessionid=
ZkUQocdVZeJIYnIbezIcShBC(QhxieSRM)?key=uuid:477CEED8-1EDD-89FA-1070-6C2DBE1685F8

 作業手順は素因数分解Webサービスとほぼ同じです。[ファイル]−[新規作成]−[アプリケーション]で新しいアプリケーションを準備し、[ファイル]−[すべて保存]でユニットとプロジェクトをUnit1.pas、Temp.dprとして保存します。

 次に[ファイル]−[新規作成]−[その他]の[WebServices]タブからWSDLインポートウィザードを起動し、URLに

http://www.xmethods.net/sd/2001/TemperatureService.wsdl

を入力、生成されたファイル(TemperatureService.pas)を保存します。

 素因数分解と同様に、[Standard]タブからEditコンポーネント2つ(Edit1、Edit2)とButtonコンポーネント(Button1)をフォームにドロップし、画面6のように配置して大きさを調整します。ここではForm1のCaptionを「U.S. Temperature」、Button1のCaptionを「O.K.」としました。Edit1、Edit2のTextプロパティは空白にしておきます。

画面6 各コンポーネントを配置

 WSDLLocationプロパティに、先ほどインポートしたWSDLのURLと同じhttp://www.xmethods.net/sd/2001/TemperatureService.wsdlをセットします。次に、Serviceプロパティ、Portプロパティを順にドロップダウンから選択します。URLが正しければ、TemperatureService、TemperaturePortが選択できるはずです。

 ここまで準備できたら、Webサービスを利用する部分をコーディングします。Unit1.pasに[ファイル]−[ユニットを使う]でTemperatureServiceを追加します。すると、ソースの27行目に以下の行が追加されます。

    uses TemperatureService;

 [O.K.]ボタンをダブルクリックして、クリック時のイベントを記述します。

procedure TForm1.Button1Click(Sender: TObject);
var
  zc: String;                                          
  InterFaceObj: TemperaturePortType;                   
begin
  zc := Edit1.Text;                                    

  InterFaceObj := HTTPRIO1 as TemperaturePortType;     
  Edit2.Text := FloatToStr(InterFaceObj.getTemp(zc));  

end;

使用する変数を定義
Edit1の入力をzcへ代入
getTempメソッドで現在の気温を取得し、Edit2に表示

 それでは実行してみましょう。試しに「94192」(サンフランシスコのZipコード)を入力し、[O.K.]ボタンをクリックします。数字が表示されたでしょうか?

画面7 気温は取得できたが……

 画面7で表示されている数字は華氏(F)なので、ピンときませんね。

 XMethodsにはTemperature Conversion Serviceという華氏−摂氏変換サービスが登録されているので、これを利用すれば摂氏(℃)に変換して表示することも可能です。

http://www.xmethods.com/ve2/ViewListing.po?key=uuid:396577C1-EE97-6A65-AC0B-307B2C6943FA

 同様のサービスがWindows.netで公開されています。

http://www.wimdows.net/articles/article.aspx?aid=11

 両者には、数値を整数で扱うか単精度浮動小数点で扱うかという違いがあります。今回は精度の良い後者を利用して、摂氏に変換する機能を追加してみましょう。

 準備として、WSDL(http://www.wimdows.net/webservices/temperature.asmx?WSDL)をインポートし、ファイルを保存します(temperature.pas)。そしてForm1にHTTPRIOをもう1つドロップし(HTTPRIO2)、各プロパティを以下のように設定します。

WSDLLocation http://www.wimdows.net/webservices/temperature.asmx?WSDL
Service Temperature
Port TemperatureSoap

 WSDLの準備ができたら、[O.K.]ボタンをクリックしたときのイベントを以下のように修正します。

procedure TForm1.Button1Click(Sender: TObject);
var
  zc: String;
  InterFaceObj: TemperaturePortType;
  InterFaceObj2: TemperatureSoap;                       
begin
  zc := Edit1.Text;

  InterFaceObj := HTTPRIO1 as TemperaturePortType;      
  InterFaceObj2 := HTTPRIO2 as TemperatureSoap;         
  Edit2.Text := Copy(FloatToStr(InterFaceObj2.fahr2cels(InterFaceObj.getTemp(zc))), 1, 8);                     

end;

変数を追加
華氏を摂氏に変換するメソッドを追加。Single(単精度浮動小数点)は有効けた数7けたなので、それ以上は切り捨て

 コードを修正したら実行してみましょう。摂氏で表示されていれば成功です。華氏→摂氏の変換式は、

C=5×(F-32)/9

ですので、例えば45°Fは約7.2℃です。

画面8 摂氏で表示されるようになった

 このようにWebサービスを組み合わせることで、単体のサービスの付加価値をさらに高めることができます(図2)。今回のサンプルのようにWindows .NETとLinuxという異なるプラットフォーム上で公開されるサービスを1つのアプリケーションから利用できることも大きなメリットの1つです。

図2 異なるプラットフォーム上のWebサービスを組み合わせることも可能

 さらに、気温だけでなく当日の天候や1週間の天候、気温の変化を提供するWebサービスなどがあれば、立派なお天気ポータルサイトが出来上がります。

2/3

Index
Kylix 3とDB2で作るWebサービス・アプリケーション
 第3回 Webサービス・クライアントを作ろう
  Page 1
Webサービスの基本概説
  Page 2
Webサービス・クライアント作成手法
 素因数分解Webサービスを使ったシンプルなアプリ
 複数のWebサービスを組み合わせたアプリ
  Page 3
Webサービスを使ったWebアプリケーション
 アプリケーションの作成
 Apacheの設定とアプリの実行

連載 Kylix 3とDB2で作るWebサービス・アプリ


 Linux Squareフォーラム プログラミング関連記事
特集:オブジェクト指向に生まれ変わるPHP5[前編]
現在開発中のPHP5は、オブジェクト指向機能が大幅に強化される。次世代PHPはどのような言語になるのか?
特集:Windows開発者に贈る Kylixの全貌
注目の開発環境「Borland Kylix」がいよいよ見えてきた。ここに、英語版の発売を目前に控えたKylixの機能やアーキテクチャを紹介しよう
特集:Kylixプログラミング作法
GUIの構築やコンポーネントとコードの関係、 Object Pascalの仕様など。 これらの点を、実際に日本語ベータ版でプログラミングしながら分かりやすく解説
連載:PHP4で作るWeb-DBシステム(全5回)
PHPはWebサーバとデータベースを結びつけるものだ。そのためPHPでの開発を開始するには、OS、データベース、Webサーバ、そしてPHPと、多くのソフトウェアのインストールを行う必要がある
連載:ステップ・バイ・ステップ・シェルスクリプト(全7回)
Linuxの中でシェルスクリプトはネットワークの設定、デーモンの起動など重要な役割を果たしている。この連載では、シェルスクリプトで実用的なプログラムを組むことを目標にして、シェルの基本的な知識を説明する
連載:Kylix 3とDB2で作るWebサービス・アプリ(全5回)
Kylix 3とDB2 V8.1を使って、Webサービス・アプリを作ってみよう。トライアル版も用意されているので、実際に試しながら読んでほしい

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します


Linux & OSS フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Linux & OSS 記事ランキング

本日 月間