Delphi 6 Enterprise では BizSnap により SOAP 関係のアプリケーション開発が非常に簡単にできるようですが Professional でも Microsoft SOAP Toolkit を使って開発することができます。今回は Delphi 6 Professional と Microsoft SOAP Toolkit + IIS を使って SOAP サーバー、SOAP クライアントをつくってみます。

SOAPとは
SOAP ( Simple Object Access Protocol ) の説明はあちこちのサイトにあるのでそちらにお任せします。 @IT : SOAPの仕掛けはどうなっている? MSDN : Web サービス と SOAP MSDN : SOAPホワイトペーパー 


Microsoft SOAP ToolKit / MS XML Parser
MSのサイトに Visual Studio 6.0 用の SOAP Toolkit を無償で配布しています。まずはこれをダウンロードしてください。2001年 8月時点での最新版は SOAP Toolkit 2.0 です。 ( SOAP Toolkit 2.0 のダウンロード ) それからもうひとつ、MS XML Parser 3.0 が必要です。これも MS のサイトからダウンロードしてください。( MSXML Parser 3.0 のダウンロード ) SOAP Toolkit は SOAP サーバー公開時に必要になる WSDL ファイルジェネレータなど便利なツールが入っています。


サンプルの作成
環境がそろったところで早速サンプルを作ってみたいと思います。サーバーには渡されたふたつの数値を加算してその結果を返すと言うありがちなサービスを用意し、クライアントからそのサービスにアクセスします。

サーバーアプリケーションの作成
ではサーバー側のほうから開発します。サーバーは ActiveX DLL で実装します。 [ 新規作成 | その他 ] で ActiveX ページから ActiveX ライブラリを選択します。これでプロジェクトが作成されます。ここでは SampleServer1.dpr と言う名前で保存します・次に [ 新規作成 | その他 ] の ActiveX ページから オートメーションオブジェクトを選択します。 CoClass 名をここでは Sample1 とし、Unit1 で保存します。次にタイプライブラリエディタが表示されます。ここで Add メソッドをひとつつくります。戻り値型は HRESULT で、パラメータを 3 つ以下のようにつくります。

Add メソッドはパラメータ Number1 、Number2 を足した結果を返します。コードは以下のようになります。

サーバーアプリケーションのコード
unit Unit1;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
  ComObj, ActiveX, SampleServer1_TLB, StdVcl;

type
  TSample1 = class(TAutoObject, ISample1)
  protected
    { Protected 宣言 }
    function Add(Number1, Number2: Double): Double; safecall;
  end;

implementation

uses ComServ;

function TSample1.Add(Number1, Number2: Double): Double;
begin
  Result  :=  (Number1 + Number2);
end;

initialization
  TAutoObjectFactory.Create(ComServer, TSample1, Class_Sample1,
    ciMultiInstance, tmApartment);
end.

後はコンパイルしてレジストリに登録します。今回はローカル環境の IIS を使うので [ 実行 | ActiveX サーバーの登録 ] を Delphi IDE から実行します。Web サーバーが別マシンの場合はそのマシン上で登録を行ってください。


WSDLファイルの生成
次にサービスの内容を公開するためのファイル、WSDL ファイルをつくります。このファイルを手書きでつくっていたらとてもしんどいと思います。SOAP Toolkit には WSDL ファイルを自動生成してくれる便利なツールがあります。それを使いましょう。スタートメニューから Microsoft SOAP Toolkit の中の WSDL Generator を起動します。起動したら以下の手順で進みます。


WSDLファイルの名前と登録する DLL を指定します。


公開するサービスを選択します。


公開先の URL 、リスナータイプ ( 普通は ISAPI です ) などを指定します。


最後に文字コードと生成される WSDL ファイルの保存先を選びます。


これで WSDL ファイルの生成は完了です。

次に IIS で DLL のあるフォルダに対するエリアスを設定します。これはしてもしなくてもいいです。ここでは DLL 、 WSDL のあるフォルダ D:\Work\Soap\svr\ に対して SampleServer1 と言うエリアスを設定しています。これで http://localhost/SampleServer1/ と言う URL でアクセスすることができるようになります。設定しない場合は DLL や WSDL ファイルを Inetpub\wwwroot の下のフォルダに移動しなければいけません。

 


クライアントアプリケーションの作成
次にクライアント側のアプリケーションを作成します。 Delphi を起動したら MS XML Parser と SOAP のタイプライブラリを取り込みます。 [ プロジェクト | タイプライブラリの取り込み ] を選び "Microsoft XML v3.0" を選び、 [ ユニットの作成 ] をクリックします。次に同じく [ プロジェクト | タイプライブラリの取り込み ] を選び "Microsoft Soap Type Library" を選びます。フォーム上には Edit と Button をひとつずつ配置し、ボタンをクリックしたら SampleServer1 の Add メソッドを呼び出し、その結果を Edit へ表示するようにプログラミングします。コードは以下のようになります。

クライアントアプリケーションのコード
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  MSSOAPLib_TLB;

procedure TForm1.Button1Click(Sender: TObject);
var
  SoapClient  : Variant;
begin
  SoapClient  :=  CoSoapClient.Create;
  SoapClient.mssoapinit('http://localhost/SampleServer1/SampleServer1.wsdl',
                        'SampleServer1',
                        'Sample1SoapPort');
  Edit1.Text  :=  FloatToStr(SoapClient.Add(1.0, 2.0));                        
end;

end.

SoapClient はオートメーションサーバーです。ここでは Variant 型を使ってレイトバインディングを行っています。 これを実行すると Edit1 に "3" と表示されるはずです。表示されれば成功です。

実行結果


まとめ
このように SOAP Toolkit を使うと XML をまったく意識せずにウェブサービスを開発、利用できます。SOAP クライアントアプリケーションを配布する場合は SOAP Toolkit 、MS XML Parser も配布する必要があるので注意してください。


ダウンロード
今回つくったサーバーとクライアントのソースファイルです。Delphi 6 Professional で開発しています。 >> ダウンロード 87KB 

2001 Delphi Acid Floor