SOAP i delphi

Tags:    delphi
Skrevet af Bruger #270 @ 01.12.2001
Udvikling af en simpel SOAP klient

Hvis du har fulgt med i de seneste nyheder, har du formentlig hørt om SOAP, Simple Object Access Protocol. Denne protokol tillader dig at kalde metoder på et remote objekt (et der ikke ligger på din computer) ved hjælp af HTTP og andre lignende protokoller. Hvis du bruger Delphi 6 Enterprise, har du indbygger support for SOAP.
For at lave en SOAP klient applikation ved hjælp af Delphi, skal du først vide hvilken SOAP service du vil kalde. Et godt sted at starte er XMethods.org webside. De lister mange interessante SOAP services, nogle af den er lavet i Delphi. For eksempel, en af servicescene er Numbers to Words service lavet af Tom Chamberlain. Denne service er lavet i Delphi, og tager ganske simpelt en floating-point tal (dollar værdi) og konveterer det til ord. Præcis som på en check. (Amerikansk). For eksempel, 123 bliver til "one hundred twenty three dollars and 00 cents". For at kunne kalde denne service fra din Delphi klient skal du først kende dens adresse på den WSDL (Web Services Description Language) fil du ønsker at kalde. I dette tilfælde er adressen :
http://powerofzen.com/cgi-bin/wordsforchecks.exe/wsdl/IWordsForCheck
Med denne information i hånden så start en ny Delphi applikation, og åben "New Items" dialog boxen. Gøres ved at vælge File-->New-->Other i hoved menuen. Klik på "WebServices" fanen, og du skulle se 3 ikoner. Vælg "Web Services Importer" ikonet og tryk OK.



Nu er "Web Services Import" dialog boksen åben.



Klip URL'en fra før, og klik Generate. Delphi vil nu generer en ny unit , som indeholder et interface og en definition. Gem denne fil med fx. navnet WordsIntf.pas. Koden skulle nu se således ud:
 Unit WordsIntf;
 
 interface
 
 uses 
   Types, XSBuiltIns;

 type
  IWordsForCheck = interface(IInvokable)
    ['{E9300524-6C2F-4863-86DA-5A43DF5E5359}']
    function GetWordsForCheck(const Value: Double): WideString;  stdcall;
  end;


implementation

uses InvokeRegistry;

initialization
  InvRegistry.RegisterInterface(TypeInfo(IWordsForCheck), 'urn:UIWordsForChecks-IWordsForCheck', '');
end.

THTTPRIO Komponentet

Efter at have genereret et interface til den SOAP service du ønsker at kalde, gå tilbage til din hoved form i din Delphi applikation. Kom et TLabeledEdit komponent, en knap og et THTTPRIO komponent (Fra WerServices fanen) på din form. Din main form skulle nu se således ud :



Klik på HTTPRIO1 komponenten og åben din Object Inspector ved at trykke F11. Der er 3 properties du skal sætte. det nemmeste er at starte fra bunden og gå op ad. Først, set WSDLLocation til URL'en til WSDL filen. Dette skal være nøjagtigt den samme URL som du brugte i "Web Service Import" dialog boksen. Når URL'en er skrevet ind, skal Service propertypen sættes til 'IWordsForCheckservice'. Bemærk når du trykker på den lille combobox for at vælge service "fryser" Delphi for en kort stund. Det er fordi Delphi rent faktisk kommunikerer med SOAP serveren. Efter at have sat denne property , gør det samme for Port, den skal sættes til 'IWordsForCheckPort'. Dit SOAP objekt skulle nu se således ud:
 object HTTPRIO1: THTTPRIO
  WSDLLocation = 
    'http://powerofzen.com/cgi-bin/wordsforchecks.exe/wsdl/' +    
    'IWordsForCheck'
  Service = 'IWordsForCheckservice'
  Port = 'IWordsForCheckPort'
  HTTPWebNode.Agent = 'Borland SOAP 1.1'
  HTTPWebNode.UseUTF8InHeader = False
  Converter.Options = [soSendMultiRefObj, soTryAllSchema]
  Left = 128
  Top = 8
end
Den Object Inspector skulle på nuværende tidspunkt indeholde de følgende værdier:



Næste skridt er at skrive den smule kode, som du selv skal skrive for at få det her i luften. Tryk to gange på knappen, for at lave et OnClick event på din knap. Skriv så de her kode:
procedure TSOAPMainForm.GetAsWordsClick(Sender: TObject);
Var
  I : IWordsForCheck;
begin
  Screen.Cursor := crHourGlass;
  Try
    I := HTTPRIO1 as IWordsForCheck;
    ShowMessage(I.GetWordsForCheck(StrToFloat(Number.Text)));
  Finally
    Screen.Cursor := crDefault;
  End;
end;
Før du kompilerer projektet, skal du sikrere dig at interface unit'en (WordsIntf.pas) er inkluderet i din uses klausul i din main form. I koden oven over bruges en instans af THTTPRIO komponenten til at lave et interface til en SOAP service. Med dette interface "i hånden", er det meget nemt at kalde GetWordsForCheck() metoden som er implementeret på SOAP serveren. Som du kan se er det meget nemt at kalde SOAP services fra Delphi. Naturligvis er proceduren ens for alle andre SOAP services, du skal bare udskifte URL'en på din WSDL fil! Hvis du kører applikationen vil du få et resultat alla det her :



For yderlig detaljer om SOAP og om at lave SOAP klienter, kig i kapitel 31 i Delphi Developer's Guide.

Download eksempel kode

Download SOAPclient.zip (349 kB) Som indeholder alt koden fra denne artikkel. BEMÆRK venligst at kode kræver Delphi 6 Enterprise og en internet forbindelse. Note: Siden servicen "Numbers to Words" ikke er hosted af undertegnet, men hos tredje part, kan jeg, eller dem der til en hver tid hoster denne artikel, garantere performance eller eksistensen af denne, efter publicering af denne artikel.


Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (1)

User
Bruger #14555 @ 05.01.09 11:39
Fin introduktion.
Synd at skærmbilleder ikke længere er tilgængelige, men teksten forklarer alligevel det hele.
Du skal være logget ind for at skrive en kommentar.
t