Webové služby na platforme Microsoft .Net

Webová služba je softvérová aplikácia, identifikovaná pomocou URI (Uniform Resource Identifier), ktorej rozhrania a väz...


Webová služba je softvérová aplikácia, identifikovaná pomocou URI (Uniform
Resource Identifier), ktorej rozhrania a väzby je možné definovať, opísať a
vyhíadávať ako artefakty XML. Webová služba podporuje priamu interakciu s inými
softvérovými aplikáciami prostredníctvom správ v jazyku XML a prenášanými
protokolmi internetu. SkÖr než presná definícia je užitočnejšie vedieť, na čo
sa dajú webové služby použiť a ako sa dajú vytvárať.
Aj napriek pomerne zložitej definícii ide o veími jednoduchú problematiku.
Zjednodušený filozofický a aplikačný princíp je asi takýto. Naša spoločnosť má
prívlastok informačná a preto íudia aj firmy sa delia do dvoch kategórií. Na
tých, čo informácie majú a sú ochotní (väčšinou za nejakú protihodnotu alebo z
propagačných a marketingových dÖvodov) ich poskytnúť, a tých, ktorí o tieto
informácie majú záujem.
Vysvetlíme to na jednoduchom príklade. V každej krajine vychádza niekoíko
internetových denníkov, a nachádza sa tu aj mnoho informačných a vyhíadávacích
portálov, na ktoré denne pristupujú klienti. Všetci prevádzkovatelia takýchto
denníkov a portálov spravidla zverejňujú denne správy o počasí, bankových
kurzoch, televíznych programoch a podobne. Získavajú ich rÖznym spÖsobom a
následne vkladajú na svoje stránky. Tieto informácie však majú jednotné zdroje,
buď sa jedná o hydrometeorologický ústav, alebo v druhom prípade o národnú a
komerčné banky, programové centrá televíznych staníc a podobne. Ak by takáto
firma poskytla údaje o predpovedi počasia (len údaje, nie konkrétny vzhíad
stránky), prevádzkovatelia internetových denníkov a portálov by takúto službu,
poskytnutú samozrejme za rozumných podmienok, určite radi využívali. Ide len o
to, ako na to ísť z híadiska softvérových technológií.
Momentálny stav by sa dal charakterizovať ako izolované ostrovčeky informácií.
Poskytovatelia poskytujú svoje informácie v rÖznych, najčastejšie textových
formátoch a správcovia portálov to povkladajú na svoje stránky, každý v tom
svojom konkrétnom formáte a zaužívanej grafickej úprave. Kvalitatívne novým
riešením je použitie webovej služby, kedy poskytovateí poskytne svoje služby,
prípadne údaje.
Ako vyplýva z názvu, webové služby s výnimkou vývoja nikdy neprevádzkujeme na
lokálnom počítači. Vždy fungujú v prostredí globálnej siete internet, alebo
lokálneho intranetu.

Publikácia služby
Ak chceme prevádzkovať webovú službu, je potrebné, aby sa ostatní používatelia
webu o tejto našej aktivite dozvedeli. Preto sa webové služby publikujú. Je to
podobný princíp, ako keď chceme vyhíadať nejakú informáciu. Vtedy použijeme
nejaký vyhíadávač, napríklad Google, AltaVista a podobne.
Pre publikovanie a vyhíadávanie webových služieb slúžia dve špecifikácie. Prvá
z nich sa označuje ako UDDI (Universal Description Discovery and Integration) a
druhá sa označuje ako DISCO (SOAP Discovery). Skratka SOAP znamená Simple
Object Access Protocol. Webové služby fungujú pomocou bežných prenosových
protokolov HTTP a SMTP a údaje sa posielajú vo formáte XML. Technológia XML je
totiž otvorená a platformovo nezávislá. XML súbor obsahuje v sebe okrem
samotných údajov aj ich štruktúru.
Zjednodušene by sa dalo povedať, že tento formát pre výmenu údajov je rovnako
dobre čitateíný pre počítače aj pre íudí. Údaje mÖžeme íahko načítať a
identifikovať pomocou pomerne jednoduchej rutiny v íubovoínom programovacom
jazyku, alebo po definovaní formátu zobrazenia priamo publikovať na webovej
stránke. XML dokument sa skladá z elementov. Každý element obsahuje počiatočnú
a koncovú značku (tag). Obidva tagy obsahujú názov elementu, koncový tag
obsahuje navyše pred názvom elementu lomítko. Typický príklad XML elementu mÖže
byť napríklad:
36
Každý element mÖže v sebe obsahovať ďalšie takzvané vnorené elementy. Napríklad:

