Header in Client-Anwendungen verarbeiten
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"