Traitement des en-têtes dans les applications client
Remonter à Conception de clients pour les services Web
Si l'application de service Web que vous appelez s'attend à ce que votre client inclue des en-têtes dans ses requêtes ou si ses messages de réponse comprennent des en-têtes spéciaux, votre application client requiert les définitions des classes d'en-têtes correspondant à ces en-têtes. Lorsque vous importez un document WSDL qui décrit l'application de service Web, l'importateur génère automatiquement du code pour déclarer ces classes d'en-têtes et les recenser avec le registre des types distants. Si le serveur est écrit en Delphi, vous pouvez recourir aux mêmes unités que celles utilisées par l'application serveur pour définir et recenser ces classes d'en-têtes à la place des fichiers générés par l'importation d'un fichier WSDL. Assurez-vous que l'unité utilise les mêmes URI d'espace de nommage et en-tête SOAPAction lorsqu'elle recense des interfaces invocables. Ces valeurs peuvent être spécifiées explicitement dans le code qui recense les interfaces ou être générées automatiquement. Si elles sont générées automatiquement, l'unité qui définit les interfaces doit porter le même nom dans le client et le serveur ; ces derniers doivent tous deux définir la variable globale AppSpacePrefix sur la même valeur.
Remarque : Pour plus d'informations sur les classes d'en-têtes, voir Définition et utilisation d'en-têtes SOAP.
Comme dans le cas d'un serveur, les applications client utilisent l'interface Soap.InvokeRegistry.ISOAPHeaders pour accéder aux en-têtes entrants et ajouter les en-têtes sortants. L'objet interfacé distant que vous utilisez pour appeler les interfaces invocables implémente l'interface ISOAPHeaders. Toutefois, vous ne pouvez pas obtenir une interface ISOAPHeaders directement à partir de l'objet interfacé distant. En effet, lorsque vous essayez d'obtenir une interface directement à partir d'un objet interfacé distant, une vtable en mémoire est générée en considérant que l'interface est une interface invocable. Par conséquent, vous devez obtenir l'interface ISOAPHeaders à partir de l'interface invocable plutôt que de l'objet interfacé distant :
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;
Exemple utilisant l'authentification
Cet exemple concerne le service de recherche des codes postaux à l'adresse https://www.geosvc.com/. Pour de plus amples informations, voir 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;
Pour obtenir des explications et un code source plus détaillé, voir : la vidéo de Bob Swart sur EDN : http://edn.embarcadero.com/article/41013 - "Delphi SOAP Web Services and Security"