Delphi 6 Enterprise に付属する BizSnap を使った SOAP サーバ/クライアントアプリケーション開発方法を説明します。おまけであんまり役に立たない google用クライアントの開発方法も説明します。

SOAPサーバをつくる
SOAPクライアントをつくる
google用SOAPクライアントをつくる

SOAPサーバをつくる

Delphi を起動し、 [ ファイル | 新規作成 - その他 ] - "WebServices" の中から "SOAPサーバーアプリケーション" を選びます。

SOAPサーバーの新規作成ダイアログが表示されたら、ウェブサーバーアプリケーションの形態を選びます。これはどれでもいいです。それぞれの長所短所は Delphi 6 の開発者ガイドの 27-6 を参照してください。このサンプルでは CGI 実行形式を選びます。

[ OK ] をクリックすると以下のような "SOAPモジュールのためのインターフェースを作成しますか?" と言うメッセージが表示されます。 [ はい ] をクリックします。間違って [ いいえ ] を選んだ場合は [ ファイル | 新規作成 - その他 ] - "WebServices" の "SOAPサーバーインターフェース " で作成できます。

サービス名を入力します。例えば、TestServiceとします。サンプルメソッドの生成をチェックすると4つのサンプルメソッドが登録されます。サービスアクティベーションモデルは "リクエストごと" か、"グローバル" のいずれかを選択します。 [ ヘルプ ] を押してもヘルプが出ないのは私だけかな、、。

[ OK ] をクリックするとユニットが3つ自動でつくられます。Unit1 と、<サービス名>Impl、<サービス名>Intf です。 Intfユニットにサービスが公開するメソッドを記述します。今回、公開するメソッドは "ComputeAdd" と、 "ComputeSubtract" の二つなので以下のようにインターフェースを記述します。 (赤い部分が入力した個所)

■TestServiceIntf.pas の内容
{ 起動可能インターフェース ITestService }

unit TestServiceIntf;

interface

uses InvokeRegistry, Types, XSBuiltIns;

type

  { 起動可能インターフェースは IInvokable から継承される。}
  ITestService = interface(IInvokable)
  ['{9CEF6E56-4691-4620-9445-DB6A5B7E9107}']
    function  ComputeAdd(Value1, Value2: integer): integer; stdcall;
    function  ComputeSubtract(Value1, Value2: integer): integer; stdcall;  
    { 起動可能インターフェースのメソッドにはデフォルトの呼び出し規約を }
    { 使うことはできません。stdcall 呼び出しを推奨します。}
  end;

implementation

initialization
  { 起動可能インターフェースは登録する必要がある }
  
  InvRegistry.RegisterInterface(TypeInfo(ITestService));

end.

続いて、このインターフェースの実装を記述します。TestServiceImpl.pas ユニットに以下のように記述します。(赤い部分が入力した個所)

■TestServiceImpl.pas の内容
{ ITestService インターフェースを実装する TTestService の定義 }

unit TestServiceImpl;

interface

uses InvokeRegistry, Types, XSBuiltIns, TestServiceIntf;

type
  { TTestService }
  TTestService = class(TInvokableClass, ITestService)
  public
    function  ComputeAdd(Value1, Value2: integer): integer; stdcall;
    function  ComputeSubtract(Value1, Value2: integer): integer; stdcall;  
  end;

implementation

{ TTestService }

function TTestService.ComputeAdd(Value1, Value2: integer): integer;
begin
  Result  :=  Value1 + Value2;
end;

function TTestService.ComputeSubtract(Value1, Value2: integer): integer;
begin
  Result  :=  Value1 - Value2;
end;

initialization
  { 起動可能インターフェースは登録する必要がある }

  InvRegistry.RegisterInvokableClass(TTestService);

end.

サーバ側のプログラミングは以上で終了です。保存してコンパイルします。EXE を IIS の公開フォルダに配置します。そのフォルダには実行権を与えてください。

WSDLはどこ?
Delphi でつくったSOAPサーバーは、WSDLのファイルが付属していません。インターフェイスを見て自分でXMLファイルをつくるのか?もちろん、違います。ブラウザで、SOAPサーバーのファイル名の後ろに /wsdl を追加してアクセスしてみてください。このようなページが出てきます。これは WSDLHTMLPublishコンポーネントが生成しています。


