ナッキーの「Turbo Delphiはじめて奮戦記」 - 第22回 占いプログラムでWebサービス-クライアント編

By: Hitoshi Fujii

Abstract: 前回に引き続き、占いプログラムをWebサービスで提供できるよう、手を加えていきましょう。今回はサーバープログラムを呼び出すクライアントプログラムを作ります。

Hide image
nacky75

ナッキー

前回はサーバー用のプログラムを作成しましたが、まだ本格的に動きませんでしたね。ここまでは、メッセージにしたがって作れば良かったから、難しくなかったわ。

 

Hide image
takahashi75b

高橋先生

今回も割りと簡単に作ることができるよ。まずは、占いプログラムが動くことを目標にしよう。


    仮想ディレクトリの作成

今度はWebサービスを呼び出すプログラムを作るのよね。Turbo Delphiを起動して何かユニットを追加すればいいのかな?教えて、高橋先生!

高橋先生:作り方はちょっと特殊なんだ。ブラウザでWebサーバーのプログラムを呼び出して、そのURLを基に必要なユニットを自動的に作るんだ。だから、ほとんどコードは書かなくてすむよ。

ナッキー:へぇ、今度も楽チンにできちゃうのね。

高橋先生:手順どおりに進める必要があるから、確認しながらゆっくりやろう。はじめにIIS(Internet Information Services)用のフォルダに、前回作ったCGIプログラムの実行形式ファイル(exeファイル)をコピーしよう。


まずは、その実行形式のファイルがあるかどうか、確かめなくっちゃね。エクスプローラやマイコンピュータなどからUranaiServerプロジェクトが保存されている場所を確認します。デフォルトの場所に保存してあれば、「My Documents」の「Borland Studio Projects」に「UranaiServer.bdsproj」があります。拡張子を表示しない設定だと、「UranaiServer」のファイルがいくつか表示されています。アイコンに「BDS」と表示されているのがプロジェクトファイルです。近くに「UranaiServer.exe」が見つかりましたか?拡張子が表示されていなければアイコンの図を参考にして探します。

Hide image
01アイコン

プロジェクト・実行形式EXE

図01 アイコン

もしも、プロジェクトはあるのに、「UranaiServer.exe」がないという場合は、実行テストがうまくできなかったみたいです。Turbo Delphiを起動して、「UranaiServer.bdsproj」を開いて実行してみます。実行してみても、「UranaiServer.exe」ができない場合は、Turbo Delphiの画面下部にエラーのメッセージが表示されていないか確認してみてください、って高橋先生が言ってました。

「UranaiServer.exe」ファイルが見つかったら、今度はIIS用のフォルダを探します。Windowsの入っているドライブに「Inetpub」フォルダがあります。見つかったら「Inetpub」フォルダを選択して、フォルダを新規作成します。フォルダ名は「Uranai」フォルダにします。作成できたら「Uranai」フォルダに「UranaiServer.exe」ファイルをコピーします。[Ctrl]キーを押しながらUranaiフォルダにUranaiServer.exeファイルをドラッグすると、コピーができます。

Hide image
02ファイルコピー

図02 ファイルコピー

ナッキー:コピーはできましたよ。次は、何をすればいいですか?

高橋先生:次は、さっき作った「Uranai」フォルダをインターネット上に公開しよう。そのために、IISの管理ツールを起動して少し設定する必要があるんだ。これも手順どおりやれば問題ないよ。

ナッキー:わぁ、いよいよインターネットとつなげるんですね。


では、IISの管理ツールを起動します。デスクトップのショートカットアイコンがある方は、アイコンをダブルクリックします。ショートカットがない方は、スタートメニューから[コントロールパネル(C)]をクリックします。コントロールパネルが表示されたら「管理ツール」アイコンをダブルクリックします。一覧から「インターネット インフォメーション サービス」をダブルクリックします。

起動ができたら、画面左側のフォルダを展開します。「インターネット インフォメーション サービス」の下で、ネットワーク上のコンピュータの名前と「(ローカルコンピュータ)」の[+]ボタンをクリックして、展開します。そのまま、「Webサイト」の[+]ボタンをクリックして「既定のWebサイト」を表示します。ここに、作成した「Uranai」フォルダを登録するんですって。「既定のWebサイト」の上で、マウスの右クリックでショートカットメニューを表示します。メニューから、「新規作成(N)|仮想ディレクトリ(V)...」を選択します。

Hide image
03仮想ディレクトリ作成

図03 仮想ディレクトリ作成

クリックするとすぐに、「仮想ディレクトリの作成ウィザードへようこそ」ダイアログボックスが表示されます。