severozapadny
36


Vytvorenie webovej služby
Toíko stačilo ako teoretický úvod a poďme vytvoriť prvú webovú službu. Webové
služby mÖžeme vytvoriť na rÖznych platformách, my si ukážeme príklady na zrejme
najdostupnejšej platforme Microsoft .Net Framework. Túto technologickú
nadstavbu mÖžeme zdarma stiahnuť z webu a nainštalovať do operačných systémov
rady Windows 2000/XP.
Nová serverová rada Microsoft .Net Server 2003 už má .Net Framework zapúzdrené
v základnej konfigurácii, stačí ju aktivovať pri aktivovaní serverových
služieb. Pre vývoj webovej služby mÖžeme použiť Visual Studio .Net, voíne
šíriteíné vývojové prostredie WebMatrix, alebo aj textový editor.
Pre ilustráciu základných princípov vytvárania a ladenia webových služieb
ukážeme príklad asi najjednoduchšej webovej služby, aká sa vÖbec dá na
platforme .Net Framework vytvoriť. Hoci bude napísaná v programovacom jazyku
C#, nepotrebujeme k tomu dokonca ani žiadne vývojové prostredie (Visual
Studio.Net, Web Matrix). Vystačíme s textovým editorom. Našu webovú službu bude
tvoriť jediný súbor, napríklad s názvom pokus _ws.asmx, ktorý bude umiestnený v
pracovnom adresári webového servera, napríklad C:Inetpub wwwroot v
podadresári WS. Lokálna adresa webovej služby potom bude napríklad
http://localhost/ws/ priklad_ws.asmx. Zdrojový kód webovej služby je:

