Traitement des en-têtes dans les applications client

De RAD Studio
Aller à : navigation, rechercher

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"

Voir aussi