Hide image
04仮想ディレクトリの作成ウ

図04 仮想ディレクトリの作成ウィザードへようこそ

画面の指示に従って、[次へ(N)>]ボタンをクリックします。「仮想ディレクトリエイリアス」の設定画面になります。

エイリアスは「別名」という意味なんですって。結び付けたいフォルダに名前をつけられます。同じ名前でも大丈夫ですよ。URLの一部となるので、半角英数で簡単な名前を付けます。ここでは「Uranai」とつけて、[次へ(N)>]ボタンをクリックします。

Hide image
05仮想ディレクトリエイリア

図05 仮想ディレクトリエイリアス

次は、エイリアスで指定した「Uranai」フォルダを、パソコン上のどのフォルダと関連付けるか、を指定します。「参照(R)...」ボタンをクリックして、「ローカルディスク(C:)」ドライブ、「Inetpub」フォルダ、「Uranai」フォルダとクリックして[OK]ボタンをクリックします。

Hide image
07フォルダの参照

図06 フォルダの参照

「Webサイトのコンテンツのディレクトリパス」に、参照するフォルダのパスが入ったら、[次へ(N)>]ボタンをクリックします。

Hide image
06ディレクトリパス

図07 ディレクトリパス

「アクセス許可」の画面では、すでに「読み取り(R)」と「ASPなどのスクリプトを実行する(S)」にチェックがつています。新たに「ISAPIアプリケーションやCGIなどを実行する(E)」をクリックしてチェックをつけて[次へ(N)>]ボタンをクリックします。

Hide image
08アクセス許可

図08 アクセス許可

これで、設定は完了です。[完了]ボタンをクリックします。

Hide image
09完了

図09 完了

仮想ディレクトリを作成したら、IISのサービスが開始されているか確認します。もしも、画面左の「既定のWebサイト」に「(停止)」が付いていたら、ツールバーの[開始]ボタンをクリックしてサービスを開始します。

Hide image
10サービスの開始

図10 サービスの開始

ブラウザを使って、自分自身のサイトにアクセスしてみます。ブラウザを起動して「http://localhost」にアクセスしてみます。ファイアウォールや、ウィルス対策ソフトのため、表示できないときもあるんですって。うまく表示できないときは、それらを停止して試してみるといいって高橋先生が言ってました。

Hide image
11localhost

図11 localhost

これって、どんな画面なんだろう?教えて、高橋先生!

高橋先生:Webサービスを実行していることが、確認できる画面だね。ファイルはエクスプローラなどからHTMLファイルを参照するのとは異なり、インターネットを経由して表示した画面なんだ。

ナッキー:なんか、ヘルプ画面も表示されますけど。

高橋先生:ヘルプ画面が表示されたら、そっちは閉じてしまってもいいよ。時間があるとき、読んで勉強してみてね。次は「http://localhost/Uranai/UranaiServer.exe」にアクセスしてみよう。

ナッキー:じゃあ、ヘルプのウィンドウは閉じてしまいますね。


「http://localhost/」が表示されているブラウザの、「アドレス(D)」欄に「http://localhost/Uranai/UranaiServer.exe」と入力して[Enter]キーを押します。

Hide image
12サービス情報

図12 サービス情報

わぁ!新しい画面が表示されました。

高橋先生:ここには、UranaiServer.exeで使える機能が一覧になっている。「IUranai」の中に、前回作成した「getUranaiMessage」関数も載っているよ。この画面には「WSDL」へのリンクも載っている。「WSDL」は「Web Services Description Language」の略で、Webサービスへアクセスするためのインターフェース用の言語。「WSDL」へのリンクをクリックしたらUranaiServer.exeにアクセスするために必要な情報が表示されるんだよ。

ナッキー:表示されたコードはどうやって使うんですか?

高橋先生:URLをコピーしてDelphiのユニット作成のとき使おう。とりあえず、「WSDL」へのリンクをクリックしてWSDLの内容を表示しておいて。

ナッキー:URLのコピーで作れるなら簡単ね。


じゃあ、「WSDL」へのリンクをクリックしてWSDLの内容を表示します。

Hide image
13WSDL

図13 WSDL

    インターフェースを使ったプログラムの作成

さっきの「WSDL」だっけ。それを使うユニットを作らなくちゃね。「UranaiServer」プロジェクトにユニットを追加すればいいのかな?教えて、高橋先生!

高橋先生:前回作った「UranaiServer」プロジェクトに、以前作った占いプロジェクトと合わせて「プロジェクトグループ」を作ろう。複数のプロジェクトをグループにまとめて管理できるんだ。