SOAPクライアントをつくる

Delphi を起動し、 [ ファイル | 新規作成 - アプリケーション ] を選びます。

次に [ プロジェクト | プロジェクトに追加 ] で、サーバ側の "xxxIntf.pas" ユニットをプロジェクトに追加します。

フォーム上に Editをふたつ、Labelをひとつ、Buttonをひとつ配置し、Butttonのクリックイベントに以下のように記述します。SOAPサーバの ComputeAdd メソッドを呼び出し、その結果を Label に表示します。

■クライアントアプリの内容
unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  TestServiceIntf, SoapHTTPClient;

procedure TForm1.Button1Click(Sender: TObject);
var
  HTTPRio: THTTPRio;
  TestService: ITestService;
  n: integer;
begin
  HTTPRio     :=  THTTPRio.Create(nil);
  HTTPRio.URL :=  'http://localhost/soap/Project1.exe/SOAP/';
  TestService :=  HTTPRio as  ITestService;
  n :=  TestService.ComputeAdd(StrToInt(Edit1.Text), StrToInt(Edit2.Text));  
  Label1.Caption  :=  IntToStr(n);
  HTTPRio.Free;
end;

end.

SOAPサーバーを呼び出すには THTTPRio クラスを使います。このクラスは指定された URL のサーバーに接続します。さらにインターフェースにキャストすることでそのインターフェースが実装しているメソッドを呼び出せます。URLプロパティはサーバー側が Delphi でつくられている場合のみ利用可能です。この時、実行ファイル名の後ろに /SOAP/ をつけます。

実行し、ボタンをクリックすると結果が Label に表示されます。


google用SOAPクライアントをつくる

googleはその機能の一部をウェブサービスとして試験的に公開しています。このサービスに Delphi からアクセスしてみましょう。まずは、このウェブサービスにアクセスするためのアカウントを取得します。 http://www.google.com/apis/ のページの 2 : Create a Google Account をクリックして Terms of Service と Privacy Policy を熟読した後にメールアドレス、パスワード (6文字以上) を入力します。

指定のメールアドレスにメールが送られてくるのでその中に記述してある URL をブラウザで開くとライセンスキーが書かれたメールが送られてきます。ライセンスキーは4行目に書かれてます。

さて、いよいよ開発です。Delphi を起動し、 [ ファイル | 新規作成 - アプリケーション ] を選びます。

次に、[ ファイル | 新規作成 - その他] "WebServices" の中から "WSDLインポート" を選びます。

以下のようなダイアログが表示されます。WSDLのURLを入力します。googleは、 http://api.google.com/GoogleSearch.wsdl です。

[ 次へ ] をクリックすると、指定URLから WSDL をダウンロードしますが、プロキシを使いたい場合は [ オプション ] をクリックします。以下のダイアログが表示されるのでプロキシにアドレスとポート番号を入力します。

コード生成に関する詳細設定を行うこともできます。

WSDLのインポートに成功すると以下のようなツリーが表示されます。

[ 完了 ] をクリックし、インポートを終了します。フォームに、Edit、Button、Memoを配置し、Editに入力されたキーワードで検索し、その結果を Memoに表示するコードを記述します。

■クライアントアプリの内容
unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  GoogleSearch;

procedure TForm1.Button1Click(Sender: TObject);
var
  google: GoogleSearchPort;
  googleResult: GoogleSearchResult;
  i : integer;
begin
  google        :=  GetGoogleSearchPort;
  googleResult  :=  google.doGoogleSearch('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
                                          Edit1.Text,
                                          0,
                                          10,
                                          False,
                                          '',
                                          False,
                                          '',
                                          '',
                                          '');
  for i :=  Low(googleResult.resultElements)  to  High(googleResult.resultElements) do 
  begin
    Memo1.Lines.Add(
      googleResult.resultElements[i].title);
    Memo1.Lines.Add(
      googleResult.resultElements[i].URL);
    Memo1.Lines.Add('');
  end;
end;

end.

doGoogleSearchメソッドが検索メソッドです。第一引数にはメールで送られてきたライセンスキーを入力します。第二引数には検索する文字列を指定します。後は引数の変数名で適当に予想してください。

実行し、ボタンをクリックするとこのようになるはずです。


2002 Delphi Acid Floor