Header in Client-Anwendungen verarbeiten

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Clients für Web-Services schreiben


Wenn für die Webdienstanwendung, die Sie aufrufen, vorausgesetzt ist, dass der Client bestimmte Header in seine Anforderungen einschließt, oder wenn die Antwortbotschaften des Dienstes spezielle Header enthalten, benötigt Ihre Client-Anwendung die Definitionen der Header-Klassen, die jenen Headern entsprechen. Beim Importieren eines WSDL-Dokuments, das den Webdienst beschreibt, erzeugt das Importprogramm automatisch Code, der diese Header-Klassen definiert und sie in der Remotable-Typ-Registrierung einträgt. Wenn der Server in Delphi geschrieben wurde, können Sie anstelle der Dateien, die durch das Importieren einer WSDL-Datei generiert werden, die gleichen Units verwenden, die auch von der Serveranwendung zum Definieren und Registrieren dieser Header-Klassen herangezogen werden. Stellen Sie dabei sicher, dass die Unit beim Registrieren aufrufbarer Interfaces denselben Namespace-URI und denselben SOAP-Aktions-Header verwendet. Diese Werte können explizit im Quelltext zur Registrierung des Interface angegeben oder aber automatisch generiert werden. Wenn sie automatisch generiert werden, muss die Unit, in der das Interface definiert ist, sowohl im Client als auch im Server denselben Namen tragen, und in beiden muss die globale Variable AppSpacePrefix den gleichen Wert aufweisen.

Hinweis: Weitere Informationen über Header-Klassen finden Sie unter SOAP-Header definieren und verwenden.

Ähnlich wie die Serveranwendung bedienen sich auch Client-Anwendungen des Soap.InvokeRegistry.ISOAPHeaders-Interface, um auf eingehende Header zuzugreifen und ausgehenden Botschaften Header hinzuzufügen. Das externe Interface-Objekt, mit dessen Hilfe Sie Methoden des aufrufbaren Interface aufrufen, implementiert das ISOAPHeaders-Interface. Allerdings ist es nicht möglich, ein ISOAPHeaders-Interface direkt von dem externen Interface-Objekt abzurufen. Denn wenn Sie versuchen, ein Interface direkt von dem externen Interface-Objekt anzufordern, generiert dieses eine im Speicher gehaltene VTable, da davon ausgegangen wird, dass es sich bei dem Interface um ein aufrufbares Interface handelt. Folglich müssen Sie das ISOAPHeaders-Interface von dem aufrufbaren Interface anstatt von dem externen Interface-Objekt anfordern:

  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;

Beispiel für die Verwendung der Authentifizierung

Dieses Beispiel ist für den Dienst zum Nachschlagen von Postleitzahlen unter https://www.geosvc.com/(EN) vorgesehen. Weitere Informationen finden Sie unter http://api.geosvc.com/ZipCodeLookup.asmx(EN).

 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;

Erläuterungen und den ausführlichen Quellcode finden Sie unter: Bob Swart's video on EDN: http://edn.embarcadero.com/article/41013(EN) - "Delphi SOAP Web Services and Security"

Siehe auch