Delphi - Web szerviz alkalmazások Delphi 6-ban

WebServices 2. rész

forráskód letöltése
Az előző részben elkezdtük a Web szerviz alkalmazások készítését bemutató cikksorozatot. Akkor egy már meglévő Web szervizhez készítettünk egy kliensalkalmazást. Ebben a részben már egy kicsit továbbmegyünk, és mi magunk készítjük el magát a Web szerviz kiszolgáló alkalmazást. A példában egy olyan Web szerviz alkalmazást készítünk, amely különböző valuták között képes átváltani egy megadott összeget.
A példaprogramok kipróbálásához az alábbi lépéseket kell megtennie:
1. indítsa el a CurrencyExchangeServer programot, majd lépjen ki belőle
2. indítsa el a Web App Debugger-t (Delphi 6 Tools menü, vagy parancssorból: webappdbg.exe)
3. a Web App Debugger-ben kattintson a Start gombra
4. indítsa el a CurrencyExchangeClient programot. Ha az átváltás során hibaüzenetet kap, akkor a HTTPRIO komponensben a WSDLLocation útvonal valószínűleg hibás, a cikkben leírt módon módosítsa azt.
Web szerviz alkalmazás készítése
Zárjuk be a nyitott project-et, majd válasszuk a File menü New/Other menüpontját. A WebServices lapon válasszuk ki a SOAP Server Application varázsló ikonját, majd kattintsunk az OK gombon. A megjelenő ablakban válasszuk a Web App Debugger kapcsolót, és adjuk meg az alkalmazás nevét, majd kattintsunk megint az OK gombon:
A varázsló létrehoz egy Web Module-t, rajta három komponenssel, majd megkérdezi, hogy akarunk-e interfészt létrehozni a SOAP modulhoz. Válaszoljunk igennel (Yes).

A megjelenő ablakban meg kell adnunk a szerviz és a unit nevét. Gondoskodjunk róla, hogy Code Generation mezőben a Generate sample methods kapcsoló ki legyen kapcsolva. Ha ezzel is megvagyunk, akkor kattintsunk az OK gombra.
Létrejön az új project, mentsük is el rögtön. A fájlokat lehetőleg ne nevezzük át. A szokásos unit-okon kívül létrejön két unit. Az egyik a CurrencyExchangeIntf, ami az interfész osztály deklarációját tartalmazza. Ebben kell megadnunk az interfész által publikált függvények deklarációját, amelyeket a kliensalkalmazások hívhatnak majd meg. A függvényeket stdcall-ként kell definiálni.
function CurrencyToHUF(CurrencyFrom: string; Value: extended): extended; stdcall;
function HUFToCurrency(CurrencyTo: string; Value: extended): extended; stdcall;
function CurrencyExchange(CurrencyFrom, CurrencyTo: string; Value: extended): extended; stdcall;
A CurrencyToHUF függvény a paraméterként megadott valutában megadott összeget számítja át forintba. A HUFToCurrency ennek pont az ellenkezőjét teszi, a forintban megadott összeget számolja át a megadott valutába. A CurrencyExchange függvény bármelyik valutából bármelyikbe képes átszámítani a megadott összeget.
A CurrencyFrom paraméterben annak a valutának a nevét kell megadni, amiből átszámítunk, a CurrencnyTo paraméterben pedig annak a nevét, amire átszámítunk. A Value az átszámítandó összeg. A valuták neveit a három betűs rövidítéssel kell megadni (pl. USA dollár = USD, magyar forint = HUF, EURO = EUR, osztrák schilling = ATS, stb.). Az aktuális árfolyamokat egy ini fájlban tároljuk, így a Web szerviz karbantartásához csak ennek a fájlnak a módosítása szükséges.
A másik unit a CurrencyExchangeImpl, ami az ICurrencyExhange interfész implementációját tartalmazza. Ebben van deklarálva a TCurrencyExchange osztály. Ennek segítségével ugyanúgy készíthetjük el az osztályt, mintha egy egyszerű Delphi osztályról lenne szó, az egyetlen megkötés, hogy az ICurrencyExchange interfészben deklarált függvényeknek szerepelniük kell benne.
Az osztály deklarációja tehát a következőképpen fog kinézni:
  TCurrencyExchange = class(TInvokableClass, ICurrencyExchange)
  private
    function GetExchange(CurrName: string): currency;
  public
    function CurrencyToHUF(CurrencyFrom: string; Value: extended): extended; stdcall;
    function HUFToCurrency(CurrencyTo: string; Value: extended): extended; stdcall;
    function CurrencyExchange(CurrencyFrom, CurrencyTo: string; Value: extended): extended; stdcall;
  end;
A GetExchange függvény az ini fájlból beolvassa a paraméterként megadott valuta aktuális forint árfolyamát.
Ha elkészültünk az osztállyal, akkor fordítsuk le a projectet, és egyből futtassuk is (F9). Megjelenik egy üres Form, amit akár rögtön be is zárhatunk. A futtatás arra volt jó, hogy a Web szervizünket regisztráltuk, így a WebAppDebugger-ben is látni fogjuk. Indítsuk is el a Web App Debuggert (Tools menü). A megjelenő ablakban kattintsunk a Start gombra, majd a Default URL linkre. A megjelenő böngészőben kapunk egy listát a regisztrált szerverekről, és ha mindent jól csináltunk, akkor a listában szerepel a mi Web szervizünk is:
Jelöljük ki, és kattintsunk a Go gombra. Ekkor a Web szerviz információs lapját kapjuk meg, amin keresztül elérhetjük a Web szerviz WSDL leírását is. Erre szükség is lesz, mert most elkészítjük ehhez a Web szervizhez a kliensalkalmazást.
Web szerviz kliensalkalmazás elkészítése
Erre több módszer is létezik. Alkalmazhatnánk a cikksorozat első részében bemutatott módszert is, aminek nagy előnye, hogy nem kell külön komponenseket alkalmaznunk ahhoz, hogy a Web szerviz függvényeit meghívhassuk. Most azonban egy másik módszert mutatunk be, amely egyben a THTTPRIO komponens használatát is bemutatja.
Először is hozzunk létre egy új project-et. A WebServices palettáról helyezzünk egy HTTPRIO komponenst a Form-ra. A WSDLLocation property-ben adjuk meg a WSDL leírás útvonalát. Ezt megtudhatjuk a Web szerviz információs lapról (lásd fent a Web App Debugger-nél). Valószínűleg valami ehhez hasonló lesz:
http://localhost:1024/CurrencyExchangeServer.CurrencyExhange/wsdl/ICurrencyExchange
Ha a megadott WSDL útvonal jó, akkor a Server property-ben meg tudjuk adni a szerver nevét, tegyük ezt meg. Ezután már a Port property-t is be tudjuk állítani, ezt is tegyük meg.
Még egy dolgot feltétlenül meg kell tennünk, mégpedig a CurrencyExchangeIntf.pas unit-ra kell hivatkoznunk, legjobb, ha hozzá is adjuk a project-hez.
Innentől kezdve a HTTPRIO komponens felhasználásával egyszerűen meghívhatjuk a Web szerviz függvényeit. Ehhez persze az kell, hogy a Web szerviz fusson (Web App Debugger).
  with HTTPRIO1 as ICurrencyExchange do begin
    ShowMessage(CurrToStr(HUFToCurrency('EUR', 145000)));
  end;

WebServices cikksorozat

Web szerviz alkalmazások Delphi 6-ban - WebServices 1. rész

Web szerviz alkalmazások Delphi 6-ban - WebServices 2. rész