using System; using System.Web.Services; using System.Xml.Serialization; public class Pokus {
[WebMethod]
public int Add(int a, int b) {
return a + b; }
}
Webovú službu mÖžeme jednoducho vyskúšať a odladiť pomocou prehliadača HTML
stránok. Úvodnú stránku pre testovanie našej webovej služby vidíte na obrázku
na predcházajúcej stránke. Všimnite si upozornenie na stránke, aby sme fiktívnu
adresu namespace http://tempuri.org/ zmenili na nejakú inú, kam by sa k našej
službe dostali aj ostatní záujemcovia, napríklad http://ud di.org. Na stránke
je aj návod, ako to v obidvoch používaných programovacích jazykoch (C# a Visual
Basic) realizovať.
C#
[WebService(Namespace="http:
//uddi.org")]
public class MyWebService
{
// implementation
}
Visual Basic.Net
//uddi.org")> Public Class MyWebService
' implementation
End Class
Po aktivovaní odkazu s názvom príslušnej metódy webovej služby, v našom prípade
odkazu metódy ADD sa zobrazí formulár pre zadávanie parametrov.
Po zadaní parametrov, v našom prípade sčítancov 5 a 3 a zatlačení tlačidla
Invoke sa zobrazia údaje poskytnuté webovou službou, v tomto prípade číslo 8,
ktoré je výsledkom súčtu obidvoch zadaných parametrov.
8

Služba s databázou
Pre tento príklad by sa dalo vytvoriť veía kombinácií operačného systému
(Windows, Linux, Unix, Sun, Solaris...), technologickej platformy (IBM Web
Sphere, Microsoft .Net Framework, Borland...) a databázovej platformy (MS SQL
Server 2000, Oracle 9i, IBM DB2...). Pre jednoduchosť použijeme kombináciu
operačného systému Windows s podporou technológie Visual Studio .Net 2003 a SQL
Server 2000. Všetky komponenty sú od jednej firmy, Microsoftu, teda s
konfiguráciou a interoperabilitou by nemali byť žiadne problémy.
Webová služba bude pracovať nad tabuíkou Employees z cvičnej databázy
Northwind. Úloha webovej služby bude triviálna po zadaní ID zamestnanca (stípec
EmployeeID z tabuíky) nám vo formáte XML vráti údaje o príslušnom zamestnancovi.

Nový projekt
Vytvorenie nového projektu webovej služby pomocou vývojového prostredia Visual
Studio .Net 2003 urobíme takto: Pomocou menu File | New | Project vytvoríme
nový projekt typu ASP.Net Web Service. Projekt vytvoríme v zložke Visual C#
Projects. Napokon v úvodnom dialógu pomenujeme projekt ako wsLudia.
Webová služba bude prístupná cez adresu http://localhost/ws Ludia a štandardne
bude v adresári c:inetpubwwwrootws.ludia.
Na úvodnej obrazovke Visual Studia klikneme na link click here to switch to
code view. V tomto prípade sprievodca vytvorením novej aplikácie bral do úvahy,
že mÖžeme byť začiatočníci, čo sa týka vývoja webových služieb, a ako takí
možno budeme chcieť ako prvú vyskúšať a odladiť jednoduchú webovú službu typu
Hello World, a preto nám rovno ukázal, ako sa taká služba programuje. Takže
prípadne stačí odstrániť komentáre na začiatku riadkov a prvú webovú službu
HelloWorld() máme hotovú:
// WEB SERVICE EXAMPLE
// The HelloWorld() example service returns the string Hello World
// To build, uncomment the following lines then save and build the project
// To test this web service, press F5
//[WebMethod]
//public string HelloWorld()
//{
//return "Hello World"; //}
Našou úlohou je vytvoriť metódu webovej služby, ktorá nám na základe zadaného
parametra ID vráti údaje o príslušnom zamestnancovi. NajskÖr však musíme
vytvoriť prepojenie na SQL Server. Ďavé okno vývojového prostredia prepneme do
režimu Server Explorer a vytvoríme nové pripojenie v zložke Data Connections.
(Pravé tlačidlo, voíba Add Connection.) Vytvorenie pripojenia spočíva vo
vyplnení dialógu Data Link Properties, kde vyberieme databázový server,
databázu a kde zároveň pomocou tlačidla Test Connection mÖžeme aktuálne
vytvárané pripojenie aj otestovať. Po vytvorení pripojenia presunieme jeho
ikonu na plochu aplikácie.
Teraz už mÖžeme pristúpiť k naprogramovaniu aplikačnej logiky. V zložke
Service1asmx.cs si všimnime kód, ktorý bol pridaný počas presunu komponenty
sqlConnection: private System.Data.SqlClient.SqlConnection sqlConnection1; NajskÖr pridáme na začiatok súboru kód pre pridanie namespace
System.Data.SqlClient:
using System.Data.SqlClient; a na koniec súboru metódu DajZamestnanca:
[WebMethod]
public DataSet DajZamestnanca(int id)
{
string strSQL = "SELECT LastName, FirstName, Title, Address, City, Country,
Notes FROM Employees where EmployeeID=" + id.ToString(); SqlDataAdapter da = new SqlDataAdapter(strSQL, sqlConnection1); DataSet ds = new DataSet(); da.Fill(ds, "Employees"); sqlConnection1.Close(); return ds; }
Metóda ako taká je v úplnom poriadku, bez problémov funguje, ale má to celé
jeden háčik, a to je bezpečnosť. V prípade, ak je parametrom číslo, to príliš
nevadí, no ak by bol parametrom reťazec, mohla by vzniknúť pomerne nebezpečná
bezpečnostná diera, nakoíko pri troche šikovnosti by bolo možné vytvoriť
vnorený dotaz obsahujúci napríklad sekvenciu "...Delete FROM Employees...".
Preto je lepšie vytvoriť SQL príkaz cez parametre:
[WebMethod]
public DataSet DajZamestnanca(int id)
{
SqlCommand cmd = new SqlCommand("SELECT LastName, FirstName, Title, Address,
City, Country, Notes FROM Employees where EmployeeID = @EMPID", sqlConnection1); cmd.Parameters.Add("@EMPID", id); SqlDataAdapter da = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); da.Fill(ds, "Employees"); sqlConnection1.Close(); return ds; }
Pomocou menu Debug | start mÖžeme novú metódu webovej služby zostaviť a
vyskúšať.
Po zatlačení tlačidla Invoke to mÖže dopadnúť dvoma spÖsobmi. Chybovým
hlásením, alebo poskytnutím výsledkov vo formáte XML. Chybové hlásenie
System.Data.SqlClient .SqlException: Login failed for user 'pcASPNET'.
nám v tomto prípade oznamuje, že SQL Server nemá vytvoreného používateía ,PC
ASPNET a teda nemá ani definované jeho prístupové privilégia do žiadnych
tabuliek, a tak z pochopiteíných dÖvodov žiadne údaje neposkytne. Musíme preto
požiadať administrátora databázy o vytvorenie príslušného používateía, v našom
prípade, ,PCASPNET, a definovať jeho prístupové privilégia do databázy
Northwind, konkrétne do tabuíky Employees. Na testovacom alebo vývojárskom
počítači si tieto parametre nastavíme sami.
Ak je všetko v poriadku, zobrazia sa v okne webového prehliadača údaje
poskytnuté webovou službou, v tomto prípade údaje o príslušnom zamestnancovi vo
formáte XML:
...
-
-
Davolio Nancy Sales <br> Representative

507 20th Ave. E. Apt. 2A

SeattleUSAEducation includes a BA in
psychology from Colorado State University in 1970. She also completed "The Art
of the Cold Call." Nancy is a member of Toastmasters International.





Sú to síce viac údaje pre počítač a ten k nim bude prostredníctvom volania
metód webovej služby aj pristupovať, ale pri trochu skúseností sa tieto údaje
prečítať aj priamo človekom. Podobne mÖžeme pridať aj ďalšiu metódu webovej
služby, napríklad pre vrátenie názvu regiónu, na základe zadaného ID:
[WebMethod]
public DataSet DajRegion(int id)
{
SqlCommand cmdx = new SqlCommand("SELECT * FROM Region where RegionID =
@REGID", sqlConnection1); cmdx.Parameters.Add("@ REGID", id); SqlDataAdapter da = new SqlDataAdapter(cmdx); DataSet ds = new DataSet(); da.Fill(ds, "Regions"); sqlConnection1.Close(); return ds; }
Príklad vrátených údajov pre parameter 1 bude:


1 Eastern


alebo všetkých zákazníkov, ktorí bývajú v zadanom meste:
[WebMethod]
public DataSet DajZakaznikovZmesta(string sCity)
{
SqlCommand cmd = new SqlCommand("SELECT ContactName, Address FROM Customers
WHERE City= @PCITY", sqlConnection1); cmd.Parameters.Add("@ PCITY", sCity); SqlDataAdapter da = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); da.Fill(ds, "Employees"); sqlConnection1.Close(); return ds; }
kde príklad vrátených údajov pre parameter London bude:


Thomas Hardy
120 Hanover Sq.


...

Vo všetkých metódach sme z bezpečnostných dÖvodov používali pre konštrukciu
objekt SqlCommand.

Bezpečnostné riziko
V snahe po univerzálnosti nie je problém napísať takú metódu webovej služby,
ktorá vráti XML dataset z akejkoívek tabuíky alebo kombinácie tabuliek databázy
Northwind na základe SQL dotazu:
[WebMethod]
public DataSet DotazNW(string strSQL)
{
SqlDataAdapter da = new SqlDataAdapter(strSQL, sqlConnection1); DataSet ds = new DataSet(); da.Fill(ds, "Northwind"); sqlConnection1.Close(); return ds; }
Zdanlivo krásne a všeobecne použiteíné. Áno, všeobecne použiteíné dokonca aj na
vymazanie údajov. Ukážme si to na jednoduchom príklade. Aby sme nepoškodili
tabuíky cvičnej databázy Northwind, vytvorme si v tejto cvičnej databáze
jednoduchú tabuíku pomocou konzolovej aplikácie Query Analyser a naplňme ju
niekoíkými údajmi:
CREATE TABLE tovar
(
nazovVARCHAR(25), cenaDECIMAL(9,2)
); INSERT INTO tovar VALUES('Banany','39.90'); INSERT INTO tovar VALUES('Mrkva','13.30'); O jej obsahu sa mÖžeme presvedčiť SQL príkazom SELECT v konzolovej aplikácii:
select * from tovar; nazovcena
Banany39.90
Mrkva13.30
(2 row(s) affected)
K rovnakému výsledku dospejeme aj prostredníctvom "univerzálnej" metódy webovej
služby DotazNW:
-
-
Banany39.90

-
Mrkva13.30


Ak prostredníctvom testovacieho okna webovej služby zadáme SQL príkaz:
delete from tovar; následným dotazom v konzolovej aplikácii Query Analyzer zistíme, že databázová
tabuíka je prázdna:
select * from tovar; nazovcena
(0 row(s) affected)
Takže trocha ironicky mÖžeme konštatovať, že programové konštrukcie tohoto typu
mÖžeme tvoriť len vtedy, ak nás už údaje v databázach omrzeli.
Pokračovanie nájdete v budúcom čísle Computerworldu.









Komentáře
K tomuto článku není připojena žádná diskuze, nebo byla zakázána.