ナッキー:前回のプロジェクトと合わせるって、プロジェクトは1つしか開けないんじゃないんだっけ?

高橋先生:先に「UranaiServer」プロジェクトを開いておいて、そこへ以前の占いプロジェクトを追加する操作をすればいいんだ。

ナッキー:プロジェクトを追加できるのね。じゃあ、まずは「UranaiServer」プロジェクトを開きます。


先に、前回保存したプロジェクトを開きます。Turbo Delphiを起動して、画面中央の「ホームページ」で「UranaiServer.bdsproj」を選択。もし一覧に表示されていなければ、ツールバーの[プロジェクトを開く(Ctrl+F11)]ボタンをクリックします。「プロジェクトを開く」ダイアログボックスから「UranaiServer.bdsproj」を探します。

プロジェクトを開いたら、画面右上のプロジェクトマネージャを使います。一番上にある「ProjectGroup1」の上で、マウスの右ボタンをクリックして、ショートカットメニューを表示。[既存プロジェクトを追加]を選択します。操作手順によっては「ProjectGroup2」や「ProjectGroup3」のように末尾の番号が異なるかもしれませんが、そのまま操作しても大丈夫なんですって。

Hide image
14既存プロジェクトを追加

図14 既存プロジェクトの追加

追加する占いプログラムは、「第5回 占いプログラムでレイアウトをマスター」で作成しています。デフォルトに保存してあれば、マイドキュメントの「Borland Studio Projects」に入っています。一覧から「Fortune.bdsproj」を選択して、[開く(O)]ボタンをクリックします。

Hide image
15追加プロジェクトを選択

図15 追加プロジェクトの選択

追加したプロジェクトに、別の名前をつけて保存します。画面右上のプロジェクトマネージャで、「Fortune.exe」か「FormFortune.pas」が選択されていることを確認して、[ファイル]メニューの[名前を付けて保存(A)...]を選択します。これで「FormFortune」ユニットに名前を付けて保存できます。ファイル名は「FormFortuneWeb」とします。次に、[ファイル]メニューの[プロジェクトに名前を付けて保存(E)...]を選択します。ファイル名は「FortuneWeb」とします。

別名で保存すれば、もしも元に戻したくなっても大丈夫よね。そういえば、さっき開いておいたWSDLはどうなるんだっけ?

高橋先生:今、プロジェクトグループに追加した占いプログラムにWSDL用のユニットを追加するんだ。これで、Webサーバープログラムと占いプログラムとの間で、やり取りができるようになるよ。

ナッキー:どうやって、「WSDL用のユニット」を追加するんですか?

高橋先生:ウィザードを使って作ることができる。表示したWSDLの画面にあるURLをコピーしてね。

ナッキー:あ、さっきブラウザを使って表示した画面でコピーすればいいんですね。


では、さっき表示した「WSDL」のユニットを作成します。「FortuneWeb」プロジェクトがアクティブなのを確認します。「FortuneWeb.exe」の文字が、太字で表示されていればアクティブです。複数のプロジェクトが開いていても、いろいろな操作ができるのは一方だけなのね。確認できたら、[ファイル]メニューの[新規作成(N)|その他(O)...]を選択します。表示されるダイアログボックスの「項目カテゴリ(A):」で「WebServices」を選択します。右欄に表示されるアイコンから「WSDLインポーター」を選択して、[OK]ボタンをクリックします。

Hide image
16WSDLインポーター新規作成

図16 WSDLインポーター新規作成

作成すると、ウィザード画面になります。ウィザードは、問答形式で画面を進めていくと完成品ができる便利なツールなんだそうです。最初の画面の「WSDLファイルの位置またはURL:」欄に、さっき表示した「WSDL」画面のURLをコピーして貼り付けます。

Hide image
17WSDLのURL

図17 WSDLのURLをコピー

Hide image
18WSDLインポートウィザード

図18 WSDLインポートウィザード

貼り付けたら、[完了(F)]ボタンをクリックします。できたら、ツールバーの[すべて保存]ボタンをクリックします。さっき作ったWSDLインポーターのユニットは、「IUranaiUnit.pas」で保存します。プロジェクトを複数登録すると、それらをまとめるプロジェクトグループ用のファイルもできるんですって。ということで、最後にプロジェクトグループも保存します。グループ名は「UranaiGroup.bdsgroup」とします。これで、完成かな?

高橋先生:今度は、占いプログラムからWebサーバーのgetUranaiMessage関数を呼び出さないとね。そのために、FormFortuneWebユニットでIUranaiUnitユニットを使えるようにしよう。

ナッキー:あ、ユニットの追加ですね。

