クライアント アプリケーションでのヘッダーの処理

提供: RAD Studio
移動先: 案内検索

Web サービスのクライアントの記述 への移動


呼び出そうとしている Web サービス アプリケーションで、クライアントからの要求に何かヘッダーが含まれていることになっている場合や、応答メッセージに特別なヘッダーが含まれている場合、クライアント アプリケーションには、それらのヘッダーに対応するヘッダー クラスの定義が必要になります。 Web サービス アプリケーションを記述する WSDL ドキュメントをインポートすると、インポータによって、これらのヘッダー クラスを宣言するコードが自動的に生成され、それらのクラスがリモート可能型レジストリに登録されます。 サーバーが Delphi で作成されている場合は、WSDL ファイルのインポートで生成されるファイルではなく、サーバー アプリケーションでこれらのヘッダー クラスの定義および登録に使用されるのと同じユニットを使用できます。 ユニットでは、呼び出し可能なインターフェイスの登録時に、必ず同じ名前空間 URI および SOAPAction ヘッダーを使用するようにしてください。 これらの値は、インターフェイスを登録するコードに明示的に指定することもできますし、自動的に生成することもできます。 自動生成の場合、インターフェイスを定義するユニットはクライアントとサーバーのいずれも同じ名前とし、クライアントとサーバーの両方でグローバル変数 AppSpacePrefix に同じ値を定義してください。

メモ: ヘッダー クラスについての詳細は、「SOAP ヘッダーの定義と使用」を参照してください。

サーバーとの場合、クライアント アプリケーションは Soap.InvokeRegistry.ISOAPHeaders インターフェイスを使用して、入力ヘッダーにアクセスし、出力ヘッダーを追加します。呼び出し可能なインターフェイスの呼び出しに使用するリモート インターフェイス オブジェクトは、ISOAPHeaders インターフェイスを実装します。 ただし、ISOAPHeaders インターフェイスをリモート インターフェイス オブジェクトから直接取得することはできません。 その理由は、リモート インターフェイス オブジェクトからインターフェイスを直接取得しようとすると、そのインターフェイスが呼び出し可能なインターフェイスであると仮定して、インメモリ vtable が生成されるからです。 したがって、リモート インターフェイス オブジェクトからではなく、呼び出し可能なインターフェイスから ISOAPHeaders インターフェイスを取得する必要があります。

 var
   Service: IMyService;
   Hdr: TAuthHeader;
   Val: Double;
 begin
   Service := HTTPRIO1 as IService;
   Hdr := TAUthHeader.Create;
   try
     Hdr.Name := "Frank Borland";
     Hdr.Password := "SuperDelphi";
     (Service as ISOAPHeaders).Send(Hdr); { add the header to outgoing message }
     Val := Service.GetQuote("BORL"); { invoke the service }
   finally
     Hdr.Free;
   end;
 end;

認証を使用した例

この例は、https://www.geosvc.com/ にある郵便番号検索サービス用です。詳細については、http://api.geosvc.com/ZipCodeLookup.asmx にアクセスしてください。

procedure TForm1.Button1Click(Sender: TObject);

var
  WS: GeoPlacesSoap; // web service interface; uses placelookup
  Token: AuthenticationHeader;  // soap header
begin
  Token := nil;
  WS := GetGeoPlacesSoap;
  try
    Token := AuthenticationHeader.Create;
    Token.SessionID := 'myregistrationidentifier';
    (WS as ISOAPHeaders).Send(Token);
    WS.GetPlacesWithin('94558', 'CA', 25, City);
  finally
    FreeAndNil(Token);
  end;
end;

説明と詳細なソース コードについては、EDN で公開されている Bob Swart のビデオをご覧ください: http://edn.embarcadero.com/article/41013 - 『Delphi SOAP Web Services and Security(Delphi による SOAP Web サービスとセキュリティ)』(英語版)

関連項目

SOAP ヘッダーの定義と使用