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

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