高橋先生:追加できたら、getUranaiMessage関数を呼び出せるようにコードを書き直そう。WSDLから生成された型であるIUranai型のオブジェクト変数と、メッセージを受け取れるようにWideString型の変数を用意しよう。

ナッキー:インターフェースって何でしたっけ?

高橋先生:プログラムとプログラムをつなぐためのものだよ。今回はCGIプログラムとのやり取りのためにインターフェースを使うんだ。IUranaiはウィザードで自動に作成したオブジェクト。占いプログラムからIUranaiオブジェクトを介して、UranaiServer.exeのgetUranaiMessage関数を呼び出すよ。

ナッキー:じゃあ、「IUranai.getUranaiMessage」って書けばいいんですか?

高橋先生:「ユニットを使う」でuses節に追加したから、そのまま使えると思うかもしれない。けれど、インターフェースを使う時にはダイレクトに扱えないんだ。GetIUranai関数を使ってIUranai型のオブジェクト変数に代入してから使おう。代入するときも「GetIUranai」関数を使ってね。変数名はIUranaiの文字を使って「iu」としよう。

ナッキー:すんなり使えないんですね。じゃあ、もう1つの変数に使われている「WideString型」ってどんな型ですか?

高橋先生:16ビットのUnicodeという種類の文字列の型だよ。通常のstringと大体同じように使うことができるよ。異なるプログラムとのデータのやり取りのときに、WideString型でないと扱えない、という場合があるんだ。変数名には「占いのメッセージ」から取って「um」としよう。

ナッキー:いろんな型を使うんですね。

高橋先生:CGIのプログラムを使うので、いつもとはちょっと違う型を使わないと、データのやり取りができないんだ。用意する変数の型を整えれば、それほど難しくはないよ。


いよいよ、コードを記述するのね。では、画面右上のプロジェクトマネージャの「FormFortuneWeb」ユニットをダブルクリックして、コードを表示します。できたら、ユニットを追加します。ファイルメニューの[ユニットを使う(U)...]をクリックして、ユニットの追加ダイアログボックスを表示します。一覧から「IUranaiUnit」を選択して[OK]ボタンをクリックします。

次に、「ShowItem」関数を探します。ShowItem関数では、血液型とラッキーアイテムを選んでいました。この関数の部分は、今回サーバープログラムがやってくれるので、変更するんですって。まず、変数は3つとも使わないのでコメントにしておきます。代わりにWSDLインターフェースの型である、IUranai型の「iu」オブジェクト変数と、WideString型の「um」変数を用意します。太字部分を追加します。

procedure ShowItem(Blood : Integer);
var
//  Blood_Type : string;
//  Lucky_No : Integer;
//  Lucky_Item : string;
  iu : IUranai;
  um : WideString;
begin
  (中略)
end;

変数が用意できたら、ShowItem関数の中のコードをすべてコメントにします。一度に複数行コメントにするのでここでは「{ }」を使っています。

procedure ShowItem(Blood : Integer);
var
//  Blood_Type : string;
//  Lucky_No : Integer;
//  Lucky_Item : string;
  iu : IUranai;
  um : WideString;
begin
{ ココから→
  case Blood of
    1 : Blood_Type := 'A型';
    2 : Blood_Type := 'B型';
    3 : Blood_Type := 'O型';
    4 : Blood_Type := 'AB型';
  end;

  Lucky_No := Random(5);
  case Lucky_No of
    0 : Lucky_Item := '携帯電話';
    1 : Lucky_Item := '手紙';
    2 : Lucky_Item := '鍵';
    3 : Lucky_Item := 'デジカメ';
    4 : Lucky_Item := 'チョコレート♪';
  end;

  ShowMessage(Blood_Type + 'のあなた、ラッキーアイテムは' + Lucky_Item);
 ←ココまで コメント}
end;

ここへ、getUranaiMessage関数を呼び出せるようにコードを記述します。「GetIUranai」関数を使ってiu変数にIUranaiオブジェクトを代入します。特別なパラメータは必要ないので「( )」は省略できますね。次に、iuオブジェクトのgetUranaiMessage関数を使って、WideString型で用意したum変数に占い結果を代入します。パラメータには血液型につけた番号1から4が入ります。ここでは、ShowItem関数のパラメータ「Blood」をそのまま使用します。太字部分を追加します。

procedure ShowItem(Blood : Integer);
var
//  Blood_Type : string;
//  Lucky_No : Integer;
//  Lucky_Item : string;
  iu : IUranai;
  um : WideString;
begin
{
  (中略)
  ShowMessage(Blood_Type + 'のあなた、ラッキーアイテムは' + Lucky_Item);
}
  iu := GetIUranai();
  um := iu.getUranaiMessage(Blood);
  ShowMessage(um);
end;

できたら、保存して実行してみます。フォームが起動できたら、適当にボタンをクリックしてみます。ちょっと時間がかかりましたがメッセージが表示できました。

Hide image
19占い結果表示

図19 占い結果表示

もしも、うまく動かないときはIISが停止していないか、ファイアウォールやウィルス対策ソフトが働いていないかチェックしてみてください。これで完成よね!

高橋先生:「Random」関数を使っている場所が変わったので、「Randomize」の場所も変更しないとね。

ナッキー:Randomizeって何でしたっけ?

高橋先生:Random関数って乱数表のようなものを使っているんだよ。乱数表は、はじめは決まった順で並んでいるので、かき混ぜないと、プログラムを動かすごとにバラバラな順にはならないんだ。乱数表をかき混ぜてくれるのがRandomize手続きだよ。フォームのOnCreateイベントでやっていたけれど、メッセージを作る関数をサーバープログラムに移したので、サーバープログラムでRandomizeを実行する必要があるよ。

ナッキー:でも、サーバープログラムには、フォームがありませんよ。OnCreateイベントもありませんよね。どこに記述すればいいんですか?

高橋先生:プロジェクトに記述してみよう。プロジェクトはプログラムを管理しているところだったね。ここにもコードを書くことができるんだよ。デバッグツールを使っているとき、見たことがあるかもしれないね。

ナッキー:あーそういえば、ステップ実行のときに短いコードが並んだページが出てきたけど、それかな?とにかく、やってみます。


まずは、今あるRandomize手続きをコメントにしないとね。コードエディタで「FormCreate」イベントハンドラを探して、Randomizeの行をコメントにします。

procedure TForm1.FormCreate(Sender: TObject);
begin
//  Randomize;
end;

コメントにできたら、保存して再構築っていう操作をします。実行の場合は操作もしていましたよね。操作のテストは、いらないなぁっていうときに「再構築」をすると、構文のチェックと実行形式ファイルの作成までをやってくれるんだって。メニューバーの[プロジェクト(P)|FortuneWebを再構築(B)]をクリックするか、[Shift]キーを押しながら[F9]キーを押します。エラーが表示されなければOK。

次に、UranaiServerプロジェクトの操作をします。プロジェクトマネージャで「UranaiServer.exe」を選択して、[アクティブ(A)]ボタンをクリックします。「UranaiServer.exe」の文字の上で、マウスの右ボタンクリックで、ショートカットメニューを表示して、[ソース表示(V)]を選択します。これで、画面上にプロジェクトのコードが表示されますね「begin」と「end.」の間に「Application.」ではじまる行がいくつかありますが、一番上に空白行を作って、「Randomize;」を記述します。太字部分を追加します。

program UranaiServer;

{$APPTYPE CONSOLE}

uses
  WebBroker,
  CGIApp,
  UranaiUnit in 'UranaiUnit.pas' {WebModule5: TWebModule},
  UranaiImpl in 'UranaiImpl.pas',
  UranaiIntf in 'UranaiIntf.pas';

{$R *.res}

begin
  Randomize;
  Application.Initialize;
  Application.CreateForm(TWebModule5, WebModule5);
  Application.Run;
end.

できたら、すべて保存して再構築しておきます。サーバープログラムは実行しても何も操作することがないから、再構築で十分よね。エラーが出なければ大丈夫です。

これで完成!もう一度実行してみて、メッセージが携帯電話から始まらないことを確認します。

ナッキー:インターネット経由でプログラムが呼び出せちゃうんですね。なんだか、すごいプログラムを作った気分。でもほとんどコードを記述していないんですよね。

高橋先生:そうだね。今回説明しなかったことがらには、プログラムの配布や実際のサーバーへのアップロードなどがあるよ。URLなんかも変わってくるから注意が必要だ。

ナッキー:自分のパソコンをサーバーにするんじゃないんですか?

高橋先生:自分のパソコンはあくまでもテスト環境だね。実用的じゃないよ。実用化するならば、プロバイダの提供するサーバーを利用するなど、専用のサーバーを使ったほうがいいよ。そのときCGIが使えるかどうか確認してね。

ナッキー:自分のパソコンを使うと、安全面でも心配が出てきますよね。テストが終わったらIISを停止しとかなくっちゃ。

高橋先生:次回は、当初の目的だった可変のラッキーアイテムに対応しよう。

ナッキー:えー、まだ完成じゃなかったのね。でも、がんばっちゃおう。


ナッキーの「Turbo Delphiはじめて奮戦記」

Prev | Next | Index


Server Response from: ETNASC02