Documente Academic
Documente Profesional
Documente Cultură
Servicii Web
Inteligen]\ artificial\ [i web semantic
POLIROM
2006
Cuprins
Prefa ................................................................................................................................................ 9
Capitolul 1. Prezentare general a serviciilor Web ...............................................13
1. Preambul .......................................................................................................................... 13
1.1. Protocolul HTTP pe scurt ................................................................................ 13
2. Arhitectura orientat spre servicii Web ................................................................... 19
2.1. Introducere ............................................................................................................ 19
2.2. Programarea aplicaiilor Web ........................................................................... 20
2.3. Servicii Web. Punerea problemei .................................................................... 21
2.4. Conceptul de serviciu Web bazat pe XML .................................................. 26
2.5. Modalitile de implementare i exploatare .................................................. 34
Referine ................................................................................................................................... 36
Capitolul 2. Familia XML........................................................................................................ 39
1. Preliminarii ....................................................................................................................... 39
2. XML (Extensible Markup Language) ............................................................................. 40
2.1. Caracterizare i trsturi eseniale ................................................................... 40
2.2. Pri componente ale unui document XML ................................................ 41
2.3. Membrii constitueni ai familiei XML ........................................................... 43
2.4. Spaiile de nume XML ....................................................................................... 44
2.5. XML Infoset ......................................................................................................... 45
2.6. Validarea documentelor XML .......................................................................... 47
2.7. Procesarea documentelor XML ....................................................................... 54
Referine ................................................................................................................................... 59
Capitolul 3. Descrierea serviciilor Web .............................................................................. 61
1. Punerea problemei ......................................................................................................... 61
2. WSDL (Web Service Description Language) ................................................................... 62
2.1. Modelul conceptual al WSDL .......................................................................... 64
2.2. Diferenele dintre specificaiile WSDL 1.1 i WSDL 2.0 ......................... 72
2.3 Exemple de documente WSDL ....................................................................... 72
2.4. Tipuri de operaii i mesaje .............................................................................. 76
2.5 Platforme i instrumente de lucru cu documentele WSDL .................... 78
Referine ................................................................................................................................... 84
1.3. Un client PHP pentru serviciul Web privitor la portocale .................... 188
1.4. Un serviciu de manipulare a fiierelor implementat
n Perl cu SOAP::Lite ....................................................................................... 189
1.5 Scrierea n Perl a clientului SOAP ............................................................... 192
1.6. Invocarea serviciului de ctre un client PHP ............................................ 196
2. Inter-operabilitatea ntre diverse tehnologii,
instrumente i limbaje de programare a serviciilor Web ................................... 199
2.1. Dezvoltarea de servicii Web n .NET Framework ..................................... 199
2.2. Un client C# pentru serviciul creat ............................................................. 210
2.3. Accesarea dintr-un script Perl a serviciului Web
implementat n .NET ....................................................................................... 212
2.4. Invocarea din PHP a serviciului Web .......................................................... 213
2.5. Invocarea de servicii Web externe ................................................................ 216
2.6. Folosirea instrumentului gSOAP pentru C/C++ ..................................... 224
2.7. Implementarea serviciilor Web n Java ........................................................ 228
2.8. Suportul oferit de mediul Delphi pentru crearea
i utilizarea serviciilor Web ............................................................................. 237
3. Invocarea serviciilor Web n contextul AJAX ..................................................... 245
3.1. Punerea problemei ............................................................................................ 245
3.2. Caracteristici importante ale suitei de tehnologii AJAX ......................... 245
3.3. Invocarea asincron a unui serviciu Web via AJAX ............................... 249
3.4. Utilizarea bibliotecii Prototype .......................................................................... 255
3.5. Invocarea direct, din JavaScript, a unui serviciu Web ........................... 259
3.6. Transferuri asincrone prin Atlas ASP.NET ................................................ 263
Referine ................................................................................................................................. 271
Capitolul 7. Retrospectiv i perspective ........................................................................ 273
1. Procesul de dezvoltare a serviciilor Web .............................................................. 273
2. Alte iniiative viznd serviciile Web ........................................................................ 275
2.1. Privire de ansamblu .......................................................................................... 275
2.2. Adresarea serviciilor prin WS-Addressing ..................................................... 276
2.3. Descoperirea serviciilor ................................................................................... 276
2.4. Coordonarea serviciilor Web .......................................................................... 278
2.5. Accesarea resurselor serviciilor Web ............................................................ 283
2.6. Accesarea meta-datelor asociate serviciilor ................................................ 285
2.7. Securitatea serviciilor Web .............................................................................. 286
2.8. Asigurarea inter-operabilitii ......................................................................... 295
2.9 Serviciile Web n contextul proceselor de afaceri .................................... 298
2.10. Servicii Web pentru grid ................................................................................... 302
3. SOA n contextul noului Web ..................................................................................... 304
Referine ................................................................................................................................. 307
Acronime......................................................................................................................................... 311
Bibliografie general ........................................................................................................................ 317
Prefa
Misiunea crii de fa este, cel puin pentru autori, att una relativ dificil, ct mai
ales! atrgtoare: ne propunem s prezentm sistematic unul dintre domeniile
importante, dinamice i de succes ale tehnologiilor actuale serviciile Web. Astfel,
adresm acest volum viitorului sau actualului programator Web care dorete s se
iniieze n tehnologiile i metodologiile de dezvoltare a serviciilor Web bazate preponderent pe SOAP. Desigur, nu uitm nici abordarea REST, concretizat n ilustrarea
invocrii de servicii n mod asincron via suita de tehnologii AJAX.
Plecnd de la metafora c putem asemna un serviciu Web cu o portocal, vom
ncerca s decojim straturile poate uneori mai aspre ale specificaiilor privitoare
la descrierea prin WSDL a interfeei i implementrii serviciului, la protocolul de
transport SOAP i la descoperirea prin diverse metode (e.g., UDDI) a serviciilor
disponibile n regim public sau privat. ntr-un anumit moment vom ajunge i la miez,
adic tocmai la prezentarea limbajelor, instrumentelor i platformelor ce ofer suport
pentru crearea i invocarea de servicii Web.
Programatorii se vor putea delecta cu diverse biblioteci, framework-uri i servere de
aplicaii, prinznd gustul implementrii de servicii (cu mult) mai complexe. Nu uitm s
enumerm noiunile de baz privitoare la familia XML baza pe care se fundamenteaz
ntreg eafodajul de limbaje i iniiative privitoare la serviciile Web ori s tragem cu
ochiul la livada de portocali actuali, (re)prezentnd perspectivele domeniului.
Materialul i are drept destinatari pe toi cei interesai de tehnologiile Web n general
i de servicii Web n special: studeni de la faculti de profil, elevi din clasele terminale,
dezvoltatori din cadrul companiilor, alte categorii de specialiti n informatic sau n
domenii conexe. Notm, en passant, c una dintre cerinele obligatorii ale seciunii
Software Design a deja bine-cunoscutei competiii internaionale Imagine Cup este ca
fiecare echip concurent s implementeze cel puin un serviciu Web
Vom descrie n continuare structura lucrrii de fa.
Capitolul 1 conine o prezentare general a serviciilor Web, n contextul dezvoltrii
aplicaiilor distribuite bazate pe XML. Tot aici realizm o trecere n revist a caracteristicilor principale ale protocolului HTTP, introducem SOA (arhitectura orientat
spre servicii) i discutm necesitatea existenei tehnologiilor SOAP, WSDL, UDDI,
REST.
Al doilea capitol se focalizeaz asupra familiei de limbaje XML. Descriem sintaxa,
spaiile de nume, manierele de validare i tehnicile de procesare a documentelor XML.
Insistm asupra unor concepte privitoare la XML Schema i modelul DOM, deoarece
ne vor fi de folos pe parcursul crii.
10
PREFA
Cel de-al treilea capitol este dedicat manierei de descriere a serviciilor Web. n
primul rnd, ne oprim asupra limbajului WSDL: componente, tipuri de documente, de
operaii i de mesaje, exemple i instrumente de lucru.
n cadrul capitolului patru detaliem inima serviciilor Web SOAP. Dup o
succint prezentare a protocoalelor de transport bazate pe XML, realizm o privire de
ansamblu a protocolului SOAP. De asemenea, printre altele, sunt descrise: structura i
maniera de codificare a mesajelor, modul de procesare i transport ale datelor, relaia
dintre SOAP i HTTP i diferenele dintre versiunile n vigoare ale acestui important
protocol.
Capitolul cinci are drept subiect descoperirea serviciilor Web. Prima parte se
focalizeaz asupra UDDI, unul dintre cele mai populare mecanisme de cutare a
serviciilor, mai ales prin prisma proceselor de afaceri pe care le modeleaz. Dup
detalierea arhitecturii UDDI, a tipurilor de informaii stocate i a intimitilor privind
funcionarea, oferim i o soluie practic de constituire a unui registru UDDI propriu
prin intermediul instrumentului open source jUDDI. A doua parte a capitolului vizeaz
descoperirea dinamic a serviciilor prin WS-Inspection.
Pentru unii dintre cititorii mai grbii, capitolul ase ar putea reprezenta cea mai
incitant parte a volumului, deoarece cuprinde reete de sdire a serviciilor Web
fie ele referitoare la portocale (albastre) sau la alte aspecte i de consumare a
funcionalitilor oferite de acestea. Am folosit majoritatea limbajelor de programare
(C/C++, C#, Java, Perl, PHP, Visual Basic), a instrumentelor (Apache Axis2, gSOAP,
NuSOAP, SOAP::Lite) i mediilor de dezvoltare (.NET, Java, Delphi) actuale, fie ele
comerciale sau liber disponibile. Tot aici punctm etapele care trebuie parcurse pentru
accesarea serviciilor Web externe (Google i XMethods) i ilustrm principiile de baz
ale suitei de tehnologii AJAX. Prezentm, de asemenea, maniera de invocare asincron
a serviciilor Web, fie direct via programe JavaScript , fie pe baza unor biblioteci i
framework-uri precum Prototype i Atlas ASP.NET.
Ultimul capitol realizeaz o recapitulare a tematicilor atinse i traseaz diverse
direcii de evoluie, invitndu-i pe cei interesai s aprofundeze domeniul. Astfel,
prezentm succint iniiative industriale ca WS-Addressing, WS-Discovery, WS-Coordination
sau WS-AtomicTransaction. Suplimentar, punem n discuie aspecte referitoare la ingineria,
securitatea i asigurarea inter-operabilitii serviciilor Web. Spre final, degustm rapid
rolul serviciilor Web n cadrul proceselor de afaceri, al sistemelor de tip grid i al noului
Web (ale crui tendine sunt cunoscute sub denumirea generic de Web 2.0, etap
preliminar Web-ului semantic).
Volumul se ncheie cu un set cuprinztor de acronime folosite n text i, n mod
firesc, cu o bibliografie general.
Aceast carte nu ar fi ajuns la forma actual fr ajutorul oferit att prin
parcurgerea versiunilor preliminare, ct i prin formularea unor sugestii utile de Snic
Alboaie, Mihaela Brut, Diana Gorea, Adrian Iftene, Loredana i tefan Tanas i, nu n ultimul
rnd, Cosmin Vrlan. Suntem recunosctori profesorilor notri Toader Jucan, Cornelius
Croitoru, Dorel Lucanu i Henri Luchian, de la Facultatea de Informatic a Universitii
Alexandru Ioan Cuza din Iai. De asemenea, mulumim familiilor noastre i echipei
de profesioniti a Editurii Polirom.
PREFA
11
Capitolul 1
1. Preambul
Spaiul World Wide Web reprezint un sistem de distribuie local sau global a
informaiilor hipermedia, vzut ca univers informaional compus din elemente de
interes, denumite resurse, desemnate de identificatori globali URI (Uniform
Resource Identifiers).
Din punct de vedere tehnic, Web-ul pune la dispoziie un sistem global i
standardizat de comunicare multimedia (summum de media), informaiile fiind
organizate asociativ i distribuite n funcie de cererile utilizatorilor, funcionnd
conform modelului client/server. Prin definiie, clientul (n cazul nostru denumit
i navigator sau agent-utilizator Web) solicit servicii (informaii) de la componenta server. Serverul rspunde aadar cererilor clienilor, protocolul folosit
fiind, uzual, HTTP (HyperText Transfer Protocol).
14
SERVICII WEB
Concepte fundamentale
Conceptele de baz sunt cererea i rspunsul: un client Web trimite un mesaj
(cererea) la un server. Mesajul conine identificatorul resursei dorite, dat sub
forma unui URI (Uniform Resource Identifier), metoda de acces folosit, versiunea
protocolului, precum i o serie de meta-informaii care pot fi utile serverului.
Rspunsul serverului cuprinde un cod indicnd starea serverului dup interpretarea cererii, un mesaj explicativ pentru codul de stare transmis, meta-informaiile care vor fi procesate de ctre client i, eventual, un coninut (e.g.,
resursa solicitat).
n general, o sesiune de comunicare HTTP este iniiat de ctre client i
const din solicitarea unei resurse (o pagin Web, uzual) identificat unic pe un
server cunoscut. Acesta este numit i server de origine datorit faptului c n
comunicarea ntre client i server pot s apar unul sau mai muli intermediari:
proxy (numit i server proxy), poart (gateway) sau tunel (tunnel). Entitatea proxy
reprezint un intermediar care retrimite un mesaj HTTP, eventual modificnd o
parte a sa. Poarta semnific un intermediar care se poate situa naintea unui
server de origine i s se identifice drept acesta, clientul Web necunoscnd acest
aspect. Tunelul este un intermediar care nu schimb coninutul mesajului, ci are
rolul exclusiv de retransmitere a lui; de exemplu, tunelul poate fi folosit pentru
(de)criptarea mesajelor vehiculate ntre server i client n cadrul unui intranet/
extranet.
Un alt concept important este cel de cache, desemnnd un depozit local de
stocare (n memorie, pe disc) a mesajelor (datelor) la nivel de server/client. Un
proxy deine obligatoriu un cache, denumit i sistem de cache.
Un exemplu tipic de cerere-rspuns este urmtorul, n care cererea formulat
de un browser are forma:
GET /catalog_produse.html HTTP/1.1
Host: www.portocale.info
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
rv:1.8.0.5) Gecko/20060719 Firefox/1.5.0.5
Accept: text/html, image/gif, image/jpeg, */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate, compress, identity
Connection: Keep-Alive
15
Accept-Ranges: bytes
Content-Length: 201
Keep-Alive: timeout=15, max=74
Connection: Keep-Alive
Content-Type: text/html; charset=ISO-8859-1
...
16
SERVICII WEB
17
De asemenea, mesajele pot fi codificate prin diverse metode, precum gzip ori
compress, n vederea comprimrii sau asigurrii identitii i/sau integritii.
Mesajele HTTP
Cererile i rspunsurile HTTP sunt vehiculate prin intermediul mesajelor. Astfel,
mesajele HTTP sunt considerate de dou tipuri: cerere provenit de la un client
ctre un server i rspuns al serverului, trimis la acel client. Un mesaj e compus
dintr-o succesiune de linii de text, delimitate de caracterele CRLF (Carriage Return
i Line Feed). Prima linie semnific o cerere efectuat de un client sau un cod de
stare obinut de la server, urmat de un numr de atribute de antet.
Un antet (header) conine mai multe atribute care sunt folosite la completarea
unei cereri sau a unui rspuns cu meta-informaia necesar interpretrii corecte
a mesajului prin stabilirea unor valori specificate de ctre protocolul HTTP sau
a unor protocoale definite de utilizator (de exemplu, SOAP). Un atribut este
furnizat printr-un nume urmat de : i de o valoare (opional, n unele cazuri).
O cerere e specificat de o metod de acces, printre cele mai folosite fiind:
GET reprezint o cerere de accesare a unor informaii (reprezentri de
resurse). Un client HTTP (navigator, robot, program de descrcare, agregator
de tiri, player multimedia etc.) folosete metoda GET pentru a obine o
anumit resurs, fie c ea reprezint un fiier (document text, HTML, imagine
PNG sau JPEG, aplicaie, arhiv, document XML etc.), fie c indic execuia
pe serverul Web a unui proces care va produce datele dorite (e.g., invocarea
unui script CGI sau a unui program PHP);
HEAD este similar cu metoda GET, dar serverul va ntoarce un mesaj
avnd informaii doar n antet. Meta-datele din anteturile HTTP din rspunsul
la o cerere HEAD vor fi identice cu cele din rspunsul la o cerere GET.
Utilitatea acestei metode const n obinerea meta-datelor asociate unei resurse
Web fr a transfera efectiv ntreaga entitate, n vederea de exemplu a
testrii existenei resursei, a obinerii datei ultimei modificri sau furnizarea
drepturilor de acces;
POST este utilizat pentru a identifica dac serverul accept o entitate
nglobat n cerere. POST este proiectat s implementeze o metod uniform
pentru funcii precum adnotarea resurselor, trimiterea datelor unui formular
Web ctre server, extinderea unei baze de date printr-o operaiune de inserare,
invocarea unui serviciu etc.
n cadrul unei cereri pot fi specificate diverse atribute, utilizate pentru a
transmite serverului informaii suplimentare privitoare la acea cerere i la client.
18
SERVICII WEB
Se poate face o analogie ntre trimiterea unei metode HTTP i apelul unei
funcii dintr-un limbaj de programare, unde atributele reprezint parametrii de
intrare.
Dup primirea i interpretarea unui mesaj de tip cerere i interpretarea lui, un
server HTTP ntoarce un mesaj denumit rspuns. Prima linie conine versiunea
protocolului HTTP implementat de ctre server i continu cu un cod de stare
reprezentnd un numr asociat de ctre specificaia HTTP unei anumite situaii
a serverului n urma tratrii unei cereri. Urmeaz un text explicativ pentru codul
de stare, menit s clarifice situaia exprimat de acesta.
Codul de stare este format din trei cifre organizate n categorii de stri;
codurile din aceeai categorie se refer la stri similare. Ele se disting dup prima
cifr n modul urmtor:
Coduri de informare (1xx) furnizeaz informaii privitoare la o anumit
aciune (cererea a fost primit, comunicaia continu). De exemplu: 100
Continue (clientul poate continua cererea, trebuind s trimit urmtoarea parte
a unui mesaj parial).
Coduri de succes (2xx) raporteaz efectuarea cu succes a unei operaiuni
(cererea a fost primit, interpretat i acceptat de ctre server). Un cod tipic
din aceast categorie este 200 OK (cererea a fost rezolvat cu succes). Alt
exemplu este 204 No Content (serverul a rezolvat cererea, dar nu are ce returna
clientului).
Coduri de redirecionare (3xx) indic o redirecionare a cererii spre alt
locaie ori alt server. Drept exemple, menionm codurile 301 Moved Permanently
(resursa solicitat a fost asociat unui URI nou i orice referin viitoare la ea
trebuie s se realizeze prin acest URI furnizat) i 302 Moved Temporarily
(resursa cerut are asociat un alt URI, dar pentru o perioad temporar).
Coduri de eroare provocate de client (4xx) specific apariia unei erori pe
partea clientului (fie cererea este incorect din punct de vedere sintactic, fie
nu poate fi satisfcut din varii motive). Ca exemple, furnizm 401 Unauthorized
(cererea necesit autentificarea utilizatorului e.g., via un nume de cont urmat
de o parol) i 403 Forbidden (serverul a recepionat o cerere corect, dar
refuz s o satisfac din diverse motive legate de restricionarea accesului).
Un alt cod tipic, des ntlnit, este 404 Not found (serverul nu gsete resursa
specificat).
Coduri de eroare generate de server (5xx) desemneaz coduri semnificnd
o eroare pe partea serverului (cererea este aparent corect, dar serverul nu o
poate ndeplini din anumite motive). Drept exemplificare menionm 503
Service Unavailable (serverul Web nu poate satisface cererea e.g., din cauza
suprancrcrii temporare sau din raiuni de administrare).
19
Accept
Semnificaie
Specific unei cereri, cu rol n stabilirea tipului coninutului prin
intermediul unei negocieri conduse de server; clientul are posibilitatea de a furniza tipurile media (MIME) pe care acesta le
recunoate i le poate interpreta sau poate indica numai tipul de
rspunsuri preferate. Un exemplu este Accept: text/xml,
application/xml
Cache-Control
Connection
Content-Type
Host
Location
Server
Content-Type: text/html
Folosit ntr-o cerere pentru specificarea adresei Internet i a portului n vederea stabilirii exacte a locaiei unde se afl resursa
creia i se adreseaz cererea Host: www.portocale.info
Specific rspunsurilor HTTP. Utilizat n conjuncie cu coduri de
stare de tip 3xx sau 201 Created. Poate stabili locaia curent sau
preferat a resursei sub forma unui URI absolut.
Conine informaii despre aplicaia server, cum ar fi numele,
versiunea, productorul, aplicaiile compatibile Server:
libwww-perl-daemon/1.36
20
SERVICII WEB
21
22
SERVICII WEB
23
la distan ori date globale. Procedurile pot partaja date comune. De remarcat
faptul c argumentele pasate procedurilor la distan trebuie s fie ncapsulate
ntr-o structur (similar cu struct din limbajul C) pentru a reduce numrul de
argumente transmise procedurii.
Fiecrui program aflat la distan i se va asocia un identificator unic, stocat
pe 32 de bii, iar fiecare procedur component (care va fi executat n cadrul
acelui program) este numerotat (indexat) secvenial de la 1 la n, unde n este
numrul maxim de proceduri ale acelui program. De asemenea, fiecare program
la distan va fi nsoit de un numr ntreg pozitiv desemnnd versiunea. Prima
versiune a unui program de obicei este 1. Urmtoarele versiuni vor fi identificate
de alte numere, n mod unic. Numerele de versiuni ofer posibilitatea de a
schimba detaliile de implementare sau extinderea capabilitilor aplicaiilor fr
a asocia unui program un identificator diferit.
Mecanismul RPC i gsete utilizri interesante, dintre care, cea mai important o reprezint accesul la sisteme de fiiere la distan prin NFS (Network File
System), prezent n orice mediu UNIX i semnificnd de fapt un sistem de fiiere
distribuit (distributed file system).
O alternativ la ONC RPC este mediul de calcul distribuit DCE (Distributed
Computing Environment), care constituie i fundamentul unor servicii de reea
vitale din Windows 2000/XP.
n anii 90, RPC a continuat s fie utilizat prin abordarea obiectual ORPC
(Object RPC), mesajele de cerere i rspuns de la distan fiind ncapsulate de
obiecte. Ca descendeni direci ai ORPC se pot enumera DCOM (Distributed
Common Object Model) i IIOP (CORBA Internet Inter-ORB Protocol). Arhitectura
Java pune la dispoziie RMI (Remote Method Invocation), iar platforma .NET ofer
aa-numitul .NET Remoting.
24
SERVICII WEB
unor standarde pentru ndeplinirea cerinelor legate de vehicularea, disponibilitatea, mentenana, securitatea i regsirea datelor.
Spaiul Web poate fi considerat din acest punct de vedere ca o tehnologie
middleware, extensie a unor modele precum CORBA sau DCOM (a se urmri i
figura 1). Componentele intermediare (proxy) la nivel de client i server pot juca
acelai rol ca interfeele stub RPC.
Mai mult dect att, trebuie puse bazele constituirii unei arhitecturi destinate
dezvoltrii de aplicaii distribuite orientate spre Web. Software-ul trebuie divizat
n servicii care se pot compune, menite a se conecta i orchestra n mod spontan
n cadrul proceselor de afaceri sau din alte medii. Este o viziune a software-ului
bazat pe componente Web (component-based software), n contrast cu aplicaiile
monolitice, clasice. Desigur, software-ul standard (vechi) trebuie integrat n
aceast nou arhitectur pentru a se proteja investiiile fcute.
Soluia este dat de un model cunoscut sub numele de arhitectura orientat spre
servicii (SOA Service Oriented Architecture). Arhitectura SOA impune adoptarea
unui stil de dezvoltare de aplicaii, considerate drept servicii ce vor fi invocate
de alte aplicaii. Conform OMG (Object Management Group), definiia propus n
aprilie 2006 a arhitecturii orientat spre servicii este urmtoarea: SOA reprezint
25
26
SERVICII WEB
27
Definiii i caracterizri
Serviciile Web bazate pe XML (Extensible Markup Language) fac explicite specificaiile implicite, putnd fi folosite n cadrul interaciunii dintre maini. Mai
mult dect att, pot fi invocate i n cazul necunoaterii a priori a interaciunii cu
alte aplicaii/servicii Web.
Nu exist o definiie unanim acceptat a conceptului de serviciu Web.
Conform IBM, reprezint o aplicaie modular bazat pe tehnologiile Internet,
menit a ndeplini activiti specifice i conformndu-se unui format tehnic
specific. Microsoft consider serviciile Web ca fiind partea de procesare a datelor
unei aplicaii (application logic) disponibil la nivel de program i beneficiind de
funcionalitile oferite de Internet. Dup Sun, un serviciu Web este o aplicaie
care accept cereri din partea altor sisteme dispuse n Internet sau intranet,
mediate de tehnologii de comunicaie neutre i agile.
Un serviciu Web ofer o funcionalitate specific accesat pe baza unui
schimb de mesaje marcate n XML. Acest schimb de mesaje e guvernat de
anumite reguli. Suplimentar, un serviciu Web se poate autodescrie, folosind
meta-date (date referitoare la date).
Serviciile Web implic utilizarea unor protocoale de comunicaie, avnd
asociate descrieri ale datelor procesate i alte interaciuni cu aplicaii tere.
Identificarea unui serviciu Web se realizeaz prin intermediul URI-urilor; transferul de date recurge n mod uzual la HTTP, iar definirea structurat a datelor
vehiculate se face via XML. Un serviciu Web poate fi considerat ca fiind compus
dintr-o colecie de funcii mpachetate, interpretate ca o entitate unic i publicate
n spaiul WWW cu scopul de a fi folosite de alte programe.
Ca exemple de operaii ce pot fi puse la dispoziie de serviciile Web, le
amintim pe urmtoarele:
transformarea datelor primite (e.g., conversii de valori n alte uniti de msur);
dirijarea mesajelor (mai ales n cazul magistralelor de date specifice,
disponibile la nivel de ntreprindere);
interogri asupra diverselor servere de baze de date relaionale, obiectuale sau
native XML (de exemplu, furnizarea cataloagelor de produse, a coordonatelor
unor localiti, a situaiei unui cont bancar, a istoricului cumprturilor
efectuate online etc.);
orchestrarea conversaiilor ntre diferite entiti (jucnd, din acest punct de
vedere, rolul de mediatori sau ageni);
28
SERVICII WEB
29
Orice aplicaie-client (script Perl, applet Java, program C cu interfa text sau
grafic, aplicaie .NET, pagin ori serviciu Web etc.) poate consuma ntr-o
varietate de modaliti datele obinute de la un serviciu invocat printr-o
metod standardizat, bazat pe normele Web n vigoare.
Desigur, n afar de avantajele incontestabile oferite (inter-operabilitate ntre
diverse platforme i limbaje de programare, utilizarea de standarde i protocoale
deschise, reutilizarea componentelor software, lipsa unei relaii strnse ntre
entiti etc.), serviciile Web pot prezenta i dezavantaje, precum lipsa ori suportul
precar pentru tranzacii i performana relativ sczut fa de abordrile binare
(CORBA, DCOM ori RMI).
Odat cu proliferarea arhitecturii SOA, sunt disponibile servicii specifice
mediului enterprise, viznd aspecte legate de:
coninut specificarea, colectarea i organizarea cunotinelor din cadrul
organizaiei;
acces utilizatorii, via un portal/desktop Web, vor avea la ndemn mijloacele
de creare i de exploatare a serviciilor sau aplicaiilor compuse;
integrare n contextul EAI (Enterprise Application Integration) ndeosebi,
coninutul vehiculat de aplicaii/utilizatori va putea fi transformat graie unor
entiti software inteligente;
procesare se vor putea specifica reguli pentru managementul traficului de
date (dirijare, caching, filtrare etc.) n funcie de specificul afacerilor ntreprinse;
analizare acordarea unui suport avansat de luare (inteligent) a deciziilor;
colaborare va putea fi instituit o fundaie pentru managementul interaciunilor i comunicaiilor ntre utilizatori (umani sau nu) un exemplu n
acest sens este enterprise wiki.
30
SERVICII WEB
31
32
SERVICII WEB
Figura 3. Relaiile dintre un client, un serviciu Web i registrul UDDI interogat prin SOAP
pentru a se obine descrierea WSDL a serviciului dorit
33
Arhitectura REST
REST (REpresentational State Transfer) reprezint o arhitectur de dezvoltare a
aplicaiilor Web. Conform filosofiei REST, rezultatul unei procesri conduce la
returnarea unei reprezentri a unei resurse Web. Orice accesare a unei reprezentri
plaseaz aplicaia-client ntr-o stare care va fi schimbat n urma unui transfer de
date (accesarea altei reprezentri, pe baza traversrii unei legturi hipertext
desemnat de un URI inclus n reprezentarea resursei iniiale). Starea
comunicrii ntre mesajele vehiculate ntre server i client nu trebuie reinut
(stateless).
Transferul de date se realizeaz prin HTTP, reprezentarea este marcat n
XML (ori alt format), iar adresabilitatea se rezolv via URI, spaiul Web putnd
fi considerat drept un sistem REST.
Serviciile Web actuale se pot dezvolta n concordan cu arhitectura REST.
Componentele care invoc funcionaliti vor consuma reprezentri de resurse
(n stilul pull) conform clasicei arhitecturi client/server. Fiecare cerere este
considerat independent, fr a se lua n consideraie contextul conexiuni
stateless. Resursele Web pot fi accesate printr-o interfa generic pus la dispoziie
de metodele protocolului HTTP: GET, POST, PUT i DELETE. Actualmente
sunt utilizate preponderent GET i POST.
REST se consider a fi o viziune complementar de implementare i utilizare
a serviciilor Web, n locul mesajelor SOAP (al cror format e considerat de unii
dezvoltatori prea complex n anumite situaii) recurgndu-se la reprezentri
XML mai simple numite i POX (Plain Old XML). O astfel de abordare e
adoptat i de suita de tehnologii AJAX, prezentat n cadrul capitolului 6.
O aplicaie Web dezvoltat conform principiilor REST are o arhitectur
diferit de una n stilul RPC (acesta din urm fiind adoptat i de protocolul
SOAP). n cazul RPC, punctul focal e reprezentat de mulimea de operaii ce pot
fi executate (numite i verbe), pe cnd n viziunea REST totul se axeaz pe
diversitatea resurselor disponibile (denumite i substantive).
De exemplu, pentru o aplicaie Web privitoare la un sit de comer electronic
oferind sortimente de portocale, abordarea SOAP relev existena unor operaii
(metode) precum furnizeazaSortiment(), adaugaSortiment(), eliminaSortiment(), actualizeazaSortiment(), listeazaSortimente(), cautaSortimente() privitoare la sortimentele disponibile
34
SERVICII WEB
35
36
SERVICII WEB
Referine
Albin, S., The Art of Software Architecture: Design Methods and Techniques, Wiley & Sons, 2003
Alboaie, L, Buraga, S., Dialoguri despre SOAP, NET Report, februarie 2003:
http://www.infoiasi.ro/~busaco/publications/articles/SOAP.pdf
Berners-Lee, T., Fielding, R., Masinter, L., Uniform Resource Identifiers (URI): Generic
Syntax, RFC 2396, Internet Engineering Task Force (IETF), 2004: http://www.ietf.org/
rfc/rfc2396.txt
Booth, D. et al. (eds.), Web Services Architecture, W3C Working Draft, Boston, 2003:
http://www.w3.org/TR/ws-arch/
Buraga, S., Tehnologii XML, Polirom, Iai, 2006: http://www.infoiasi.ro/~busaco/
books/xml/
Buraga, S., Proiectarea siturilor Web (ediia a doua), Polirom, Iai, 2005: http://
www.infoiasi.ro/~design/
Buraga, S., Ciobanu, G., Atelier de programare n reele de calculatoare, Polirom, Iai, 2001:
http://www.infoiasi.ro/~lrc/
Cabrera, L.F., Kurt, C., Web Services Architecture and Its Specifications, Microsoft Press, 2005
37
Coyle, F., XML, Web Services, and the Data Revolution, Addison-Wesley, 2002
Dumbill, E. et al., Programming Web Services with XML-RPC, OReilly, 2001
Erl, T., Service-Oriented Architecture: Concepts, Technology, and Design, Prentice Hall PTR, 2005
Fielding, R., Architectural Styles and the Design of Network-based Software Architectures, Ph.D. Dissertation, 2000: http://www.ics.uci.edu/~fielding/pubs/dissertation/
top.htm
Freed, N., Borenstein, N., Multipurpose Internet Mail Extensions (MIME) Part One: Format
of Internet Message Bodies, RFC 2045, Internet Engineering Task Force (IETF), 1996:
http://www.ietf.org/rfc/rfc2045.txt
Freed, N., Borenstein, N., Multipurpose Internet Mail Extensions (MIME) Part Two: Media
Types, RFC 2046, Internet Engineering Task Force (IETF), 1996: http://www.ietf.org/
rfc/rfc2046.txt
Gettys, J. et al., Hypertext Transfer Protocol HTTP/1.1, RFC 2616, Internet Engineering
Task Force (IETF), 1999: http://www.ietf.org/rfc/rfc2616.txt
Guruge, A., Web Services: Theory and Practice, Digital Press, 2004
He, H., What is Service-Oriented Architecture?, XML.com, 2003: http://webservices.xml.com/
pub/a/ws/2003/09/30/soa.html
He, H., Implementing REST Web Services: Best Practices and Guidelines, XML.com, 2004:
http://www.xml.com/pub/a/2004/08/11/rest.html
Jacobs, I., Walsh, N., Architecture of the World Wide Web, Volume One, W3C Recommendation, Boston, 2004: http://www.w3.org/TR/webarch/
Linthicum, D., Enterprise Application Integration, Addison-Wesley, 1999
Mahmoud, Q., Service-Oriented Architecture (SOA) and Web Services: The Road to Enterprise
Application Integration (WAI), Sun, 2005: http://java.sun.com/developer/technical/
WebServices/soa/
Myerson, J., The Complete Book of Middleware, Auerbach Publications, 2002
Tanenbaum, A., Distributed Operating Systems, Prentice Hall International, 1995
Weerawarana, S. et al., Web Services Platform Architecture, Prentice Hall PTR, 2005
* * *, Atom: http://atomenabled.org/
* * *, Flickr API Documentation: http://www.flickr.com/services/api/
* * *, Google Web API: http://www.google.com/apis/
* * *, IBMs DeveloperWorks Web Services: http://www-136.ibm.com/developerworks/
webservices
* * *, MSDN (Microsoft Developer Network): http://msdn.microsoft.com/
* * *, Representation State Transfer, Wikipedia.org, 2006: http://en.wikipedia.org/
wiki/Representational_State_Transfer
* * *, Service-oriented architecture, Wikipedia.org, 2006: http://en.wikipedia.org/
wiki/Service-oriented_architecture
* * *, Situl lui Paul Prescod: http://www.prescod.net/
* * *, Web Services Activity: http://www.w3.org/2002/ws/
* * *, World Wide Web Consortium, Boston, 2006: http://www.w3.org/
* * *, Yahoo! Developer Network: http://developer.yahoo.net/
Capitolul 2
Familia XML
Este mai bine s tii cteva ntrebri dect
toate rspunsurile.
(James Thurber)
1. Preliminarii
Pentru identificarea resurselor, Web-ul recurge la identificatori uniformi de
resurse (URI Uniform Resource Identifiers), iar pentru interaciune se folosete n
mod uzual protocolul HTTP. Reprezentarea resurselor se realizeaz via formate
de date. Arhitectura spaiului WWW ncurajeaz refolosirea formatelor existente,
printre aspectele importante legate de acest latur putndu-se enumera: adoptarea
formatelor textuale n contrast cu cele binare, controlul versiunilor, extensibilitatea, compunerea formatelor, separarea coninutului, prezentrii i interaciunii.
Cu proliferarea serviciilor Internet, mai ales ale Web-ului, datele au putut fi
publicate liber, folosindu-se un format de redare (prezentare) a informaiilor pus
la dispoziie de bine-cunoscutul HTML (HyperText Markup Language), n varianta
actual XHTML (Extensible HTML). n prezent, atenia cade asupra modelrii
ct mai eficiente a informaiilor, prin intermediul unui format deschis,
extensibil subiectul acestui capitol. Mai mult dect att, modelarea datelor nu
reflect doar sintaxa (care e specificat printr-un set de convenii de marcare), ci
i semantica pn acum reprezentat de codul-surs al programelor ce prelucrau
acele date.
Dac formatele de date transpun maniera efectiv de stocare i prezentare a
informaiilor, la nivel conceptual trebuie adoptat cel puin un model de reprezentare. Evoluia infrastructurilor de calcul a condus i la adoptarea unor modele
de date diferite.
Prezentul are la baz arhitecturile navigaionale, bazate pe hipertext (text
neliniar), utilizate de o pleiad de dispozitive, inclusiv cele mobile. Se consider
c unul dintre modelele de date cele mai potrivite este cel oferit de familia de
limbaje XML.
40
SERVICII WEB
FAMILIA XML
41
42
SERVICII WEB
<portocale>
<!-- partea de achiziie de portocale -->
<achizitii>
<tip>Portocale greceti fr coaj</tip>
<cod>P10-01-GR</cod>
<cantit um="kg">3374</cantit>
</achizitii>
<!-- partea de vnzri de portocale -->
<vanzari>
<tip>Portocale japoneze albastre</tip>
<cod>P10-03-JP</cod>
<cantit um="kg">0107</cantit>
</vanzari>
</portocale>
FAMILIA XML
43
44
SERVICII WEB
FAMILIA XML
45
<comanda xmlns:p="http://www.undeva.ro/parteneri/">
<partener>
<p:nume>Portocal Escu</p:nume>
<p:adresa>Aleea Zpezilor, 33</p:adresa>
</partener>
<f:furnizor xmlns:f="urn:furnizori.info"
f:adresa="http://ja.po.ro/">
<nume>Japo Nez S.A.</nume>
</f:furnizor>
</comanda>
Atributul xmlns este folosit pentru declararea spaiilor de nume, iar valoarea
lui trebuie s fie un URI, fie localiznd o resurs prin adresa ei cazul URL
(Uniform Resource Locator), fie desemnnd un nume unic asociat resursei n cauz
facilitate oferit de URN (Uniform Resource Name). Prin intermediul construciei
xmlns , se asociaz un vocabular, denumit i spaiu de nume (namespace), pentru
elementele n cauz.
46
SERVICII WEB
FAMILIA XML
47
Apare aadar necesitatea specificrii unui set de constrngeri asociate documentelor, astfel nct datele XML s fie verificate dac sunt valide sau nu din
punct de vedere structural sau al tipului coninutului.
Modalitile de precizare a constrngerilor se pot baza pe: descrieri (DTD i
XML Schema), reguli (Sablotron) i abloane (RELAX NG) detalii n cartea lui
Sabin Buraga, Tehnologii XML, Polirom, Iai, 2006.
48
SERVICII WEB
FAMILIA XML
49
50
SERVICII WEB
Putem defini tipuri simple derivate din cele predefinite via <xsd:simpleType> .
Noul tip de date specificat poate fi o restricie a unui tip deja existent prin
intermediul unor constrngeri (facets). Prin intermediul constrngerilor pot fi
precizate aspecte precum:
lungimea: <xsd:length> ;
lungimea minim: <xsd:minLength>;
lungimea maxim: <xsd:maxLength>;
un model (pattern), exprimat printr-o expresie regulat: <xsd:pattern>.
FAMILIA XML
51
alternativ: <xsd:choice>;
secven: <xsd:sequence>;
grupare: <xsd:group>;
apariie a tuturor elementelor, n orice ordine: <xsd:all>.
52
SERVICII WEB
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="urn:portocale.info"
targetNamespace="urn:portocale.info">
<xsd:annotation>
<xsd:documentation xml:lang="ro">
O schem utilizat la validarea
tranzaciilor de portocale
</xsd:documentation>
</xsd:annotation>
<!-- definirea elementului-rdcin "portocale" -->
<xsd:element name="portocale" type="portocaleType" />
<xsd:complexType name="portocaleType">
<!-- o secven de alternative -->
<xsd:sequence maxOccurs="unbounded">
<xsd:choice>
<!-- mcar o apari. a elem. "achizitii" -->
<xsd:element name="achizitii"
type="prodType"
minOccurs="1" maxOccurs="unbounded" />
<!-- idem i pt. "vanzari" -->
<xsd:element name="vanzari"
type="prodType"
minOccurs="1" maxOccurs="unbounded" />
</xsd:choice>
<xsd:sequence>
</xsd:complexType>
<!-- tipul complex "prodType",
folosit pentru achiziii sau vnzri -->
<xsd:complexType name="prodType">
<xsd:sequence>
<xsd:element name="tip" type="xsd:string"
minOccurs="1" maxOccurs="1" />
<xsd:element name="cod" type="xsd:string"
minOccurs="1" maxOccurs="1" />
<!-- elementul "obs" e opional -->
<xsd:element name="obs" type="xsd:string"
minOccurs="0" maxOccurs="1" />
<xsd:element name="cantit">
<xsd:complexType>
<!-- derivm dintr-un tip simplu -->
<xsd:simpleContent>
<xsd:extension base="xsd:unsignedInt">
<!-- specif. apariia (obligatorie)
a atributului "um" -->
FAMILIA XML
53
<xsd:attribute name="um"
type="xsd:string"
use="required" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<!-- un identificator opional -->
<xsd:attribute name="id" type="xsd:ID"
use="optional" />
</xsd:complexType>
</xsd:schema>
Mai urmeaz s utilizm schema de mai sus pentru a verifica validitatea unei
instane de document XML care trebuie s declare un spaiu de nume cu un URI
desemnnd schema utilizat.
La nivelul unei instane de document vom folosi o construcie de genul:
<portocale xmlns="urn:portocale.info"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"urn:portocale.info file:portocale.xsd">
<!-- coninut propriu-zis -->
</portocale>
54
SERVICII WEB
Aplicaia <oXygen /> XML Editor amintit mai sus poate fi folosit i ca
validator de documente XML.
n cele de mai jos ilustrm anumite mesaje de eroare afiate de unul dintre
utilitarele puse la dispoziie de procesorul Apache Xerces disponibil n regim open
source n cazul unui document XML invalid, conform schemei descrise anterior:
P:\xerces>DOMPrint.exe -v=always -n -s -f portocale.xml
Error at file "portocale.xml", line 7, column 21
Message: Unknown element 'suplimentar'
Error at file "portocale.xml", line 11, column 21
Message: In element cod: Can not have element children
within a simple type content
Error at file "portocale.xml", line 12, column 14
Message: Required attribute 'um' was not provided
Error at file "portocale.xml", line 13, column 15
Message: Element 'suplimentar' is not valid for content
model: '((tip,cod,obs),cantit)'
FAMILIA XML
55
DocumentFragment
DocumentType
EntityReference
Descendeni
Element,
ProcessingInstruction,
Comment,
DocumentType
Element,
ProcessingInstruction,
Comment,
Text,
CDATASection,
EntityReference
Element,
ProcessingInstruction,
Comment,
Text,
CDATASection,
EntityReference
56
SERVICII WEB
Tip
Element
Attr
ProcessingInstruction
Comment
Text
CDATASection
Notation
Entity
Descendeni
Element,
Text,
Comment,
ProcessingInstruction,
CDATASection,
EntityReference
Text,
EntityReference
Element,
ProcessingInstruction,
Comment,
Text,
CDATASection,
EntityReference
Pentru fiecare tip de nod, DOM ofer o interfa care desemneaz constantele,
variabilele i metodele ce vor putea fi folosite de programator ntr-o implementare efectiv a modelului. Exist o serie de interfee fundamentale (e.g.,
Document, DocumentFragment, Node, NodeList sau Attr), plus diverse interfee extinse
pentru a suporta implementri avnd n vedere procesarea documentelor HTML
ori oferind faciliti adiionale.
n continuare, vom descrie succint o serie dintre interfeele puse la
dispoziie.
O interfa important este DocumentFragment care poate reprezenta un obiect-document minimal. Sunt numeroase situaiile n care nu trebuie lucrat cu
ntregul document, ci doar cu diverse fragmente ale sale. Arborele de noduri al
unui fragment de document este un sub-arbore al structurii de noduri a
documentului luat n ntregul lui. n funcie de necesiti, DocumentFragment poate
reprezenta o entitate XML, un element XML sau chiar un grup de elemente.
Interfaa Document reprezint un document XML, desemnnd conceptual
rdcina arborelui de noduri-obiecte ale documentului i oferind accesul la
informaiile coninute de acesta. Din moment ce elementele (marcatorii), nodurile
de tip text, comentariile, instruciunile de procesare nu pot exista n afara
contextului unui document, interfaa Document conine de asemenea metodele
necesare pentru a crea aceste categorii de obiecte.
FAMILIA XML
57
Interfaa Node definete un tip primar pentru ntregul model DOM, reprezentnd un anumit nod n cadrul arborelui asociat unui document. Atributele
nodeName , nodeValue i attributes sunt introduse ca mecanisme pentru
furnizarea informaiilor despre noduri fr conversie de tipuri (vizualizare
simplificat, nu una orientat-obiect). Fiecare nod va avea asociat o list
ordonat coninnd descendenii si, plus atribute specificnd nodul printe,
primul i ultimul nod copil, dac exist.
Ca metode prezentnd interes se pot meniona cele care manipuleaz nodurile
copil:
hasAttributes() ntoarce
curent;
58
SERVICII WEB
isSameNode() ntoarce
FAMILIA XML
59
Analizoare XML
Desigur, pentru prelucrarea documentelor XML va trebui s recurgem la un
analizor XML deja implementat n limbajul nostru preferat. Analizoarele XML
pot fi de dou tipuri:
analizoare fr validare, care vor procesa un document XML verificnd dac
acesta este bine formatat (adic respect regulile privind sintaxa i modul de
imbricare corect a tag-urilor);
analizoare cu validare, care vor realiza procesarea documentului XML prin
verificarea regulilor formale descrise de un DTD sau o schem ataate
acestuia (aceste analizoare sunt mai complexe).
Unul dintre cele mai cunoscute analizoare fr validare este Expat, disponibil
n regim open source. De asemenea, pot fi utilizate analizoarele cu posibiliti de
validare JAXP (Sun), JDOM, libxml (parte a proiectului GNOME), MSXML
(Microsoft) sau Xerces (Apache). Practic toate mediile de dezvoltare Web actuale
ofer posibiliti de validare a documentelor XML via DTD sau XML Schema
i diverse modaliti de procesare.
Referine
Apparao, V. et al. (eds.), Document Object Model (DOM) Level 1 Specification, W3C Recommendation, Boston, 1998: http://www.w3.org/TR/REC-DOM-Level-1
Biron, P., Malhotra, A. (eds.), XML Schema Part 2: Datatypes (Second Edition), W3C
Recommendation, Boston, 2004: http://www.w3.org/TR/xmlschema-2/
60
SERVICII WEB
Bray, T. et al. (eds.), Extensible Markup Language 1.0 (4 th Edition), W3C Recommendation,
Boston, 2006: http://www.w3.org/TR/xml
Bray, T. et al. (eds.), Extensible Markup Language 1.1 (2nd Edition), W3C Recommendation,
Boston, 2006: http://www.w3.org/TR/xml11
Bray, T. et al. (eds.), Namespaces in XML (2nd Edition), W3C Recommendation, Boston,
2006: http://www.w3.org/TR/REC-xml-names
Buraga, S., Tehnologii XML, Polirom, Iai, 2006: http://www.infoiasi.ro/~busaco/
books/xml/
Buraga, S. et al., Programare Web n bash i Perl, Polirom, Iai, 2002: http://www.infoiasi.ro/
~cgi/
Cowan, J., Tobin, R. (eds.), XML Information Set (Second Edition), W3C Recommendation,
Boston, 2004: http://www.w3.org/TR/xml-infoset
Daum, B., Merten, U., System Architecture with XML, Elsevier Science, 2003
Dick, K., XML: A Managers Guide (2nd Edition), Addison Wesley, 2002
Fallside, D., Walmsley, P., XML Schema Part 0: Primer Second Edition, W3C Recommendation, Boston, 2004: http://www.w3.org/TR/xmlschema-0/
Geroimenko, V., Dictionary of XML Technologies and the Semantic Web, Springer-Verlag,
2004
Harold, E., XML 1.1 Bible (3rd Edition), Wiley Publishing, 2004
Le Hors, A. et al. (eds.), Document Object Model (DOM) Level 2 Core Specification, W3C
Recommendation, Boston, 2000: http://www.w3.org/TR/DOM-Level-2-Core
Le Hors, A. et al. (eds.), Document Object Model (DOM) Level 3 Core Specification, W3C
Recommendation, Boston, 2004: http://www.w3.org/TR/DOM-Level-3-Core
Marini, J., The Document Object Model: Processing Structured Documents, McGraw-Hill, 2002
McLaughlin, B., Java & XML (3rd Edition), OReilly, 2006
* * *, Apache XML: http://xml.apache.org/
* * *, Caf con Lche: http://www.cafeconleche.org/
* * *, libxml: http://xmlsoft.org/
* * *, MSXML: http://msdn.microsoft.com/xml
* * *, Oxygen XML Editor: http://www.oxygenxml.com/
* * *, Suns XML Technologies: http://java.sun.com/xml
* * *, World Wide Web Consortium, Boston, 2006: http://www.w3.org/
* * *, XML Standards Library: http://xmlstds.xemantics.com/
* * *, ZVON: http://www.zvon.org/
Capitolul 3
1. Punerea problemei
Aa cum am menionat n primul capitol, modul de acces la un serviciu Web este
specificat printr-un set de documente care conin definiii, toate acestea constituind descrierea serviciului.
Asemenea documente pot fi vzute drept blocuri menite a furniza descrierea
unui serviciu Web, incluznd (a se urmri i figura 1):
definiia unui serviciu = abstract + concret (service definition = abstract +
concrete);
descrierea unui serviciu = definiia serviciului + definiii suplimentare (service
description = service definition + supplementary definitions).
S analizm fiecare dintre termenii de mai sus:
descrierea interfeei unui serviciu Web este independent de implementare i
este referit de termenul abstract. Informaiile despre implementarea i
localizarea serviciului Web constituie pri concrete ale documentului care
descrie serviciul. Termenii abstract i concret au fost introdui cu sensul
de mai sus de ctre Consoriul Web n specificaiile privind arhitectura
serviciilor;
definiia serviciului (service definition) este compus din definiiile interfeei
(abstracte) i definiiile implementrii (concrete);
descrierea unui serviciu (service description) const de obicei doar din definiia
serviciului, ns opional ea mai poate conine informaii suplimentare (de
exemplu, cum este conectat serviciul respectiv de alte servicii).
62
SERVICII WEB
Istoric
Specificaia WSDL iniial a luat natere n anul 2000, reprezentnd o fuziune a
dou limbaje de descriere a serviciilor: NASSL (Network Application Service
63
Caracterizare
Conceptual, un document WSDL reprezint un contract ntre o cerere i un
rspuns, similar modului cum o interfa Java reprezint un contract ntre
codul-client i un obiect, instan a unei clase Java. Diferena esenial este c
WSDL poate fi considerat o platform i, de asemenea, un limbaj de marcare,
care este folosit n principal pentru descrierea serviciilor Web accesate via SOAP.
n figura 2, putem observa cum WSDL, prin intermediul unor descrieri
standard, face posibil comunicarea la nivelul de integrare furnizat de serviciile
Web a se consulta i capitolele 6 i 7.
Cea mai potrivit cale de a nelege cum este descris un serviciu Web cu
ajutorul WSDL este de avea o privire de ansamblu asupra modelului su
conceptual i de a studia construciile care formeaz aceast descriere.
64
SERVICII WEB
Mesaje (messages)
Operaii (operation)
Interfa (interface)
Legare (binding)
Serviciu (service)
Punct terminal (endpoint)
Componentele WSDL
Pentru a descrie un serviciu Web, WSDL furnizeaz un set de componente i
proprieti asociate acestora.
Avem mai jos forma general a unui document WSDL:
<definitions targetNamespace="xs:anyURI">
<documentation>?
[<import> | <include>]*
<types>?
[<interface> | <binding> | <service>]*
</definitions>
Am folosit urmtoarele convenii: meta-caracterul ? desemneaz o construcie opional (elementul <documentation> poate, aadar, lipsi), caracterele
[ ] specific o grupare de alternative, numele de elemente fiind delimitate
de | (n cazul nostru, poate aprea fie marcatorul <import>, fie <include>).
Simbolul * specific zero, una, sau mai multe apariii (elementele <interface>,
<binding> ori <service> pot aprea de oricte ori dorim).
65
66
SERVICII WEB
67
Un element message poate conine unul sau mai muli parametri de intrare/
ieire care aparin operaiei. Fiecare element part definete un asemenea parametru. El furnizeaz o pereche nume-valoare mpreun cu un tip de data asociat.
Exemplul urmtor ilustreaz un bloc message avnd un singur marcator part.
<definitions>
<message name="ValidateSoapIn">
<part name="filename" type="xs:string">
68
SERVICII WEB
document.xml
</part>
</message>
</definitions>
69
70
SERVICII WEB
71
72
SERVICII WEB
<s:schema elementFormDefault="qualified"
targetNamespace="urn:Hello">
<s:element name="sayHello">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1"
name="name" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="sayHelloResponse">
<s:complexType>
<s:sequence>
</s:sequence>
</s:complexType>
</s:element>
<documentation xml:lang="ro">
Metoda de salut sayHello().
</documentation>
<soap:operation soapAction="urn:Hello/sayHello"
style="document" />
<input>
73
74
SERVICII WEB
<soap:address
location="http://localhost/salutari.asmx" />
</port>
</service>
</definitions>
75
Dup cum se poate observa, elementul definitions specific mai multe spaii de
nume care vor fi utilizate n acest document.
<?xml version="1.0" encoding="utf-8" ?>
<definitions
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:hs="urn:Hello"
xmlns:soapenc=
"http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tm=
"http://microsoft.com/wsdl/mime/textMatching/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
targetNamespace="urn:Hello"
xmlns="http://schemas.xmlsoap.org/wsdl/">
76
SERVICII WEB
Dac exist situaii n care metoda prezint mai multe argumente sau returneaz mai multe valori, atunci se specific mai multe elemente part corespunztoare.
Marcatorul portType definete o singur operaie, numit sayHello, avnd un
singur mesaj de intrare (sayHelloSoapIn) i un unic mesaj de ieire (sayHelloSoapOut).
<portType name="SalutariSoap">
<operation name="sayHello">
<documentation xml:lang="ro">
Metoda de salut sayHello().
</documentation>
77
78
SERVICII WEB
Figura 10. Invocarea automat a unui serviciu Web via un instrument specializat
79
Figura 11. Crearea unui apel de serviciu Web (Web Service Call)
prin utilizarea instrumentului Stylus
80
SERVICII WEB
81
Figura 13. Detalii privitoare la o metod oferit de serviciul Web dorit a fi invocat
Din acest moment suntem gata s realizm invocarea serviciului Web (folosim
butonul Send Request) a se vedea figura 14.
Mai multe detalii despre aceast aplicaie comercial putei gsi la adresa
http://www.stylusstudio.com/.
82
SERVICII WEB
Un alt instrument este XMLSpy care, pe lng alte faciliti oferite, poate fi
folosit pentru invocarea, editarea, vizualizarea i validarea documentelor WSDL.
S considerm un serviciu Web de generare a numerelor prime. Pentru a-l putea
invoca avem nevoie de documentul WSDL asociat, pe care l putem gsi la
adresa http://www50.brinkster.com/vbfacileinpt/np.asmx?wsdl.
XMLSpy permite invocarea rapid a serviciului Web numit Prime Numbers,
implementat n Visual Basic .NET, folosind acest document WSDL.
Figura 16. Crearea unei cereri SOAP de invocare a unui serviciu Web
83
84
SERVICII WEB
Figura 20. Pregtirea invocrii unui serviciu Web prin intermediul instrumentului WSDL
SOAP Analyser oferit de oXygen
Referine
Booth, D., Liu, C. (eds.), Web Services Description Language (WSDL) Version 2.0 Part 0:
Primer, W3C Candidate Recommendation, Boston, 2006: http://www.w3.org/TR/
wsdl20-primer
Buraga, S., Tehnologii XML, Polirom, Iai, 2006
Chinnici, R. et al. (eds.), Web Services Description Language (WSDL) Version 2.0 Part 1: Core
Language, W3C Candidate Recommendation, Boston, 2006: http://www.w3.org/
TR/wsdl20
Chinnici, R. et al. (eds.), Web Services Description Language (WSDL) Version 2.0 Part 2:
Adjuncts, W3C Candidate Recommendation, 2006: http://www.w3.org/TR/
wsdl20-adjuncts
Christensen, E. et al., Web Services Description Language (WSDL) 1.1, W3C Note, Boston,
2001: http://www.w3.org/TR/wsdl
Jorgensen, D., Developing .NET Web Services with XML, Syngress Publishing, 2002
Haas, H., Brown, A. (eds.), Web Services Glossary, W3C Working Draft, Boston, 2003:
http://www.w3.org/TR/ws-gloss/
Weerawarana, S. et al., Web Services Platform Architecture, Prentice Hall PTR, 2004
* * *, Altova XMLSpy: http://www.altova.com/
* * *, Apache XML: http://xml.apache.org/
* * *, IBM Developers Site: http://www.ibm.com/developer/
* * *, oXygen XML Editor: http://www.oxygenxml.com/
* * *, Portal dedicat serviciilor Web: http://www.webservices.org/
* * *, Stylus Studio: http://www.stylusstudio.com/
* * *, Wsdlpull: http://freshmeat.net/projects/wsdlpull/
* * *, WSDL Verify: http://apps.gotdotnet.com/xws/wsdlverifier/wsdlverify.asmx
* * *, XML.com: http://xml.com/
* * *, ZVON: http://www.zvon.org/
85
Capitolul 4
Protocolul SOAP
Totul ar trebui s fie ct mai simplu cu putin,
ns nu mai simplu de att.
(Albert Einstein)
88
SERVICII WEB
PROTOCOLUL SOAP
89
Dac nu apar erori, se ntoarce codul de stare 200 OK. Valoarea cmpului de
antet Content-Type este text/xml, deoarece rspunsul este i el un document XML.
Cmpul Content-Length trebuie s fie prezent i s aib o valoare corect.
Corpul mesajului este o structur XML <methodResponse>, care conine un
singur parametru <params> cu un unic element-copil <param>. Acesta, la rndul
lui, include o singur valoare <value>.
Elementul <methodResponse> putea conine, de asemenea, marcatorul <fault>
avnd sub-elementul <value>, ce reprezint un <struct> compus din dou
elemente: primul este <faultCode>, de tip <int>, iar cellalt este numit <faultString>
i este de tip <string>. Elementul <fault> indic apariia unei excepii XML-RPC,
serverul ntorcnd codul acesteia i un mesaj explicativ.
De notat c <methodResponse> poate conine fie <fault>, fie <params>, dar nu
pe ambele simultan.
Pentru cererea anterioar putem avea i urmtoarea variant de rspuns,
indicnd o excepie referitoare la furnizarea unui numr prea mare de parametri
de intrare:
90
SERVICII WEB
HTTP/1.1 200 OK
Connection: close
Content-Length: 426
Content-Type: text/xml
Date: Mon, 20 Feb 2006 19:33:09 GMT
Server: Test/3.2-WinXP
<?xml version="1.0"?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value><int>4</int></value>
</member>
<member>
<name>faultString</name>
<value>
<string>Too many parameters.</string>
</value>
</member>
</struct>
</value>
</fault>
</methodResponse>
Datorit simplitii sale, XML a fost acceptat pe scar larg. Astfel, XML-RPC
poate fi folosit n cadrul programelor Perl, Java, Python, C, C++, PHP i multe alte
limbaje. Implementrile sunt disponibile pentru majoritatea sistemelor de operare.
Un exemplu de aplicaie Web scris n PHP i utiliznd XML-RPC este oferit n
cadrul lucrrii lui Sabin Buraga (coord.), Aplicaii Web la cheie, Polirom, Iai, 2003.
PROTOCOLUL SOAP
91
astfel de necesitate constituie un serios handicap, care a fost depit de protocoalele din a doua generaie prin utilizarea spaiilor de nume XML.
A dou mare problem este legat de tipurile de date. Aceste protocoale
foloseau un singur DTD (Document Type Definition) pentru a descrie reprezentarea
serializat a datelor. n general se utilizau doar cteva tipuri de date simple XML.
Aceast abordare a permis multor instrumente s ofere suport acestor protocoale.
Dificultatea care a aprut ulterior a fost aceea c datele din mesaje erau exprimate
sintactic i nu semantic. Protocoalele din a doua generaie folosesc structurile i
bogatele tipuri de date din XML Schema.
92
SERVICII WEB
PROTOCOLUL SOAP
93
Apare ntrebarea: care este codificarea corect? Rspunsul: este corect cea pe
care aplicaia o ateapt. Cu alte cuvinte, nu este suficient s afirmm c serverul
i clientul folosesc XML pentru a realiza schimbul de informaii. Trebuie s
definim tipul datelor interschimbate, maniera de modelare a datelor n XML,
mecanismul de transmitere a informaiei, folosind la nivel mai sczut
protocoalele Internet existente.
Fr aceste convenii, programele nu pot cunoate modul de decodificare a
datelor pe care le primesc, chiar dac sunt reprezentate cu ajutorul XML. SOAP
este cel care furnizeaz aceste convenii.
Arhitectura general SOAP (despre care vom discuta n detaliu n cadrul
subcapitolelor urmtoare) este surprins n figura 2.
Un mesaj SOAP const dintr-un document XML al crui element-rdcin
are denumirea de plic (envelope). n interiorul mesajului ntlnim dou elemente-copil cunoscute ca antet (header) i corp (body), similar mesajelor transmise prin
pot. Informaiile privind modul de interaciune cu aplicaiile sunt plasate n
interiorul corpului, iar n cadrul antetului se gsesc informaii despre destinatar,
despre entitatea care va avea posibilitatea modificrii mesajului respectiv etc.
n acest capitol, vom prezenta o serie de exemple de mesaje SOAP sub form
de documente XML. Specificaiile SOAP se refer la un mesaj SOAP ca fiind
specificat formal printr-un XML Infoset (vezi capitolul 2), descriere abstract a
coninutului su. Cititorii interesai de astfel de aspecte (de exemplu, asocierea
SOAP cu alte protocoale, caz n care mesajele pot avea reprezentri diferite) le
pot gsi n rapoartele tehnice furnizate de Consoriul Web.
94
SERVICII WEB
PROTOCOLUL SOAP
95
96
SERVICII WEB
PROTOCOLUL SOAP
97
prin mai multe etape de transformri. Anumii handler-i (noduri intermediare) pot
modifica antetul mesajului. Altfel spus, dac revenim la analogia mesaj SOAP
plic, e uor s ne imaginm cum acesta ajunge s fie adus de un pota la
destinaie, dar nainte de aceasta a trecut prin mai muli intermediari (societi
de transport, oficii potale etc.) care l-ar fi putut modifica. Aceste modificri
sunt realizate doar la exteriorul plicului (de exemplu, diverse tampilri), coninutul lui rmnnd intact pn ajunge la destinatar.
98
SERVICII WEB
PROTOCOLUL SOAP
99
"http://tranzactie.portocale.info/enc"
env:role=
"http://www.w3.org/2002/06/soapenvelope/role/ultimateReceiver"
env:mustUnderstand="true">
tranz10-01
</tz:tranzactie-id>
</env:Header>
<env:Body xmlns:p="http://www.portocale.info/">
<p:portocale>
<!-- partea de achiziie de portocale -->
<p:achizitii env:encodingStyle=
"http://www.w3.org/2002/06/soap-encoding">
<p:tip>Portocale greceti fr coaj</p:tip>
<p:cod>P10-01-GR</p:cod>
<p:cantit p:um="kg">3374</p:cantit>
</p:achizitii>
<!-- partea de vnzri de portocale -->
<p:vanzari>
<p:tip>Portocale japoneze albastre</p:tip>
<p:cod>P10-03-JP</p:cod>
<p:cantit p:um="kg">0107</p:cantit>
</p:vanzari>
</p:portocale>
</env:Body>
</env:Envelope>
Dac urmrim structura acestui mesaj, observm c respect modelul prezentat n figura 2. Mesajul din exemplul nostru conine un singur bloc-antet, iar
n corp ntlnim dou elemente (care vor fi utilizate de destinatarul final). Att
elementul Header, ct i Body sunt copiii marcatorului Envelope care, de fapt, joac
rolul unui container de date.
100
SERVICII WEB
<env:Header>
...
</env:Header>
<!-- un singur element Body (obligatoriu) -->
<env:Body xmlns:p="http://www.portocale.info/">
...
</env:Body>
</env:Envelope>
Fiecare bloc antet trebuie s aib asociat un spaiu de nume calificat (n acord
cu regulile din SOAP Schema). Modul de codificare a datelor se realizeaz prin
intermediul atributului encodingStyle, iar nodul care trebuie s-l proceseze se specific
PROTOCOLUL SOAP
101
Atributul role
Atributul role controleaz nodul SOAP (l vom numi nod-int) care va putea
procesa unul sau mai multe blocuri antet. Atributul role conine un URI care
identific rolul pe care l va juca nodul-int. Atunci cnd un nod primete un
mesaj incluznd blocuri antet, el trebuie s verifice aceste blocuri pentru a
determina dac exist unul pe care-l poate prelucra.
Dei unui atribut role i se poate asocia orice URI, specificaia SOAP a
prevzut trei situaii standard:
http://www.w3.org/2002/06/soap-envelope/role/none n acest caz, nici un nod
SOAP nu ar trebui s ncerce s proceseze respectivul bloc antet, dei alte
blocuri antet pot conine referine la el i la coninutul su;
http://www.w3.org/2002/06/soap-envelope/role/next n aceast circumstan,
fiecare nod trebuie s recunoasc faptul c respectivul bloc antet trebuie
trimis intact urmtorului nod SOAP (din cadrul rutei de transport a mesajului);
http://www.w3.org/2002/06/soap-envelope/role/ultimateReceiver n acest caz, blocurile antet ce conin atributul role cu acest URI asociat (sau cele care nu au
atributul role) vor fi procesate doar de ctre destinatarul final.
n exemplul dat mai sus, atributul role are ca valoare URI-ul http://www.w3.org/
2002/06/soap-envelope/role/ultimateReceiver, ceea ce nseamn c destinatarul ultim
este cel care va putea procesa acest antet. Acest ultim nod (pe care se gsete
mcar un serviciu Web), trebuie s fie capabil s proceseze coninutul mesajului
(inclus n elementul Body).
Atributul mustUnderstand
Dac atributul mustUnderstand are valoarea true, atunci nodul care primete mesajul
trebuie s-l poat procesa sau s emit un mesaj de eroare corespunztor n caz
contrar. Blocurile antet care conin mustUnderstand="true" sunt cunoscute
sub numele de blocuri antet obligatorii. Anteturile care nu au specificat atributul
mustUnderstand sunt totui examinate de nodurile-int.
102
SERVICII WEB
Atributul encodingStyle
Atributul encodingStyle este folosit pentru a declara modul prin care coninutul
unui bloc antet a fost creat. Aceast informaie permite nodurilor care interacioneaz cu acel mesaj s poat decodifica informaiile pe care le conine.
SOAP permite mai multe scheme de codificare, dar furnizeaz i o schem
proprie.
Deoarece acest atribut este utilizat i n corpul mesajului, vom discuta mai
multe despre el n cadrul seciunii 5.4.
Atributul relay
n SOAP 1.2, pentru blocurile antet este definit i atributul opional relay, cu
valori de tip boolean. Acest atribut specific dac un bloc antet poate fi transmis
mai departe, n cazul n care nodul intermediar care trebuia s-l proceseze nu a
realizat acest lucru. Exist precizat regula conform creia un bloc antet care a
fost deja prelucrat trebuie ters.
Sunt situaii n care proiectantul unui aplicaii ar dori s introduc noi faciliti
n aplicaie cu ajutorul unor blocuri antet. Un astfel de bloc antet va putea fi
procesat de nodurile intermediare care l neleg i va fi ignorat de celelalte. n
mod evident, facilitatea nou aprut nu a fost implementat de toate nodurile
SOAP. Astfel, pentru a evita situaiile n care un nod SOAP nu recunoate acel
bloc antet i genereaz o eroare, se va preciza env:mustUnderstand="false" .
Suplimentar, pentru a mpiedica aplicarea regulii implicite a mecanismului de
procesare, blocul antet va avea asociat i atributul env:relay= "true" (blocul
nu va fi eliminat).
Exemplul urmtor prezint utilizarea atributului relay:
<?xml version="1.0" ?>
<env:Envelope
xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header>
<a:firstQuestion
xmlns:a="http://www.intrebare.ro"
env:role="http://www.intrebare.ro/Log"
PROTOCOLUL SOAP
103
env:mustUnderstand="true">
...
</a:firstQuestion>
<b:secondQuestion
xmlns:b="http://www.intrebare.ro"
env:role="http://www.w3.org/2003/05/
soap-envelope/role/next"
env:relay="true">
...
</b:secondQuestion>
<c:thirdQuestion
xmlns:c="http://www.intrebare.ro">
...
</c:thirdQuestion>
</env:Header>
<env:Body>...</env:Body>
</env:Envelope>
104
SERVICII WEB
n acelai mesaj SOAP pot exista mai multe apariii ale blocului Representation.
S urmrim urmtorul exemplu:.
<soap:Envelope
xmlns:soap='http://www.w3.org/2003/05/soap-envelope'
xmlns:rep='http://www.w3.org/2004/08/representation'
xmlns:xmlmime='http://www.w3.org/2004/11/xmlmime'>
<soap:Header>
<rep:Representation resource=
'http://www.infoiasi.ro/~adria/foto.jpg'>
<rep:Data xmlmime:contentType=
'image/jpg'>/aWKKapGGyQ=</rep:Data>
</rep:Representation>
</soap:Header>
<soap:Body>
<a:Persoana
xmlns:a='http://www.infoiasi.ro/~adria/mystuff'>
<a:nume>Alboaie Lenua</a:nume>
<a:foto
uri='http://www.infoiasi.ro/~adria/me.jpg' />
</a:Persoana>
</soap:Body>
</soap:Envelope>
PROTOCOLUL SOAP
105
106
SERVICII WEB
<env:Detail>
<err:DetaliiEroare xmlns:err=
"http://www.portocale.info/fault">
<err:codAchizitInvalid>
<p:cod>P10-01-GR</p:cod>
</err:codAchizitInvalid>
</err:DetaliiEroare>
</env:Detail>
</env:Fault>
</env:Body>
</env:Envelope>
Elementul Subcode include elementul Value, care ofer informaii despre erorile
specifice aplicaiei respective (se folosete spaiul de nume definit de dezvoltatorul
acelei aplicaii).
<env:Subcode>
<env:Value>p:cod_incorect</env:Value>
</env:Subcode>
Descriere
Version Mismatch
MustUnderstand
PROTOCOLUL SOAP
107
Cod de eroare
Descriere
DataEncodingUnknown
Sender
Receiver
Server
Dei nu-l gsim n exemplul nostru, elementul Subcode determin ca mecanismul de tratare a erorilor n SOAP s fie extensibil. Astfel, Code conine un
sub-element obligatoriu Value i unul opional Subcode, care poate la rndul lui s
includ alte marcaje Subcode.
Elementul Reason asociat lui Code este utilizat pentru a furniza o explicaie n
limbaj natural. n exemplul nostru, avem un mesaj emis n limba englez: The
specified product does not exist (Produsul specificat nu exist). Instrumentele
SOAP folosesc adesea coninutul elementului Reason atunci cnd semnaleaz
erori, astfel nct activitatea de depanare s decurg mai uor.
Elementul opional Node furnizeaz informaia despre nodul din calea de
mesaje care a generat eroarea. Coninutul marcatorului Node va fi URI-ul acelui nod.
n exemplul de mai sus nu exist specificat Node, deoarece entitatea care a generat
eroarea a fost ultimul destinatar i, evident, emitorul cunoate URI-ul su.
Elementul Node este completat de marcatorul opional Role, care furnizeaz
informaii despre ceea ce realiza nodul atunci cnd a euat. Coninutul elementului Role este de obicei un URI identificnd operaia (de obicei, un serviciu
Web) cauzatoare a erorii. Partea responsabil cu rezolvarea erorilor poate
determina ce poriune a aplicaiei a funcionat greit. Putem observa, deci, c
elementele Node i Role sunt utile pentru detectarea cu uurin a erorilor care
pot aprea.
108
SERVICII WEB
PROTOCOLUL SOAP
109
Se poate remarca faptul c tipurile de date SOAP sunt de fapt cele specificate
de recomandarea XML Schema a Consoriului Web.
Pentru cazul compound value, o valoare e constituit din mai multe elemente
componente ntre care exist o relaie. Elementele componente care formeaz o
astfel de valoare compus pot fi accesate prin diverse metode precum: indicarea
poziiei n secvena de valori (s ne imaginm cum accesm un element pe baza
indexului, atunci cnd folosim un tablou), utiliznd o cheie (ca n cazul tablourilor
asociative hash tables) sau recurgnd la numele elementului respectiv (similar
structurilor din C). Un astfel de mecanism este cunoscut sub numele de accesor
(accessor).
Un exemplu n care se folosesc valori compuse (vom face din nou o paralel
cu anumite tipuri de date din Java) este urmtorul:
int[3] Stoc = {10, 74, 33}; // tablou de numere
<Stoc xsi:type="SOAP-ENC:Array"
SOAP-ENC:arrayType="xsd:int[3]">
<val>10</val>
<val>74</val>
<val>33</val>
</Stoc>
class Produs // o clas cu doi membri-dat
{
public int cantit = 33;
public java.lang.String sortim = "Portocale";
}
Produs produs = new Produs();
<Produs>
<cantit xsi:type="xsd:int">33</cantit>
<sortim xsi:type="xsd:string">Portocale</sortim>
</Produs>
n acest exemplu, sunt folosii accesori ordinali pentru obinerea valorilor din
variabila de tip tablou Stoc.
110
SERVICII WEB
Prin intermediul atributelor id i href, SOAP definete accesori de tip single-referenced sau multi-referenced. Un accesor simplu-refereniat (single-referenced) nu
posed o identitate, exceptnd cazul n care este element-copil al altui element.
n exemplul urmtor, <adresa> reprezint un accesor de tip single-referenced:
<persoana>
<identitate nume="Blue Ory">
<adresa>
<strada>Portocalelor</strada>
<localit>Iai</localit>
<tara>Romnia</tara>
</adresa>
</identitate>
</persoana>
PROTOCOLUL SOAP
111
<membru>
<prenume>Ory</prenume>
<nume>Blue</nume>
</membru>
<membru>
<prenume>Grappy</prenume>
<nume>Blue</nume>
</membru>
<membru>
<prenume>Kiwy</prenume>
<nume>Blue</nume>
</membru>
...
112
SERVICII WEB
Tipuri de date
Dup cum probabil deja cititorii avizai au remarcat, tipurile de date suportate de
codificarea SOAP sunt definite n specificaiile XML Schema: Datatypes (a se
revedea capitolul 2).
Pot fi folosite tipurile elementare ca int, float, string, enumerri, iruri de octei
etc., plus tipurile derivate din acestea.
Vom face mai jos o trecere rapid n revist a acestor tipuri, lsnd la
latitudinea cititorului aprofundarea amnuntelor.
String
Tipul de date string este definit de recomandarea XML Schema. De remarcat c
acest tip string nu este identic cu tipul string ntlnit n alte limbaje de programare.
PROTOCOLUL SOAP
113
n mod particular, interzice apariia unei serii de caractere pe care acele limbaje
le permit (sunt caracterele rezervate din XML, precum <, > ori &). Un
string poate fi codificat ca single-referenced sau multiple-referenced.
n exemplul de mai jos, Portocale cu blan reprezint o valoare elementar.
<string>Portocale cu blan</string>
Enumerare
Specificaia XML Schema: Datatypes definete un mecanism numit enumerare
(enumeration). Modelul SOAP l adopt n mod direct. Limbajele de programare
definesc tipul enumerare ntr-un mod diferit. n cazul SOAP, enumeration luat
drept concept indic un set distinct de nume. O enumerare particular
reprezint o list de valori distincte, apropiate, bazate pe acelai tip. De exemplu,
(1, 3, 5) este o enumerare posibil bazat pe tipul integer. Sunt suportate
enumerrile pentru toate tipurile simple, exceptnd tipul boolean.
Fie urmtoarea schem reprezentarea grafic a acesteia este dat n figura 7:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="lotPortocale" type="xs:int" />
<xs:element name="greutate" type="xs:float" />
<xs:element name="culoare">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Oranj" />
<xs:enumeration value="Galben" />
<xs:enumeration value="Albastru" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:schema>
114
SERVICII WEB
ir de octei
Dei n multe limbaje de programare irurile de caractere (string) sunt privite ca
fiind iruri de octei, n SOAP lucrurile stau diferit. Un string este reprezentat cu
ajutorului tipului de dat string. Astfel, dac avei la dispoziie o colecie de octei
care nu reprezint un string (de exemplu, coninutul binar al unei imagini ori al
unui fiier executabil), atunci aceti octei trebuie transformai cu algoritmul de
codificare base64 descris n specificaia XML Schema.
Un exemplu de codificare base64 a unui ir de octei este urmtorul:
<imagine xsi:type="SOAP-ENC:base64">
hsgajTYUTUgsjaguuwq1jgds33ds
</imagine>
PROTOCOLUL SOAP
115
116
SERVICII WEB
PROTOCOLUL SOAP
117
118
SERVICII WEB
Dup cum se remarc n figura 10, handler-ul aflat pe serverul SOAP este cel
care ofer posibilitatea de nelegere a mesajelor care sunt codificate cu o alt
schem, diferit de cea implicit, pus la dispoziie de protocolul SOAP.
PROTOCOLUL SOAP
119
120
SERVICII WEB
PROTOCOLUL SOAP
121
122
SERVICII WEB
PROTOCOLUL SOAP
123
From: admin@axiologic.ro
To: admin@portocale.info
Subject: Contract
Date: Fri, 29 Dec 2006 18:33:00 EST
Message-Id: <M56721-9MGHGJS5757@axiologic.ro>
Content-Type: application/soap+xml
<?xml version='1.0' ?>
<env:Envelope
xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header>
<p:contract
xmlns:p="http://www.portocale.info/contracts"
env:role=
"http://www.w3.org/2003/05/soap-envelope/role/next"
env:mustUnderstand="true">
<p:reference>
uuid:A292310-S238787-S398298
</reference>
<p:dateAndTime>
2006-12-29T18:33:00.000-05:00
</p:dateAndTime>
</p:contract>
...
</env:Header>
<env:Body>
...
</env:Body>
</env:Envelope>
124
SERVICII WEB
<env:Header>
<p:contract
xmlns:p="http://www.portocale.info/contracts"
env:role=
"http://www.w3.org/2003/05/soap-envelope/role/next"
env:mustUnderstand="true">
<p:reference>
uuid:A292310-S238787-S398298
</p:reference>
<p:dateAndTime>
2006-12-29T18:45:07.000-05:00
</p:dateAndTime>
</p:contract>
...
</env:Header>
<env:Body>
...
</env:Body>
</env:Envelope>
PROTOCOLUL SOAP
125
126
SERVICII WEB
// Implementarea clientului
// Implementarea serviciului
class Banca {
Clientul interacioneaz cu serviciul printr-o clas ciot (numit stub sau proxy)
purtnd numele de Banca, generat uzual n mod automat de ctre un instrument
(putei scrie i manual propriul dumneavoastr stub). Cu ajutorul acestei clase se
faciliteaz mpachetarea i despachetarea datelor aplicaiei n/din mesaje SOAP
RPC.
Liniile de mai jos semnific o cerere SOAP RPC de la un client ctre un
serviciu Web:
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope
xmlns:env="http://www.w3.org/2002/06/soap-envelope">
<env:Body>
<b:deschideCont env:encodingStyle=
PROTOCOLUL SOAP
127
"http://www.w3.org/2002/06/soap-encoding"
xmlns:b="http://banca.ex.ro/cont"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance">
<b:tip xsi:type="xs:string">Firma</b:tip>
<b:denumire xsi:type="xs:string">
Axiologic Research S.R.L.
</b:denumire>
<b:sitWeb xsi:type="xs:string">
http://www.axiologic.ro
</b:sitWeb>
</b:deschideCont>
</env:Body>
</env:Envelope>
Dup cum se poate remarca, nu este nimic surprinztor ntr-un mesaj SOAP
RPC. Respectnd specificaiile, coninutul este inclus ntr-un element Body.
Facem observaia c n exemplul nostru nu avem blocuri antet, care nu ne sunt
utile n acest caz, dar SOAP RPC nu exclude astfel de elemente.
Revenind la exemplu, vedem c numele elementului deschideCont e identic cu
numele metodei care va fi apelat de serviciul Web. Coninutul marcatorului
b:deschideCont va corespunde parametrilor metodei deschideCont() prezentat n
figura de mai sus. Suplimentar, se va mai aduga atributul xsi:type necesar
destinatarilor mesajului pentru a converti coninutul fiecrui parametru conform
tipurilor de date corespunztoare limbajului de programare ce implementeaz
serviciul Web n cauz.
Rspunsul la cerere respect un set mai complex de reguli i convenii:
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope
xmlns:env="http://www.w3.org/2002/06/soap-envelope">
<env:Body>
<b:deschideContResponse
env:encodingStyle=
"http://www.w3.org/2002/06/soap-encoding"
xmlns:rpc="http://www.w3.org/2002/06/soap-rpc"
xmlns:b="http://banca.ex.ro/cont"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance">
<rpc:result>b:nrCont</rpc:result>
<b:nrCont xsi:type="xsd:int">
56291527
</b:nrCont>
128
SERVICII WEB
</b:deschideContResponse>
</env:Body>
</env:Envelope>
PROTOCOLUL SOAP
129
n exemplul de mai jos avem un caz n care a aprut o eroare SOAP RPC.
Aceast situaie este rezultatul unei cereri construite incorect (nu s-a transmis un
parametru). Serviciul Web trimite un mesaj de rspuns n care se poate depista
cauza apariiei erorii. Se observ c ne regsim n ultimul caz expus n tabelul de
mai sus, n care mesajul de rspuns specific faptul c a aprut o eroare generat
de emitor (<env:Value>env:Sender </env:Value>) i care s-a datorat
trimiterii unui numr nepotrivit de parametri (<env:Value>rpc:BadArguments
</env:Value>).
<env:Envelope
xmlns:env="http://www.w3.org/2002/06/soap-envelope"
xmlns:rpc="http://www.w3.org/2002/06/soap-rpc">
<env:Body>
<env:Fault>
<env:Code>
<env:Value>env:Sender</env:Value>
<env:Subcode>
<env:Value>rpc:BadArguments</env:Value>
</env:Subcode>
</env:Code>
<env:Reason xml:lang="ro">
Lipsete parametrul "tip".
</env:Reason>
</env:Fault>
</env:Body>
</env:Envelope>
130
SERVICII WEB
8. Versiuni SOAP
O observaie interesant despre SOAP este aceea c elementul Envelope nu
expune o versiune explicit a protocolului, aa cum fac alte protocoale un
exemplu este HTTP (e.g., HTTP/1.0 versus HTTP/1.1), iar un altul este WDDX
(<wddxPacket version="1.0">...</wddxPacket>).
Proiectanii protocolului SOAP au ales cu bun tiin aceast variant,
deoarece s-a observat c suportul oferit de numrul versiunii este destul de fragil.
Astfel, s-a apelat la utilizarea spaiilor de nume XML: versiunea protocolului
este indicat de URI-ul spaiului de nume corespunztor elementului Envelope.
Motoarele de cutare/regsire a serviciilor Web vor cunoate cum s trateze
diferite mesaje SOAP cu care ar putea intra n contact conform urmtoarelor
reguli:
dac mesajul are o versiune similar cu aceea utilizat de aplicaie, atunci
mesajul se va putea procesa;
dac mesajul are o versiune mai veche dect orice versiune pe care aplicaia
tie s o proceseze, atunci pot avea loc dou aciuni: se genereaz o eroare de
tipul Version Mismatch i/sau se trimit clientului informaii legate de versiunile
pe care le poate accepta;
dac mesajul are o versiune mai nou dect toate versiunile pe care programul
n cauz tie s le prelucreze, atunci se poate alege procesarea mesajului (ceea
ce nu este ntotdeauna o soluie bun) sau se poate ncerca s se trimit
clientului informaii privitoare la versiunile pe care le suport.
Pe ansamblu, mecanismul versiunilor bazate pe URI-uri ofer o mare flexibilitate i adaug o mai mare putere de conciliere ntre aplicaii n cazul apariiei
mesajelor cu versiuni diferite.
9. Intermediarii SOAP
SOAP se caracterizeaz prin extensibilitate. Apare o extensibilitate pe vertical
care este conferit de anteturile SOAP. Mai exact, extensibilitatea vertical se
refer la capacitatea de a introduce noi informaii n cadrul mesajelor SOAP.
Exist i o extensibilitate orizontal care se refer la posibilitatea ca diferite
pri dintr-un mesaj s poat fi procesate de noduri diferite. Aceast extensibilitate
orizontal este furnizat de ctre intermediarii SOAP.
PROTOCOLUL SOAP
131
132
SERVICII WEB
Tipuri de intermediari
SOAP ofer soluii flexibile la trei din cele mai importante probleme legate de
nodurile intermediare, rspunznd la urmtoarele ntrebri:
Cum se pot transmite intermediarilor informaiile necesare?
Cum se poate identifica entitatea care proceseaz datele i ce anume proceseaz?
Ce se ntmpl cu informaia prelucrat de intermediari?
Exist dou tipuri de intermediari:
care doar retransmit mesajul primit (forwarding intermediaries);
care modific i apoi retransmit mesajul (active intermediaries).
Intermediarii din prima categorie pot realiza urmtoarele operaii:
terg toate blocurile antet procesate;
elimin toate blocurile antet care nu mai pot fi retrimise i care au fost
ignorate atunci cnd un nod-int a procesat mesajul;
pstreaz toate blocurile antet care pot fi retransmise i care nu au fost
procesate de nodurile-int.
Intermediarii activi ndeplinesc diferite aciuni care pot modifica traseul
mesajului SOAP (uneori n moduri care nu sunt descrise n blocurile antet ale
mesajului). Ca exemple de astfel de aciuni putem meniona apelul unor servicii
de securitate, invocarea unor servicii care manipuleaz coninutul mesajului etc.
Aciunile pe care un astfel de intermediar le efectueaz trebuie s poat fi
detectate de nodurile care vor primi mesajul.
Facem observaia c informaia destinat nodurilor intermediare (care se
gsete n antet) nu are n general nici o legtur cu informaia coninut n
corpul mesajului.
PROTOCOLUL SOAP
133
SOAP 1.2
<Envelope>
<Header>
Zero sau mai multe blocuri
antet
</Header>
<Body>
Corpul mesajului
</Body>
</Envelope>
134
SERVICII WEB
<e:Code>
<e:Value>e:MustUnderstand</e:Value>
</e:Code>
</e:Fault>
</e:Body>
</e:Envelope>
n SOAP 1.1 se ntoarce codul de eroare, dar nici un alt detaliu. De asemenea,
n SOAP 1.2 atributul mustUnderstand ia valorile logice true sau false, n timp ce n
SOAP 1.1 valorile permise erau 0 sau 1.
Versiunea 1.2 a nlocuit atributul actor cu atributul role, n esen semantica lor
fiind asemntoare.
n SOAP 1.2, actorului Next din SOAP 1.1 i s-au ataat nc dou opiuni:
None pentru blocurile antet care nu vor fi niciodat procesate n mod direct;
Ultimate Receiver pentru blocurile antet care vor fi procesate de nodul
destinatar final.
faultstring
faultactor
detail
SOAP 1.2
Fault
Code
Subcode
Value
Reason
Node
Role
Detail
PROTOCOLUL SOAP
SOAP 1.1
<e:Fault>
<faultcode>
e:Server.Memory
</faultcode>
<faultstring>
Out of memory.
</faultstring>
</e:Fault>
135
SOAP 1.2
<e:Fault>
<e:Code>
<e:Value>
e:Receiver
</e:Value>
<e:Subcode>
<e:Value>
Memory
</e:Value>
</e:Subcode>
</e:Code>
<e:Reason>
Out of memory.
</e:Reason>
</e:Fault>
Modelul de procesare
SOAP 1.2 clarific modelul de procesare din SOAP 1.1. Astfel, un nod SOAP
trebuie s proceseze un mesaj respectnd urmtoarele reguli, n aceast ordine:
determinarea rolului pe care l are de jucat. Modalitatea de procesare
depinde de valorile atributului role;
identificarea antetelor obligatorii corespunztoare nodului-int. Astfel, dac
antetul este marcat cu atributul mustUnderstand="true" i atributul role are
o valoare care se potrivete cu nodul-int, atunci acesta e obligat s proceseze
acel bloc antet;
generarea erorii MustUnderstand, dac unul sau mai multe anteturi nu sunt
nelese; aceasta se ntmpl n cazul n care nodul nu conine software-ul
potrivit pentru procesarea antetului;
procesarea antetelor, iar dac nodul este destinatarul final prelucrarea, de
asemenea, a corpului mesajului.
dac exist un nod intermediar, acesta va terge partea din antet care i era
destinat i va retrimite mesajul.
Mecanismul versiunilor
n SOAP 1.2 s-au adugat noi semantici pentru a putea lucra cu mesaje SOAP
de versiuni diferite.
Un nod SOAP 1.2 care primete un mesaj SOAP 1.1 va rspunde cu un
mesaj SOAP 1.1 care conine eroarea SOAP 1.1 Version Mismatch.
136
SERVICII WEB
SOAP 1.2
<e:Carti>
<e:Carte>
<titlu>Proiectarea
siturilor Web</titlu>
<autor
id="SabinBuraga">
<nume>
Sabin Buraga
</nume>
</autor>
</e:Carte>
<e:Carte>
<titlu>Tehnologii
XML</titlu>
<autor
ref="SabinBuraga"
/>
</e:Carte>
</e:Carti>
PROTOCOLUL SOAP
137
Elementele din schema de codificare SOAP difer ntre SOAP 1.1 i SOAP
1.2, dup cum se poate remarca din tabelul de mai jos:
SOAP 1.1
Atribut
Tip
Exemplu
SOAP 1.2
href
ref
uri-reference
IDREF
#SabinBuraga
http://www.sit.ro/csb.gif
SabinBuraga
SOAP 1.2
<numere
enc:itemType="xs:int"
enc:arraySize="2">
<numar>29</numar>
<numar>10</numar>
</numere>
Specificaia SOAP 1.1 include atributul root care poate fi utilizat pentru a
marca rdcina schemei/grafului de codificare. n SOAP 1.2 acest atribut este
eliminat.
n SOAP 1.2 omiterea unui accesor este echivalent cu NIL. Semantica
accesorului NIL este ns dependent de aplicaie.
Mecanismul RPC
SOAP 1.1 ofer un model de implementare care const n existena unui nod
destinatar SOAP dat sub forma unui URI, iar n cererea SOAP se regsete
logica aplicaiei. O astfel de abordare implic ascunderea sub umbrela unui
URI a tuturor resurselor care pot fi oferite de un nod, mpiedicndu-se astfel
accesarea individual a fiecrei resurse dorite.
S revenim la exemplul nostru cu portocale i s considerm c firma cu
situl www.portocale.info ofer servicii precum: aflarea preului unui anumit sortiment de portocale, obinerea datelor privind ofertele promoionale etc. Dac
aceste servicii ar fi plasate sub acelai URI, ele ar fi efectiv ascunse. O astfel
de abordare reduce Web-ul la un nivel de transport i neag caracterul robust
i scalabil al arhitecturii spaiului WWW (n stilul REST amintit n primul
capitol).
138
SERVICII WEB
PROTOCOLUL SOAP
139
</a:adunaNumere>
</e:Body>
</e:Envelope>
SOAP 1.2
<e:Body>
<b:deschideContResponse>
<rpc:result>
b:nrCont
</rpc:result>
<b:nrCont>
56291527
</b:nrCont>
</b:deschideContResponse>
</e:Body>
Legtura cu HTTP
Vom prezenta n rndurile urmtoare diferenele ntre legtura HTTP cu SOAP
1.1, respectiv cu SOAP 1.2. Tipul text/xml folosit n SOAP 1.1 a fost nlocuit n
versiunea 1.2 cu application/soap+xml.
n SOAP 1.1 s-a pus problema folosirii doar a metodei POST pentru
transportul mesajelor SOAP via HTTP. Versiunea 1.2 ofer suport i pentru
utilizarea metodei GET. Metoda GET asigur c aciunile de cerere sau de
rspuns realizate de un nod SOAP sunt sigure i idempotente, fr efecte
secundare (side effects).
SOAP 1.1 meniona c n antetul HTTP apare atributul SOAPAction, care
poate fi folosit pentru a preciza scopul mesajului pe baza unui URI. Pentru
SOAP 1.2, coninutul acestui atribut poate fi specificat cu ajutorul parametrului
opional action, ce poate fi ataat tipului MIME application/soap+xml. Valoarea
parametrului action va fi desemnat printr-un URI absolut, nu neaprat rezolvabil,
putnd fi folosit de diverse entiti (e.g., firewall-uri) pentru filtrare.
Suplimentar, SOAP 1.2 ofer o descriere mai detaliat a codurilor de stare
HTTP, de exemplu 2xx sau 4xx, pentru raportarea posibilelor situaii ce pot
surveni.
140
SERVICII WEB
Securitatea n SOAP
SOAP 1.2 a adus clarificri versiunii 1.1 din multe puncte de vedere, ns la nivel
de securitate ofer destul de puine nouti.
Din acest motiv programatorii trebuie s urmeze anumii pai adiionali i s
utilizeze diverse tehnici de criptare pentru protejarea mesajelor SOAP a se
parcurge i cele prezentate n capitolul 7.
De asemenea, dezvoltatorii de instrumente SOAP trebuie s prevad situaiile
n care nodurile SOAP pot primi mesaje cu diferite date eronate. Este recomandat
ca nodurile SOAP s aib capacitatea s evalueze care este nivelul de ncredere
n emitorul unui mesaj i n coninutul aferent.
Referine
Apparao, V. et al. (eds.), XML Protocol (XMLP) Requirements, W3C Working Group,
Boston, 2003: http://www.w3.org/TR/xmlp-reqs
Berners-Lee, T., Fielding, R., Masinter, L. (eds.), Uniform Resource Identifiers (URI): Generic
Syntax, IETF RFC 2396: http://www.ietf.org/rfc/rfc2396.txt
Biron, P., Malhotra, A. (eds.), XML Schema Part 2: Datatypes (Second Edition), W3C
Recommendation, Boston, 2004: http://www.w3.org/TR/xmlschema-2/
Box, D. et al., Simple Object Access Protocol (SOAP) 1.1, W3C Note, Boston, 2000:
http://www.w3.org/TR/SOAP/
Box, D., A Brief History of SOAP, XML.com: http://xml.com/lpt/a/2001/04/04/
soap.html
Buraga, S., Tehnologii XML, Polirom, Iai, 2006
Cabrera, L., Kurt, C., Web Services Architecture and Its Specifications, Microsoft Press, 2005
Dumbill, E., Johnston, J., St. Laurent, S., Programming Web Services with XML-RPC,
OReilly, 2001
Fallside, D., Walmsley, P. (eds.), XML Schema Part 0: Primer (Second Edition), W3C
Recommendation, Boston, 2004: http://www.w3.org/TR/xmlschema-0/
Fielding, R. et al., Hypertext Transfer Protocol HTTP/1.1, IETF RFC 2616: http://www.ietf.org/
rfc/rfc2616.txt
Freed, N., Borenstein, N., Multipurpose Internet Mail Extensions (MIME) Part One: Format
of Internet Message Bodies, IETF RFC 2045: http://www.ietf.org/rfc/rfc2045.txt
Gudgin, M. et al. (eds.), SOAP Version 1.2 Part 1: Messaging Framework, W3C Recommendation, Boston, 2003: http://www.w3.org/TR/soap12-part1/
Gudgin, M. et al. (eds.), SOAP Version 1.2 Part 2: Adjuncts, W3C Recommendation,
Boston, 2003: http://www.w3.org/TR/soap12-part2/
Gudgin, M. et al. (eds.), Web Services Addressing 1.0 SOAP Binding, W3C Candidate
Recommendation, Boston, 2005: http://www.w3.org/TR/ws-addr-soap
PROTOCOLUL SOAP
141
Guruge, A., Web Services: Theory and Practice, Digital Press, 2004
Haas, H. et al. (eds.), SOAP Version 1.2 Specification Assertions and Test Collection, W3C
Recommendation, Boston, 2003: http://www.w3.org/TR/soap12-testcollection
Karmarkar, A., Gudgin, M., Lafon, Y. (eds.), Resource Representation SOAP Header Block,
W3C Recommendation, Boston, 2005: http://www.w3.org/TR/soap12-rep/
Mitra, N. (ed.), SOAP Version 1.2 Part 0: Primer, W3C Recommendation, Boston, 2003:
http://www.w3.org/TR/soap12-part0/
Nielsen, H., Ruellan, H., SOAP 1.2 Attachment Feature, W3C Working Group Note,
Boston, 2004: http://www.w3.org/TR/soap12-af/
Vedamuthu, A. (ed.), Web Services Description Language (WSDL) Version 2.0 SOAP 1.1 Binding,
W3C Working Draft, Boston, 2006: http://www.w3.org/TR/wsdl20-soap11-binding
Weerawarana, S. et al., Web Services Platform Architecture, Prentice Hall PTR, 2005
* * *, SOAP Builders: http://www.soapbuilders.org/
* * *, World Wide Web Consortium, Boston, 2006: http://www.w3.org/
* * *, XML-RPC: http://www.xmlrpc.com/
Capitolul 5
Descoperirea serviciilor
Raionamentul meu nu trebuie interpretat
ca afirmaie, ci drept ntrebare.
(Niels Bohr)
Descoperirea serviciilor este una dintre cele mai importante probleme dezbtute pe larg n cadrul comunitii serviciilor Web. Aceasta, de fapt, poate fi
formulat cu ajutorul unei ntrebri simple: cum poate afla un client despre
existena i modul de utilizare a unui serviciu?
Procesul de descoperire a serviciilor Web poate fi unul centralizat sau
distribuit. Exist mai multe abordri de soluionare a acestei probleme, care
constituie subiectul capitolului de fa.
144
SERVICII WEB
Anul
lansrii
1.0
2000
2.0
2001
3.0
2004
Obiectiv
Crearea cadrului pentru cataloage (regitri) destinate serviciilor de tip e-business.
Alinierea specificaiilor la standardele Web existente i
furnizarea unei taxonomii flexibile a serviciilor.
O principal caracteristic este cea de adugare a suportului pentru securitate.
Actualmente este n vigoare UDDI 3.0, bazat pe mai vechiul standard UDDI
2.0 propus de OASIS (Organization of the Advancement of Structured Information
Standards).
UDDI poate fi considerat drept un meta-serviciu folosit pentru localizarea
serviciilor Web, permind n acelai timp interogri robuste, n raport cu
cantitatea imens de meta-date privitoare la serviciile Web oferite de diveri
implementatori.
DESCOPERIREA SERVICIILOR
145
146
SERVICII WEB
O structur de tip businessEntity conine una sau mai multe structuri distincte
de tip businessService. Similar, o structur de tip businessService poate include una
sau mai multe structuri bindingTemplate.
n versiunile recente exist nc dou tipuri de date care faciliteaz afilierea
regitrilor:
publisherAssertion semnific relaiile dintre entitile stocate ntr-un registru;
subscription menine anumite cereri pentru a se detecta schimbrile care pot
avea loc n ceea ce privete un set de entiti.
Toate aceste tipuri de date sunt stocate persistent de regitrii UDDI. Pentru
un anumit catalog UDDI, structurii de date fundamentale i se asociaz un
identificator unic, n acord cu o anumit schem standard. Acest identificator se
numete cheie (UDDI key).
Mai remarcm i faptul c o anumit structur businessEntity (identificat de o
cheie unic) va conine ntotdeauna o anumit instan a unei structuri de tip
businessService (specificat de propria sa cheie).
De oricte ori este necesar, prin intermediul acestor chei pot fi folosite
referine la o anumit entitate.
DESCOPERIREA SERVICIILOR
147
148
SERVICII WEB
DESCOPERIREA SERVICIILOR
149
<businessEntity ...>
...
<businessServices>
<businessService
businessKey="uuid:..." serviceKey="uuid:...">
<name>Preia un ordin de plat</name>
<description xml:lang="ro">
Serviciu pentru recepionarea
ordinelor de plat.
</description>
<bindingTemplates>
...
</bindingTemplates>
<categoryBag>
...
</categoryBag>
</businessService>
</businessServices>
</businessEntity>
150
SERVICII WEB
Utilizare
Din punct de vedere al utilizrii, o instan a unei structuri tModel poate fi
referit de mai multe structuri businessEntity. De asemenea, n diferite apeluri ale
interfeei de programare pot aprea referiri la tModel.
Utilizarea cea mai obinuit a elementelor tModel este n reprezentarea
specificaiilor tehnice i a conceptelor. De exemplu, un tModel poate fi folosit
pentru a reprezenta o specificaie care definete un protocol de transport wireless,
formatul interschimburilor de date i secvena de reguli ce trebuie urmate n
procesul de schimb al mesajelor.
DESCOPERIREA SERVICIILOR
151
152
SERVICII WEB
DESCOPERIREA SERVICIILOR
153
Structura operationalInfo
La publicarea unui serviciu, n registrul UDDI sunt stocate i o serie de informaii
operaionale, incluznd data i timpul la care structura de date a fost creat sau
modificat, identificatorul nodului UDDI i identitatea celui care a publicat
datele.
Aceste informaii operaionale vor fi memorate ntr-un element operationalInfo,
pentru structurile de date de tip businessEntity, businessServices, bindingTemplate i
tModel.
Sub-elementele care pot fi folosite n cadrul operationalInfo sunt created, modified,
modifiedIncludingChildren, nodeID, authorizedName. Entitatea UDDI care are asociat
o structur operationalInfo se identific prin atributul obligatoriu entityKey.
154
SERVICII WEB
Descriere
Un registru intern, al unei ntreprinderi, aflat n
spatele unui firewall izolat de Internet. Accesul la
facilitile administrative i la datele din regitri este
restricionat. Datele nu sunt partajate cu ali regitri.
Exemplu de
aplicaie
Catalog UDDI la
nivel de corporaie (Enterprise
Web Service
Registry)
DESCOPERIREA SERVICIILOR
155
Figura 3. Tipurile de regitri i interaciunile ntre acetia (RP = registru privat, RPA =
registru privat afiliat, UBR = UDDI Business Registry)
Publisher API
Interfaa Publisher API permite publicarea i actualizarea de informaii coninute
n regitrii UDDI. Funciile puse la dispoziie sunt descrise de tabelul urmtor.
156
SERVICII WEB
Metoda
add_publisherAssertions
delete_binding
delete_business
delete_publisherAssertions
delete_service
delete_tModel
discard_authToken
get_assertionStatusReport
get_authToken
get_publisherAssertions
get_registeredInfo
save_binding
save_business
save_service
save_tModel
set_publisherAssertions
Descriere
Adaug una sau mai multe relaii specificate de
publisherAssertion
terge una/mai multe instane ale elementului
bindingTemplate din regitri
terge una/mai multe nregistrri de afaceri
Elimin unul/mai multe elemente publisherAssertion
terge unul/mai multe elemente businessService
terge logic una/mai multe structuri tModel
Informeaz un nod c informaiile de autentificare
vor fi nlturate
Raporteaz starea declaraiilor care implic orice
nregistrare de afacere a crui management este
realizat de un anumit publisher
Obine un jeton de autentificare
Furnizeaz toate relaiile de tip publisherAssertion
realizate de un publisher
Obine o list a tuturor structurilor businessEntity i
tModel
Salveaz/actualizeaz un element bindingTemplate
Salveaz/actualizeaz o structur businessEntity
Adaug/actualizeaz unul ori mai multe elemente
businessService
Salveaz sau actualizeaz unul/mai multe elemente de
tip tModel
nlocuiete toate declaraiile de tip publisherAssertion
ale unui publisher
Inquiry API
Interfaa de programare Inquiry API permite operaii pentru cutarea i parcurgerea regitrilor cu scopul de a obine informaii despre o anumit afacere sau un
serviciu dorit. Tabelul de mai jos sintetizeaz lista funcionalitilor oferite.
Metoda
find_binding
find_business
find_relatedBusinesses
find_service
Descriere
Localizeaz o informaie de legare (binding) a unui serviciu la
un protocol (tip, port etc.) n cadrul unui sau mai multor
elemente businessService
Localizeaz informaii despre una/mai multe afaceri
Localizeaz informaii despre nregistrrile businessEntity
asociate unei anumite entiti de afaceri
Localizeaz anumite servicii n cadrul unor entiti de afaceri
DESCOPERIREA SERVICIILOR
Metoda
find_tModel
get_bindingDetail
get_businessDetail
get_businessDetailExt
get_serviceDetail
get_tModelDetail
157
Descriere
Localizeaz una/mai multe structuri tModel
Obine informaii detaliate pentru realizarea de cereri
privitoare la bindingTemplate
Obine informaii despre businessEntity pentru una sau mai
multe afaceri/organizaii
Furnizeaz informaii detaliate despre businessEntity
Obine detalii complete despre un set de entiti businessService
Furnizeaz detalii referitoare la un tModel
158
SERVICII WEB
DESCOPERIREA SERVICIILOR
159
<Body>
<get_bindingDetail xmlns="urn:uddi-org:api_v3">
...
</Envelope>
UDDI nu ofer suport pentru conceptul de actor SOAP (pentru SOAP 1.2,
regsit sub numele de rol role). Nodurile UDDI vor respinge orice cerere
care vine cu un atribut actor n elementul Header. Se va ntoarce o eroare
SOAP fr nici un element Detail, iar codul erorii este de tip Client (sau Sender
n cazul SOAP 1.2).
UDDI nu are prevzut suport pentru facilitatea SOAP Encoding. n mesajele
trimise unui nod UDDI, nu trebuie s existe nici o informaie privitoare la
stilul de codificare pentru nici un element din cadrul spaiului de nume
urn:uddi-org. n caz contrar, nodul va rspunde cu un cod de eroare de tip
Client, iar faultstring va indica motivul apariiei problemei.
Regitrii UDDI pot ignora coninutul anteturilor SOAP.
UDDI suport urmtoarele coduri de eroare SOAP 1.1: VersionMismatch,
MustUnderstand, Client i Server.
160
SERVICII WEB
DESCOPERIREA SERVICIILOR
161
162
SERVICII WEB
DESCOPERIREA SERVICIILOR
tModel
UDDI
1
name
description
Interfaa
WSDL a
serviciului
Atributul
targetNamespace
pentru definirea
elementului
Elementul
documentation
categoryBag
Descriere
Numele pentru tModel este obinut
folosindu-se valoarea atributului
targetNamespace din documentul
WSDL. Este necesar un nume consistent, pentru ca un tModel s fie localizat folosindu-se doar informaii din
documentul de tip implementare a
serviciului.
Elementul description din tModel este
restrns la 256 de caractere. Dac elementul documentation nu exist, atunci
trebuie utilizat numele atributului din
elementul definitions.
Localizarea documentului de tip interfa a serviciului poate fi folosit ca
valoare pentru overviewURL. Dac
exist mai mult de un singur element
binding, atunci valoarea acestuia este
codificat n URL.
Elementul categoryBag trebuie s
conin cel puin un sub-element
keyedReference. Atributul keyName va
avea valoarea uddi-org:types, iar
keyValue va avea valoarea wsdlSpec.
163
Obligatoriu
Da
Nu
Da
Da
Documentul de mai jos reprezint interfaa unui serviciu Web. Valorile ce vor
fi inserate ntr-un tModel apar cu caractere ngroate:
<?xml version="1.0"?>
<definitions name="TranzactiiPortService-interface"
targetNamespace=
"http://www.portocale.info/
TranzactiiPortService-interface"
xmlns:tns=
"http://www.portocale.info/TranzactiiPortService-interface"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<documentation xml:lang="ro">
Definiia unei interfee standard WSDL pentru
un serviciu de tranzacii de portocale.
</documentation>
164
SERVICII WEB
<message name="TipPortocaleRequest">
<part name="tip" type="xsd:string"/>
</message>
<message name="TipPortocaleResponse">
<part name="tipIntors" type="xsd:string"/>
</message>
<portType name="TipPortocaleTranzactiiPortService">
<operation name="furnizeazaTipPortocale">
<input message="tns:TipPortocaleRequest"/>
<output message="tns:TipPortocaleResponse"/>
</operation>
</portType>
<binding name="TipPortocaleBinding"
type="tns:TipPortocaleTranzactiiPortService">
<soap:binding style="rpc" transport=
"http://schemas.xmlsoap.org/soap/http"/>
<operation name="furnizeazaTipPortocale">
<soap:operation soapAction=
"http://www.portocale.info/furnizeazaTip"/>
<input>
<soap:body use="encoded"
namespace="urn:tip-portocale-tranzactii-port"
encodingStyle=
"http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded"
namespace="urn:tip-portocale-tranzactii-port"
encodingStyle=
"http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
</definitions>
DESCOPERIREA SERVICIILOR
165
<description xml:lang="ro">
Definiia unei interfee standard WSDL pentru
un serviciu de tranzacii de portocale.
</description>
<overviewDoc>
<description xml:lang="ro">
Documentul WSDL descriind interfaa serviciului
</description>
<overviewURL>
http://www.portocale.info/TranzactiiPortServiceinterface.wsdl#TipPortocaleBinding
</overviewURL>
</overviewDoc>
<categoryBag>
<keyedReference tModelKey="uuid:..."
keyName="uddi-org:types" keyValue="wsdlSpec"/>
<keyedReference tModelKey="uuid:..."
keyName="Serviciu tranzact." keyValue="..."/>
</categoryBag>
</tModel>
Elementul overviewURL are valoarea http://www.portocale.info/TranzactiiPortService-interface.wsdl, care reprezint adresa documentului WSDL de tip interfa a
serviciului Web. El conine, de asemenea, o referin direct la elementul binding
cu name="TipPortocaleBinding" n documentul de tip interfa a serviciului.
Cum exist doar un singur element binding n documentul WSDL, aceast
referin la binding nu este obligatorie.
Implementarea serviciului Web este publicat n regitrii UDDI ca o structur
businessService, avnd unul sau mai multe marcaje bindingTemplates. Aceast publicare este realizat de furnizorul acelui serviciu.
Pentru fiecare element service specificat n documentul de implementare a
serviciului va fi creat cte o structur businessService.
Lista de sub-elemente ale businessService care pot fi specificate pe baza
coninutului documentului WSDL de implementare a serviciului cuprinde:
name are valoarea dat de atributul elementului service din documentul
WSDL;
description folosete primele 256 de caractere ale elementului documentation,
dac exist.
Pentru fiecare port din cadrul elementului service se creeaz un nou element
bindingTemplate, conform detaliilor din tabelul urmtor.
166
SERVICII WEB
binding
Template
description
accessPoint
tModel
InstanceInfo
overviewURL
Descriere
Dac elementul port conine un sub-element documentation, descrierea conine primele 256 de caractere ale
elementului documentation
Pentru o legare (binding) SOAP sau HTTP, accessPoint
are valoarea atributului location al elementului extension
asociat elementului port. Dac elementul conine un
URL, atributul URLType va desemna protocolul din
cadrul URL-ului. Dac nu se folosete nici un URL,
atributul URLType ar trebui folosit pentru a se cunoate
tipul protocolului.
Va exista cte un element tModelInstanceInfo pentru fiecare tModel pe care-l refereniaz. Astfel, va aprea cel
puin un tModelInstanceInfo incluznd o referin direct
la tModel-ul ce reprezint documentul de interfa a
serviciului.
Poate conine o referin direct la documentul de
implementare a serviciului, folosit doar pentru a
furniza o documentaie uor de neles (human-readable).
Toate celelalte informaii din acest document ar trebui
s fie accesibile printr-o entitate de date UDDI (UDDI
data entity). Suntem asigurai c documentul publicat
este acelai cu cel obinut n urma operaiei de cutare.
Dac acest document cuprinde mai mult dect un element port, atunci acesta ar trebui s conin o referin
direct la atributul name al lui port. Nu este suficient s se
foloseasc doar o referin la elementul binding din
tModel, deoarece pot exista mai multe marcaje port
referind acelai binding.
Obligatoriu
Nu
Da
Da
Nu
DESCOPERIREA SERVICIILOR
167
<import namespace="http://www.portocale.info/
TranzactiiPortService-interface"
location=
"http://www.portocale.info/wsdl/
TranzactiiPortService-interface.wsdl"/>
<service name="TranzactiiPortService">
<documentation>...</documentation>
<port name="TipPortocaleServicePort"
binding="interface:TipPortocaleBinding">
<documentation>
TipPortocaleTranzactiiPortService
</documentation>
<soap:address location=
"http://www.portocale.info/TranzactiiPortService"/>
</port>
</service>
</definitions>
168
SERVICII WEB
http://www.portocale.info/TipTranzactiiPort
</accessPoint>
<tModelInstanceDetails>
<tModelInstanceInfo tModelKey="...">
<instanceDetails>
<overviewURL>
http://www.portocale.info/services/
TranzactiiPortService.wsdl
</overviewURL>
</instanceDetails>
</tModelInstanceInfo>
</tModelInstanceDetails>
</bindingTemplate>
</bindingTemplates>
<categoryBag>
<keyedReference tModelKey="uuid:..."
keyName="..." keyValue="..." />
</categoryBag>
</businessService>
DESCOPERIREA SERVICIILOR
169
170
SERVICII WEB
DESCOPERIREA SERVICIILOR
171
172
SERVICII WEB
org.apache.juddi.datatype.business.BusinessEntity;
org.apache.juddi.datatype.service.BusinessService;
org.apache.juddi.datatype.binding.BindingTemplate;
org.apache.juddi.datatype.tmodel.TModel.
DESCOPERIREA SERVICIILOR
173
Modul de autentificare
Framework-ul jUDDI recurge la org.apache.juddi.auth.AuthenticationFactory pentru a
crea o instan Authenticator, cu scopul de a putea autentifica un client dat.
AuthenticatorFactory este o implementare a modelului Factory i se folosete pentru
a realiza o implementare pentru interfaa org.apache.juddi.auth.Authenticator. Dac se
folosete o valoare nul, atunci AuthenticationFactory creeaz o implementare
implicit pentru Authenticator org.apache.juddi.auth.DefaultAuthenticator. Clasa DefaultAuthenticator nu aplic nici o restricie de acces, deci se permit toate cererile.
n general, sistemele construite pe baza jUDDI trebuie s ofere o implementare pentru interfaa Authenticator, care s realizeze procesul de autentificare
dorit. Clasa care implementeaz Authentication este nregistrat printr-o intrare a
fiierului de configurare juddi.properties.
Crearea regitrilor
Aplicaia jUDDI se instaleaz ca o aplicaie Web (fiier .ear sau .war) i, n
contextul dat de adresa http://gazd:port/juddi, se poate exploata oriunde exist
un server Web sau un motor de procesare a servlet-urilor (servlet engine).
Vom descrie n continuare paii care trebuie parcuri pentru instalare. Precizm faptul c, pentru ca instalarea s reueasc pe maina dumneavoastr
conform reetelor furnizate mai jos, trebuie s recurgei exact la versiunile de
aplicaii precizate. n cazul utilizrii altor versiuni, vor fi necesare eventual
configurri diferite.
174
SERVICII WEB
n caz de succes, vei obine un rezultat precum cel din captura-ecran de mai
jos.
DESCOPERIREA SERVICIILOR
175
176
SERVICII WEB
DESCOPERIREA SERVICIILOR
177
178
SERVICII WEB
</parameter>
<parameter>
<name>maxIdle</name>
<value>30</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>
<parameter>
<name>username</name>
<value>root</value>
</parameter>
<parameter>
<name>password</name>
<value>adria</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>org.gjt.mm.mysql.Driver</value>
</parameter>
<parameter>
<name>url</name>
<value>
jdbc:mysql://localhost:3306/jUDDI?autoReconnect=true
</value>
</parameter>
</ResourceParams>
</Context>
DESCOPERIREA SERVICIILOR
179
Figura 10. Mesajele de stare obinute n urma rulrii aplicaiei de diagnosticare jUDDI
180
SERVICII WEB
facil. Via WSIL, un furnizor de servicii poate s-i fac disponibile serviciile
pentru a putea fi descoperite i utilizate de ctre consumatori.
Acest aspect este similar cu misiunea UDDI, dar WSIL se dorete a fi o etap
superioar UDDI n evoluia procesului de regsire a serviciilor Web.
Figura urmtoare ilustreaz noile relaii ce pot fi stabilite ntre consumatori,
furnizori i regitrii centralizai UDDI. Prima diferen se materializeaz n
faptul c o cerere de cutare a unui serviciu Web nu se realizeaz direct asupra
regitrilor centralizai UDDI. n schimb, cutarea este efectuat de ctre consumatori direct la furnizorul de servicii.
Conform acestui model, regitrii UDDI centralizai i nemoderai vor deveni
descentralizai i moderai. De observat, de asemenea, c nimeni nu mpiedic
furnizorii de servicii s-i nregistreze serviciile n cadrul regitrilor UDDI i s
redirecteze gsirea serviciului spre regitrii UDDI.
DESCOPERIREA SERVICIILOR
181
182
SERVICII WEB
Referine
Booth, D. et al. (eds.), Web Services Architecture, W3C Working Draft, Boston, 2003:
http://www.w3.org/TR/ws-arch/
Cabrera, L.F., Kurt, C., Web Services Architecture and Its Specifications, Microsoft Press,
2005
Clement, L. et al. (eds.), UDDI Version 3.0, OASIS Open, 2004: http://uddi.org/pubs/
uddi_v3.htm
Guruge, A., Web Services: Theory and Practice, Digital Press, 2004
Tanas, ., Olaru, C., Dezvoltarea aplicaiilor Web folosind Java, Polirom, Iai, 2005
Weerawarana, S. et al., Web Services Platform Architecture, Prentice Hall PTR, 2005
DESCOPERIREA SERVICIILOR
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*,
*,
*,
*,
*,
*,
*,
*,
*,
*,
*,
*,
*,
*,
183
Capitolul 6
186
SERVICII WEB
extensia Soap pentru PHP sau biblioteca gSOAP, presupun instalarea n cadrul
unui server Web particular, astfel nct daemon-ul HTTP va manevra mesajele
SOAP spre o component proxy, care realizeaz invocarea serviciului Web n
manier transparent pentru programator. O serie de instrumente SOAP suport
un mecanism de transport configurabil care pemite selecia, la nivel de aplicaie,
a protocolului de transport. Modulul SOAP::Lite, de pild, ofer suport pentru
HTTP, FTP, SMTP sau Jabber.
Instrumentele SOAP furnizeaz o component proxy, menit a procesa i
interpreta mesajul SOAP n vederea invocrii codului aplicaiei. Aceast
component trebuie s aib n responsabilitate recunoaterea stilului de codificare, translatarea datelor din format nativ de exemplu obiecte Java sau
.NET n XML (i invers), procesarea antetului din mesajul SOAP cu atributul
mustUnderstand="true" etc. Atunci cnd o component proxy manevreaz un
mesaj SOAP, va trebui s efectueze urmtoarele:
deserializarea mesajului, dac este necesar, din format XML ntr-o form
adecvat pentru a-l putea analiza;
invocarea codului (a metodelor);
serializarea rspunsului primit n XML i manevrarea lui n scopul trimiterii
acestuia la emitor.
n ciuda diferenelor de implementare, instrumentele pentru dezvoltarea de
servicii Web prin SOAP urmeaz acelai model.
n cadrul acestui subcapitol ne propunem s detaliem modul de implementare
i de invocare a unor servicii Web pe baza uneltelor open source existente pentru
PHP i Perl. Pentru nceput, vom construi un server i un client SOAP simplu
n PHP, utiliznd extensia Soap disponibil n versiunea 5 a acestui server de
aplicaii i, ca alternativ, biblioteca NuSOAP care poate fi folosit i n PHP 4.
n partea a doua a acestui subcapitol ne propunem s scriem un serviciu Web
oferind o interfa comod pentru operaiile uzuale realizate asupra resurselor
unui sistem de fiiere aflat de distan. Pentru aceasta, vom recurge la modulul
SOAP::Lite, unul dintre cele mai cunoscute instrumente de dezvoltare n limbajul
Perl a serviciilor Web i a clienilor afereni acestora.
187
188
SERVICII WEB
189
190
SERVICII WEB
191
Serverul va rula la infinit, ocupnd portul 3333 al mainii locale (vezi figura 2).
Va pune la dispoziie via SOAP 1.1 peste HTTP cele trei metode descrise mai
sus. Pentru fiecare metod n parte, prelum parametrii necesari. n cazul n care
acetia nu sunt furnizai de client, se va ntoarce un mesaj de tip fault SOAP,
semnalndu-se o situaie de excepie. Am dorit ca rspunsul oferit s fie de mai
multe tipuri de date (ntreg, ir de caractere sau o list de fiiere marcat n
XML), pentru a se putea observa diferenele de codificare.
Modulul SOAP::Perl apare n majoritatea distribuiilor Perl actuale. Versiunile
utilizate pentru testarea i rularea exemplelor din aceast carte au fost 0.65 i
0.68. n cazul n care modulul este indisponibil, poate fi preluat din CPAN
(Comprehensive Perl Archive Network) accesibil la http://search.cpan.org/ i instalat
conform urmtorilor pai:
(infoiasi)$
(infoiasi)$
(infoiasi)$
(infoiasi)$
perl Makefile.PL
make
make test
make install
192
SERVICII WEB
193
# ne conectm la server
my $soap = SOAP::Lite
->uri('http://127.0.0.1:3333/XMLFiles/')
# adresa spaiului de nume
->proxy(
'http://127.0.0.1:3333/XMLFiles/xml-files.pl');
# locaia serviciului
# mpachetm explicit parametrii,
# folosind nume calificate
# pentru parametrii metodei invocate
my @params = (SOAP::Data->name('filename', $ARGV[0]));
# verificm dac fiierul exist pe server
$response = $soap->call('CheckIfExists' => @params);
# verificm dac a aprut o eroare (SOAP fault)
if ($response->fault) {
die 'A aprut o eroare: ' .
$response->faultstring;
}
# dac rezultatul primit e nul, fiierul nu exist
if (!$response->result) {
die 'Fiier inaccesibil (nu exist pe server?)';
}
# invocm metoda de redenumire a fiierului
# adugnd i numele cel nou al acestuia
push (@params, SOAP::Data->name('newname',
$ARGV[0] . '.renamed'));
# afim rezultatul execuiei metodei
print 'Redenumire realizat cu ' .
$soap->call('Rename' => @params)->result;
194
SERVICII WEB
portocale.txt.renamed
xml-files.pl
xml-files.pl~
195
Client-Peer: 127.0.0.1:3333
Client-Response-Num: 1
SOAPServer: SOAP::Lite/Perl/0.65_5
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soapenc=
"http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
soap:encodingStyle=
"http://schemas.xmlsoap.org/soap/encoding/"
xmlns:soap=
"http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<namesp9:CheckIfExistsResponse
xmlns:namesp9="http://127.0.0.1:3333/XMLFiles/">
<s-gensym27 xsi:type="xsd:int">1</s-gensym27>
</namesp9:CheckIfExistsResponse>
</soap:Body>
</soap:Envelope>
196
SERVICII WEB
197
198
SERVICII WEB
199
XML (disponibil n PHP versiunea 5). Liniile de cod prezentnd interes n acest
context sunt urmtoarele:
// realizm apelul
$result = $client->call('List', undefined,
$namespace, '', true);
$err = $client->getError();
if ($err) {
echo '<h3>Eroare</h3><pre>' . $err . '</pre>';
} else {
// afim lista de fiiere
echo '<h3>Fiierele existente pe server</h3><ul>';
// procesm rspunsul SOAP via Simple XML
$xml = simplexml_load_string ($client->responseData);
foreach ($xml->xpath("//file") as $file) {
// afim fiecare nume de fiier
echo '<li>' . $file['name'] . '</li>';
}
echo '</ul>';
}
200
SERVICII WEB
201
202
SERVICII WEB
203
n urma rulrii codului, vom obine un rezultat precum cel din figura de mai
jos (rspunsul ntors este un document XML, aa cum era i de ateptat):
System;
System.Diagnostics;
System.Xml.Serialization;
System.Web.Services;
System.Web.Services.Protocols;
namespace Salutari {
[System.Web.Services.WebServiceBindingAttribute(
Name="HelloSoap", Namespace="urn:Hello")]
public class ClientSalut :
System.Web.Services.Protocols.SoapHttpClientProtocol
{
public ClientSalut () { // constructor
// stabilim adresa serviciului Web
204
SERVICII WEB
this.Url="http://localhost/salutari.asmx";
[System.Web.Services.Protocols.
SoapDocumentMethodAttribute("urn:Hello/sayHello",
RequestNamespace="urn:Hello",
ResponseNamespace="urn:Hello",
Use=System.Web.Services.Description.
SoapBindingUse.Literal,
ParameterStyle=
System.Web.Services.Protocols.
SoapParameterStyle.Wrapped)]
public string sayHello (string nume) {
// rezultatul obinut (tablou de obiecte)
// n urma invocrii metodei serviciului Web
object[] rezult =
this.Invoke ("sayHello", new object[]{nume});
// ntoarcem primul element
return ((string)(rezult [0]));
}
}
}
Construcia [System.Web.Services.WebServiceBindingAttribute] stabilete la compilare ca assembly-ul rezultat s fie folosit pentru a invoca un serviciu Web. Cnd
acest assembly este compilat, .NET pune la dispoziie un mecanism intern
facilitnd funcionarea cererilor SOAP.
Linia System.Web.Services.Protocols.SoapHttpClientProtocol specific protocolul care
se dorete a fi utilizat (n acest caz, SOAP peste HTTP).
n cadrul clasei s-a mai creat un proxy pentru operaia sayHello i s-au
specificat diferite atribute privitoare la serviciul Web invocat. Detalii sunt
disponibile n cadrul documentaiilor ce nsoesc .NET Framework.
Programul-client recurge la Windows Forms i la rulare, n cazul unei compilri
cu succes, va afia o fereastr n care se solicit utilizatorului s introduc un
nume. n urma apsrii butonului Invoke, vom obine un rezultat precum cel din
figura 8.
Cnd a fost apsat butonul Invoke, s-a produs un eveniment tratat ntr-o
metod implementat de client. n cadrul acestei metode se apeleaz sayHello din
clasa proxy care invoc respectiva operaie de pe server, returnndu-se rezultatul
de mai sus.
205
206
SERVICII WEB
207
208
SERVICII WEB
}
// metod de tratare a erorilor de validare
private static void ValidationHandler (
object sender, ValidationEventArgs args) {
result += args.Severity +
"(" + args.Message + "). ";
validationMessages++;
}
Figura 10. Construirea i depanarea codului serviciului Web n cadrul mediului de dezvoltare
Microsoft Visual Web Developer Express
209
210
SERVICII WEB
Alte exemple privind dezvoltarea de servicii Web sub platforma .NET sunt
disponibile i n volumul lui Sabin Buraga (coord.), Situri Web la cheie. Soluii
profesionale de implementare, Polirom, Iai, 2004.
211
Interaciunea dintre un client i un server Web, via clasa proxy generat, este
prezentat n figura 12.
212
SERVICII WEB
213
214
SERVICII WEB
215
216
SERVICII WEB
217
218
SERVICII WEB
219
220
SERVICII WEB
<i>
<id>uuid:F73777F6-1113-7D28-BE46-2A5E2B8C0313</id>
<name>Weather by City</name>
</i>
<!-- nc 475 de intrri -->
</Result>
</n:getAllServiceNamesResponse>
</soap:Body>
</soap:Envelope>
221
222
SERVICII WEB
serviciul oferit de Google, astfel nct s avem acces la acesta (vezi figura 18, n
care se pot remarca i metodele ce pot fi folosite).
223
224
SERVICII WEB
225
226
SERVICII WEB
if (argc < 2)
/* oferim servicii ca un CGI */
soap_serve(&soap);
else {
/* atam serverul la un port
specificat n linia de comand (argv[1]) */
m = soap_bind(&soap, NULL, atoi(argv[1]), 100);
if (m < 0) {
/* afim eroarea survenit */
soap_print_fault(&soap, stderr);
exit(-1);
}
fprintf(stderr, "Conexiune reuit.\n");
while (1) {
// acceptm cereri din partea clienilor
s = soap_accept(&soap);
if (s < 0) { /* a intervenit o eroare */
soap_print_fault(&soap, stderr);
exit(-1);
}
fprintf(stderr, "S-a conectat un client.\n");
soap_serve(&soap); /* deservim clientul... */
soap_end(&soap);
/* am terminat */
}
}
return 0;
227
228
SERVICII WEB
229
230
SERVICII WEB
231
Pentru a stabili corespondena ntre serviciu i clasa Java care l implementeaz, am adugat un atribut cu numele ServiceClass, a crui valoare reprezint
calea spre locaia unde se afl memorat implementarea. Elementul operation
specific faptul c metoda oferit de serviciul Web este echoJavaSoap, mesajele
fiind recepionate via clasa pus la dispoziie de Apache Axis2. Dup cum se
poate observa, se recurge la un transfer n stilul RPC.
Urmtorul pas este s crem o arhiv cu extensia .aar (Axis2 Archive) care
include codul compilat (fiierul .class) i documentul services.xml. Structura intern
a acestei arhive de fapt, un .zip cu extensie diferit are forma:
META-INF\
Services.xml
HelloJavaSoap.class
232
SERVICII WEB
Dup aceasta, dai clic pe legtura Available Services pentru a obine mesajele
din captura-ecran urmtoare:
233
Din cele prezentate mai sus, putem considera c mediul Axis2 ofer un
mecanism flexibil i rapid de dezvoltare a serviciilor Web. Ca alternative,
menionm JWSDP (Java Web Services Developer Pack) pus la dispoziie de compania
Sun i noua versiune J2SE 1.6, care include suport nativ pentru crearea i
invocarea de servicii Web.
234
SERVICII WEB
c:\jdk1.6.0\bin>wsimport http://localhost:8080/
xml-validator.asmx?WSDL -s .\xml -verbose
ro\infoiasi\xmlvalidator\CheckIfExists.java
ro\infoiasi\xmlvalidator\CheckIfExistsResponse.java
ro\infoiasi\xmlvalidator\ObjectFactory.java
ro\infoiasi\xmlvalidator\Validate.java
ro\infoiasi\xmlvalidator\ValidateResponse.java
ro\infoiasi\xmlvalidator\XMLValidator.java
ro\infoiasi\xmlvalidator\XMLValidatorSoap.java
ro\infoiasi\xmlvalidator\package-info.java
235
236
SERVICII WEB
// o singur metod
@WebMethod()
public String sayHello (String nume) {
return mesaj + nume;
}
Corespunztor, clientul Java care invoc metoda de mai sus este compus din
urmtoarele linii:
import javax.xml.ws.WebServiceRef;
import salut.ServiciuSalut;
import salut.Salut;
public class ClientSalut {
@WebServiceRef(wsdlLocation=
"http://localhost:8080/salutari/salutari?wsdl")
static ServiciuSalut serviciu;
237
238
SERVICII WEB
239
240
SERVICII WEB
Mai urmeaz s scriem o clas care va implementa efectiv serviciul Web dorit.
Vom crea astfel unit-ul salut.pas, al crui cod este urmtorul:
unit salut;
interface
uses InvokeRegistry;
type
{ o interfa invocabil }
ISalut = interface(IInvokable)
['{D7532EC7-EA7F-4610-ADE5-B3634BB0F343}']
function Salut: String; stdcall;
function NumaraZile: Byte; stdcall;
end;
{ o clas implementnd interfaa }
TSalut = class (TInvokableClass, ISalut)
public
{ metodele expuse de serviciul Web }
function Salut: String; stdcall;
function NumaraZile: Byte; stdcall;
end;
implementation
uses SysUtils, DateUtils;
{ implementarea metodelor serviciului Web }
function TSalut.Salut: String; stdcall;
begin
Result := 'Salut din Delphi, prin SOAP!';
end;
function TSalut.NumaraZile: Byte; stdcall;
begin
Result := DaysBetween (Now,
EncodeDate(2006, 12, 31));
end;
initialization
{ nregistrarea interfeei i clasei }
InvRegistry.RegisterInterface(TypeInfo(ISalut));
InvRegistry.RegisterInvokableClass(TSalut);
end.
241
funcii, una care ntoarce un mesaj (ir de caractere) de salut, cealalt oferind
numrul de zile (un ntreg de tip Byte) rmase din momentul execuiei pn la
finalul anului 2006.
Cele dou unit-uri le includem n proiectul cu numele SalutWS.dpr i generm
fiierul executabil. Pentru a putea fi efectiv utilizat, acesta din urm trebuie
plasat n directorul htdocs al serverului Apache pentru Windows (n cazul nostru,
folosim distribuia Apache2Triad). Mai trebuie s configurm serverul s trateze
fiierele executabile (cele cu extensia .exe) ca programe CGI. Pentru aceasta vom
edita fiierul httpd.conf (localizat n directorul conf al serverului), insernd n
seciunea <IfModule mod_cgi.c>...</IfModule> liniile de mai jos:
AddHandler cgi-script .exe
AddType application/x-httpd-cgi .exe
242
SERVICII WEB
baza locaiei WSDL de mai sus, astfel nct vom selecta pentru situaia de fa
unica intrare ISalutservice);
Port reprezint punctul terminal al serviciului (ca i mai sus, din lista
generat, alegem ISalutPort).
Pentru a putea utiliza efectiv serviciul Web via HTTPRIO, va trebui s
recurgem la un alt asistent, denumit Web Services Importer (vezi figura 24),
responsabil cu generarea unui unit de accesare a metodelor puse la dispoziie de
serviciu. Asistentul va solicita adresa Web ori numele de fiier local al documentului WSDL corespunztor serviciului importat. La apsarea butonului
Generate va fi creat un unit, pe care-l denumim SalutImport.pas. Codul-surs al
acestuia este urmtorul:
unit SalutImport;
interface
uses Types, XSBuiltIns;
type
{ interfaa invocabil }
ISalut = interface(IInvokable)
['{AE775C10-3E55-41C4-8494-2A57E658F959}']
function Salut: WideString; stdcall;
function NumaraZile: Byte; stdcall;
end;
implementation
uses InvokeRegistry;
initialization
{ nregistrarea interfeei }
InvRegistry.RegisterInterface(TypeInfo(ISalut),
'urn:salut-ISalut', '');
end.
243
buton: TButton;
HTTPRIO: THTTPRIO;
procedure butonClick(Sender: TObject);
end;
var
FormClient: TFormClient;
implementation
{$R *.dfm}
uses SalutImport;
{ procedura de tratare a apsrii butonului }
procedure TFormClient.butonClick(Sender: TObject);
var Salut: ISalut;
begin
try
Salut := (HTTPRIO as ISalut);
{ afim rezultatul primit de la metoda
serviciului Web invocat }
MessageDlg('Au mai rmas ' +
IntToStr(Salut.NumaraZile) + ' de zile.',
mtInformation, [mbOk], 0);
except
on E: Exception do { tratm erorile }
MessageDlg('A aprut o eroare:' + E.Message,
mtError, [mbAbort], 0);
end;
end;
end.
Dup compilare, vom putea testa programul aa cum se poate remarca din
captura-ecran de mai jos:
244
SERVICII WEB
245
246
SERVICII WEB
multe ori este practic imposibil s se cunoasc starea (comportamentul) programelor de pe server. Alte dezavantaje vizeaz dependena de tehnologia
JavaScript (implementat n mod diferit de fiecare browser n parte), dificultatea
testrii i depanrii aplicaiilor, necesitatea folosirii navigatoarelor de ultim
generaie, accesul oricui la codul-surs (ceea ce poate cauza probleme de
securitate) i imposibilitatea, n unele situaii, de a realiza bookmark-uri ori de a
folosi mecanismul de istoric al navigrii (history).
Succesul suitei de tehnologii AJAX provine din promovarea sa de ctre
aplicaii Web populare precum Amazon, Basecamp, Flickr, Gmail, Google Maps,
Google Suggest, Netflix, Rollyo, Writely, Yahoo! i Zimbra.
Obiectul XMLHttpRequest
Componenta de baz este obiectul XMLHttpRequest pus la dispoziie practic de
ctre orice browser Web actual (a aprut n premier ca obiect ActiveX inclus n
Internet Explorer 5, iar apoi a fost adoptat i de Mozilla 1.0 i Safari 1.2). Acest
obiect permite realizarea de cereri HTTP (e.g., GET i POST) dintr-un program
rulnd la nivel de client (program de navigare) spre o aplicaie de pe server,
ntr-un mod asincron.
n mod uzual, datele vehiculate ntre programele client i server sunt marcate
n XML, dar pot fi adoptate i alte abordri: reprezentri HTML, JSON (JavaScript
Object Notation), CSV (Comma Separated Values) ori diverse metode de serializare.
Atunci cnd se utilizeaz HTML ca mijloc de reprezentare a datelor, AJAX se
mai numete i AHAH (Aynchronous HTML and HTTP). JSON reprezint un subset
al limbajului JavaScript (n fapt, al versiunii standardizate, cunoscut sub numele
de ECMAScript), avantajul fiind c datele reprezentate n JSON sunt simple
iruri de caractere ce pot fi convertite uor n (tablouri de) obiecte JavaScript.
Astfel dispare necesitatea procesrii coninutului XML obinut de la server.
Principalele metode care vor fi folosite efectiv n contextul AJAX sunt
urmtoarele:
open() iniiaz (deschide) o conexiune HTTP cu serverul, trimind o cerere
(uzual, GET sau POST) ctre acesta; aplicaia de pe server cu care va avea loc
schimbul de date va fi desemnat de un URI, dup cum vom vedea mai jos;
send() transmite date, n manier asincron, ctre aplicaia rulnd pe server;
abort() abandoneaz transferul curent;
setRequestHeader() specific diverse cmpuri ale antetului HTTP; de exemplu,
se poate stabili o anumit valoare particular pentru cmpul Content-Type,
aspect util atunci cnd dorim s manipulm alte tipuri de coninuturi, de
exemplu JSON ori CSV.
247
Stare
UNINITIATED
1
2
3
4
Descriere
Utilizri
Caracteristica important oferit de AJAX este cea de a schimba doar anumite
pri ale paginii Web.
Una din tehnicile AJAX populare este i cea a indicrii vizuale a faptului c
un fragment dintr-un document a fost modificat. Astfel, pe baza unei nuane de
culoare, care dispare n timp, utilizatorului i se poate semnala c un paragraf
dintr-un text are coninutul schimbat (actualizat). Uzual, se folosete galbenul;
de aceea, acest ablon de proiectare se mai numete i YFT (Yellow Fade Technique),
generalizarea sa ntitulndu-se FAT (Fade Anything Technique).
O alt utilizare este cea a remprosptrii automate (eventual, periodice) a
unei zone dintr-o pagin. De exemplu, atunci cnd a aprut o nou tire
recepionat via un emitor Atom/RSS (Really Simple Syndication) ori s-a modificat
248
SERVICII WEB
Instrumente de dezvoltare
Actualmente sunt disponibile diverse cadre de lucru dedicate dezvoltrii aplicaiilor AJAX. La nivelul clientului pot fi folosite diferite biblioteci (e.g., Dojo,
Prototype, Rico ori Script.aculo.us), unele dintre ele oferind i suport pentru manipularea facil a arborilor DOM. Pe partea de server se poate recurge la tehnologii
precum CGI, servere de aplicaii (de exemplu, programe PHP sau servlet-uri) ori
framework-uri dedicate vezi mai jos.
Trebuie menionat faptul c o serie de companii deja au nceput s pun la
dispoziie interfee de programare AJAX specializate, pentru ca dezvoltatorii s
integreze facil coninuturi provenite de pe diverse situri n cadrul paginilor
proprii. Un exemplu notabil este Google AJAX Search API, prin care se poate
avea acces la serviciul Web de cutare direct la nivel de client, n stilul AJAX.
249
250
SERVICII WEB
La apariia evenimentului de pierdere a focus-ului asupra cmpului de introducere a numelui de fiier, prin intermediul unui program JavaScript se va realiza
un transfer asincron ctre programul PHP rulnd pe server, aplicaie care va
ntoarce rspunsul privind existena numelui de fiier. n acest caz, utilizatorul va
primi imediat feedback pozitiv, suplimentar avnd posibilitatea redenumirii fiierului respectiv.
Formularul Web de interaciune cu utilizatorul are urmtoarea structur:
<form action="redenumire.php" method="get">
Numele fiierului : <input type="text" name="nume"
title="Introducei un nume de fiier"
onblur=
"javascript:verificaExist (this.value, '')" />
<span class="ascuns" id="fisierExistent">
Fiierul exist.
<input type="checkbox" value="da"
name="redenumire" checked="checked"
title="Bifai dac dorii redenumirea
fiierului" />Redenumim?
</span>
<br /><input type="submit" value="Execut" />
</form>
251
252
SERVICII WEB
if (cerere) {
// prelum documentul prin metoda GET
cerere.onreadystatechange = trateazaCererea;
cerere.open ("GET", url, true);
cerere.send ();
}
253
254
SERVICII WEB
255
Figura 29. Mesajul obinut n urma introducerii unui nume de fiier existent
Din cele descrise mai sus, se poate observa faptul c script-ul PHP funcioneaz
ca un intermediar (proxy), realiznd inter-operabilitatea ntre programul JavaScript
rulat n cadrul browser-ului i serviciul Web Perl invocat pe un server diferit de
cel n care se execut codul PHP. Am ales modelul descris aici, deoarece serviciul
Web poate s nu fie disponibil pe aceeai main pe care ruleaz codul PHP
invocat prin obiectul XMLHttpRequest.
La apsarea butonului de tip submit va fi apelat script-ul redenumire.php, care va
trebui s invoce metoda de redenumire a fiierului, metod implementat de
serviciul Web. Scrierea acestui program rmne ca tem de acas pentru cititorul
interesat.
256
SERVICII WEB
257
258
SERVICII WEB
fiierului" />Redenumim?
</span>
<br />
<input type="submit" value="Execut" />
</form>
</body>
</html>
259
acestuia. Construcia $() este o scurttur pentru metoda getElementById() specificat de recomandarea DOM, fiind folosit pentru a selecta un anumit element
din cadrul documentului XHTML; a se revedea i capitolul 2.
O captur-ecran a dialogului ntre client i server este pus la dispoziie de
figura 32, n care se poate remarca i interfaa extensiei Firebug pentru navigatorul
Firefox, folosit n situaia de fa pentru a lista apelurile AJAX realizate i
posibilele erori survenite. Aceast extensie poate fi utilizat cu succes pentru
depanarea oricror programe JavaScript.
260
SERVICII WEB
serviciului (cu alte cuvinte, serviciul Web nu poate fi localizat dect pe maina pe
care rezid i programul JavaScript ce recurge la AJAX).
Ca exemplificare, presupunem c dorim s aflm stocul unui sortiment de
portocale, recurgnd la metoda furnizeazaSortiment() implementat de serviciul
Web prezentat n cadrul seciunii 1.2. Programul JavaScript folosit la invocarea
serviciului Web are codul-surs de mai jos (se poate observa c structura
general a codului e similar celei prezentate mai sus, cu deosebirea c n acest
caz vom iniia o cerere POST spre server, adresa indicat fiind cea a serviciului
Web):
// adresa de apel al serviciului Web
const URISERV =
'http://localhost/sxml/oranges-server.php';
// adresa de baz a serviciului Web
const URIBSRV = 'http://localhost/sxml/';
// spaiul de nume al serviciului Web
const URISPN = 'urn:portocale.info';
// generm mesajul SOAP de cerere
// care va fi trimis spre server
function genMesaj (numeDoc) {
// construim 'de mn' mesajul SOAP de cerere
var mesaj = "<soap:Envelope xmlns:xsi=\""
+ "http://www.w3.org/2001/XMLSchema-instance\" "
+ "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "
+ "xmlns:soap=
\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
+ "<soap:Body>\n"
+ "<furnizeazaCantit " + "xmlns=\"" +
URISPN + "\">\n"
+ "<sortiment>" + numeDoc + "</sortiment>\n"
+ "</furnizeazaCantit>\n"
+ "</soap:Body>\n"
+ "</soap:Envelope>\n";
return mesaj;
}
// invocm metoda de validare
function invoca (numeDoc) {
var mesaj = genMesaj (numeDoc);
try {
if (window.XMLHttpRequest) { // doar pentru Firefox
cerere = new XMLHttpRequest ();
}
// stabilete funcia de tratare a strii ncrcrii
cerere.onreadystatechange = trateazaCererea;
261
}
catch (except) {
alert ('A intervenit o excepie: ' + except);
}
}
262
SERVICII WEB
263
264
SERVICII WEB
265
if (sortimente == null) {
String[] temp = File.ReadAllLines(
Server.MapPath("~/sortim_portocale.txt"));
// sortm elementele pentru a putea realiza
// cutarea binar
Array.Sort(temp,
new CaseInsensitiveComparer());
sortimente = temp;
}
// realizm cutarea i extragem maximum 'contor'
// sortimente care se potrivesc prefixului
// preluat de la client
int index = Array.BinarySearch(sortimente,
prefix, new CaseInsensitiveComparer());
if (index < 0) {
index = ~index;
}
int potriviri;
for (potriviri = 0; potriviri < lungMax &&
index + potriviri < sortimente.Length;
potriviri++) {
// verificm dac ncepe cu prefixul dat
if (!sortimente[index +
potriviri].StartsWith(prefix,
StringComparison.CurrentCultureIgnoreCase)) {
break;
}
}
// copiem rezultatul obinut
String[] rezultat = new string[potriviri];
if (potriviri > 0) {
Array.Copy(sortimente, index, rezultat,
0, potriviri);
}
// transmitem spre client tabloul de iruri
return rezultat;
Desigur, putem invoca n mod explicit metoda definit mai sus. Primul
parametru de intrare reprezint prefixul, care trebuie s se potriveasc fiecruia
dintre elementele listei de sortimente, iar al doilea specific numrul maxim de
sortimente ce vor fi ntoarse. Datele vor fi sortate, iar cutarea va fi realizat prin
metoda cutrii binare, indiferent dac literele sunt minuscule sau majuscule.
266
SERVICII WEB
267
268
SERVICII WEB
269
else {
return "Parametrul de intrare primit e vid...";
}
Este disponibil o singur metod care preia valoarea unui control ASP.NET
via obiectul Server i ntoarce un ir de caractere. Desigur, mai util pentru
utilizator ar fi fost s obin stocul de portocale din respectivul sortiment; acesta
este ns un exerciiu uor de implementat de ctre cititor.
La formularul descris mai sus, vom aduga urmtoarele:
<!-- buton ce invoc un alt serviciu -->
<input id="alege" type="button" value="Alege"
onclick="javascript:Invoca()" />
<div id="rezultat"></div>
270
SERVICII WEB
<atlas:servicereference
path="~/CantitPortocale.asmx"
type="text/javascript" />
</services>
</atlas:ScriptManager>
271
Referine
Alboaie, L, Buraga, S., Dialoguri despre SOAP, NET Report, februarie 2003:
http://www.infoiasi.ro/~busaco/publications/articles/SOAP.pdf
Asleson, R., Schutta, N., Foundations of AJAX, Apress, 2006
Buraga, S., Tehnologii XML, Polirom, Iai, 2006: http://www.infoiasi.ro/~busaco/
books/xml/
Buraga, S., Tehnologii Web, Matrix Rom, Bucureti, 2001: http://www.infoiasi.ro/
~busaco/books/web.html
Buraga, S., Ciobanu, G., Atelier de programare n reele de calculatoare, Polirom, Iai, 2001:
http://www.infoiasi.ro/~lrc/
Buraga, S. et al., Programare Web n bash i Perl, Polirom, Iai, 2002: http://www.infoiasi.ro/
~cgi/
Buraga, S. (coord.), Situri Web la cheie. Soluii profesionale de implementare, Polirom, Iai,
2004: http://www.infoiasi.ro/~busaco/books/webapps/
Buraga, S. (coord.), Tendine actuale n proiectarea i dezvoltarea aplicaiilor Web, Matrix Rom,
Bucureti, 2006: http://www.infoiasi.ro/~busaco/books/nw05/
Dospinescu, O., Dezvoltarea aplicaiilor n Visual Basic .NET, Polirom, Iai, 2004
Eernisse, M., A Simpler Ajax Path, OnLamp.com, 2005: http://www.onlamp.com/
pub/a/onlamp/2005/05/19/xmlhttprequest.html
Kulchenko, P., Ray, R., Programming Web Services with Perl, OReilly, 2002
Mueller, J., Mining Google Web Services: Building Applications with the Google API, Sybex, 2004
Pereira, S., Developer Notes for prototype.js: http://www.sergiopereira.com/articles/
prototype.js.html
Perry, B., AJAX Hacks, OReilly, 2006
Powell, T., Schneider, F., JavaScript 2.0: The Complete Reference (Second Edition), McGraw-Hill/
Osborne, 2004
Swart, B., Delphi 6 Web Services: SOAP, The Delphi Magazine, Issue 72, August 2001:
http://www.thedelphimagazine.com/Samples/1273/article.html
Tanas, ., Olaru, C., Dezvoltarea aplicaiilor Web folosind Java, Polirom, 2005
Wood, K., Delphi Developers Guide to XML, Wordware Publishing, 2001
Zakas, N., McPeak, J., Fawcett, J., Professional AJAX, Wrox Press, 2006
Zametti, F. et al., Survey of AJAX/JavaScript Libraries, OSAF.com, 2005: http://
wiki.osafoundation.org/bin/view/Projects/AjaxLibraries
* * *, AHAH (Asynchronous HTML and HTTP): http://microformats.org/wiki/rest/
ahah
272
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
SERVICII WEB
*, Ajaxian: http://www.ajaxian.com/
*, AJAX Components for Java: http://blueprints.dev.java.net/ajaxcomponents.html
*, Apache2Triad: http://apache2triad.sourceforge.net/
*, Apache Axis2: http://ws.apache.org/axis2/
*, Apache Geronimo: http://geronimo.apache.org/
*, Apache XML Activity: http://xml.apache.org/
*, Atlas ASP.NET: http://atlas.asp.net/
*, Biblioteca NuSOAP: http://dietrich.ganx4.com/nusoap/
*, CPAN (Comprehensive Perl Archive Network): http://cpan.perl.com/
*, Developer: http://www.developer.com/
*, Dojo: http://dojotoolkit.org/
*, DOM-Drag: http://www.youngpup.net/2001/domdrag/
*, DWR (Direct Web Remoting): http://getahead.ltd.uk/dwr/
*, ECMA (European Computer Manufacturers Association): http://www.ecma-international.org/
*, Extensia de depanare Firebug: http://www.joehewitt.com/software/firebug/
*, Google API: http://www.google.com/apis/
*, Google AJAX Search API: http://code.google.com/apis/ajaxsearch/
*, GWT (Google Web Toolkit): http://code.google.com/webtoolkit/
*, Instrumentul gSOAP: http://gsoap2.sourceforge.net/
*, Mason: http://masonhq.com/
*, Microsoft Visual Studio Express: http://msdn.microsoft.com/vstudio/express/
*, Modulul SOAP::Lite: http://www.soaplite.com/
*, Modulul SOAP::MIME: http://sourceforge.net/projects/soapmime
*, MSDN (Microsoft Developer Network): http://msdn.microsoft.com/
*, OReilly OnLAMP: http://www.onlamp.com/
*, PEAR (PHP Extensions and Add-ons Repository): http://pear.php.net/
*, Portal dedicat serviciilor Web: http://www.webservices.org/
*, Proiectul jMaki: https://ajax.dev.java.net/
*, Sajax: http://www.modernmethod.com/sajax/
*, Situl bibliotecii Prototype: http://prototype.conio.net/
*, Situl oficial PHP: http://www.php.net/
*, World Wide Web Consortium, Boston, 2006: http://www.w3.org/
*, XML.com: http://www.xml.com/
Capitolul 7
Retrospectiv i perspective
Realitatea trebuie neleas numai prin spargerea
ei n pri ct mai mici.
(Ren Descartes)
274
SERVICII WEB
Acest proces are loc n cadrul unui mediu orientat spre servicii, respectndu-se
principiile arhitecturale SOA (Service-Oriented Architecture) pe care le-am prezentat
n cadrul primului capitol al acestei lucrri.
O aplicaie Web proiectat pe baza SOA poate fi compus din diverse straturi
funcionale, conform celor ilustrate de figura 2.
RETROSPECTIV I PERSPECTIVE
275
276
SERVICII WEB
Trebuie, de asemenea, menionat existena unei suite de specificaii complementare, concurente, care se intituleaz ebXML i care a fost n vog n perioada
2002-2005. Aceste specificaii au fost date ulterior spre standardizare organizaiei
OASIS, semnatara multor documente privitoare la diverse aspecte legate de
SOA i serviciile Web.
Vom descrie n continuare o parte dintre direciile de evoluie a serviciilor
Web, cititorii interesai putnd aprofunda aceste aspecte prin consultarea resurselor bibliografice disponibile.
RETROSPECTIV I PERSPECTIVE
277
poate anuna via mesaje multicast prezena, atunci cnd este ataat infrastructurii Internet. Un procedeu similar are loc atunci cnd serviciul prsete
reeaua. Reeaua este una constituit ad hoc, compus din entiti interesate de
serviciul respectiv (i.e., clieni care intenioneaz s invoce anumite operaii).
Limitarea traficului de mesaje poate avea loc prin constituirea unui aa-numit
proxy de descoperire (discovery proxy) care este implementat tot ca un serviciu
Web.
n afar de mesajele de tip Hello (anun al prezenei unui serviciu) i Bye
(plecarea serviciului), sunt specificate i urmtoarele dou operaii:
Probe ncearc s detecteze un anumit serviciu ori mulime de servicii prin
transmiterea unui mesaj (multicast) ctre un grup de calculatoare, rspunsul
fiind expediat direct solicitantului. Dac reeaua posed un proxy de descoperire, atunci metoda Probe va fi executat direct de ctre acesta;
Resolve intenioneaz s rezolve un serviciu, cutarea efectundu-se dup
numele acestuia, trimindu-se un mesaj n ntreaga reea. Serviciul care se
potrivete cu numele dat, va rspunde solicitantului. Acest proces este similar
celui folosit de protocolul ARP (Address Resolution Protocol).
Un exemplu de mesaj SOAP care ncapsuleaz o cerere Probe este furnizat
mai jos (pentru localizare se folosete protocolul LDAP Lightweight Directory
Access Protocol):
<env:Envelope>
<env:Header>
<wsa:Action>
http://schemas.xmlsoap.org/ws/2004/10/discovery/Probe
</wsa:Action>
<wsa:To>
urn:schemas-xmlsoap-org:ws:2004:10:discovery
</wsa:To>
</env:Header>
<env:Body>
<wsd:Probe>
<!-- dorim asocierea serviciului Web -->
<wsd:Types>sfa:Binder</wsd:Types>
<!-- ...din cadrul domeniului info.uaic.ro -->
<wsd:Scope MatchBy=
"http://schemas.xmlsoap.org/ws/2004/10/discovery/ldap">
ldap:///ou=info,o=uaic,c=ro
</wsd:Scope>
</wsd:Probe>
</env:Body>
</env:Envelope>
278
SERVICII WEB
Iniiativa WS-ReliableMessaging
Unul dintre aspecte importante este cel referitor la realizarea de comunicaii
fiabile. Necesitatea existenei unui mecanism de asigurare a fiabilitii transferului
de date provine i din urmtoarele presupuneri greite pe care le au dezvoltatorii
de aplicaii privind un sistem distribuit (formulate de Peter Deutsch la nceputul
anilor 90 ai secolului trecut):
1.
2.
3.
4.
5.
6.
7.
8.
RETROSPECTIV I PERSPECTIVE
279
280
SERVICII WEB
RETROSPECTIV I PERSPECTIVE
281
282
SERVICII WEB
RETROSPECTIV I PERSPECTIVE
283
Aplicaia care preia mesajul din cadrul cozii va realiza acest lucru printr-o
tranzacie atomic, astfel nct datele vor fi livrate cu succes (i eliminate din
coad) doar n cazul n care nu apar excepii de procesare la nivelul destinatarului.
284
SERVICII WEB
RETROSPECTIV I PERSPECTIVE
285
Figura 4. Categoriile de meta-date care formeaz contractul asociat unui serviciu Web
286
SERVICII WEB
RETROSPECTIV I PERSPECTIVE
287
datele circulnd printr-un tunel oferit de o reea privat virtual (VPN Virtual
Private Network). A doua soluie este oferit de criptarea datelor prin intermediul
unei suite de tehnici, implementate de biblioteci specializate i/sau oferite de
mediile de dezvoltare existente.
n unele situaii, precum cele din domeniul e-business, accesul la serviciul Web
nu trebuie s fie public, acordat oricui. Autentificarea presupune un mecanism
care permite utilizatorilor s acceseze un serviciu dup verificarea identitii
utilizatorului (n general, pe baza unui nume de cont i a unei parole furnizate
de acel utilizator). De cele mai multe ori, serverul Web ofer suport pentru
autentificri de baz sau bazate pe algoritmi de tip digest, precum MD5. n cazul
serviciilor Web, exist ns iniiative speciale, precum SAML (Security Assertion
Markup Language) vezi infra.
Autorizarea este asociat autentificrii i specific aciunile (rolurile) pe care un
utilizator poate s le realizeze. Un utilizator autentificat poate s nu fie n mod
implicit i autorizat s aib acces la o anumit resurs a sistemului. Sistemele de
autorizare permit administratorului s defineasc politici pentru controlul accesului la servicii. n mod tradiional, se folosesc drepturi de acces (permisiuni) i
liste de control al accesului (ACL Access Control List), utilizatorii fiind clasificai
pe grupuri sau roluri. Prin intermediul controlului accesului bazat pe roluri
(RBAC Role-Based Access Control), sistemul de management al securitii poate
fi mai uor mulat pe structura organizaiei. n ceea ce privete utilizatorul, n
mod uzual se folosete o tehnic de tip SSO (Single Sign-On), bazat pe existena
unui singur procedeu de autentificare comun pentru accesul la mai multe
resurse (situri, servicii etc.).
Tehnicile de tip digest pot asigura i integritatea informaiilor, fiind posibil
detectarea oricrei ncercri maliioase de modificare a datelor transmise. De
asemenea, tot pentru realizarea integritii, pot fi folosite semnturi digitale (a nu
se confunda ns cu semnturile electronice care se refer la totalitatea mijloacelor
prin care o informaie poate purta semntura proprietarului ei). Semnturile
digitale pot fi stocate n format XML i vehiculate, desigur, via mesaje SOAP
prin intermediul specificaiei XML Signature.
Nerepudierea asigur faptul c expeditorul mesajului nu poate afirma c nu l-a
trimis. Pentru aceasta se folosesc certificate digitale, care stocheaz datele privind
identitatea unei entiti deintoare a unui secret (o parol, o serie a unei cri de
credit, a certificatului digital n sine etc.). Certificate digitale sunt disponibile
ntr-un format precum X.500. Un certificat digital este emis de o autoritate de
certificare (CA Certification Authority), iar verificarea certificatelor se realizeaz
de ctre o autoritate de nregistrare a acestora (RA Registration Authority). Cataloagele de certificate, mpreun cu autoritile de certificare (CA) i nregistrare
288
SERVICII WEB
(RA) formeaz aa-numita infrastructur cu chei publice (PKI Public Key Infrastructure).
Oferirea de servicii PKI n contextul spaiului Web se poate realiza via XKMS
(XML Key Management Specification).
Disponibilitatea impune ca o anumit resurs s poat fi accesat la momentul
oportun. Un serviciu Web indisponibil clienilor si pur i simplu nu exist, ceea
ce are repercusiuni negative mai ales n contextul afacerilor electronice. Printre
cauzele care pot eroda disponibilitatea se enumer atacurile de refuz al serviciilor
DoS (Denial Of Service) sau DDoS (Distributed DoS). Atacurile distribuite sunt
deosebit de periculoase pentru asigurarea disponibilitii serviciilor Web publice.
Intimitatea este deseori confundat cu confidenialitatea. Confidenialitatea
presupune imposibilitatea ca datele aflate n tranzit s fie accesate de persoane
ru-voitoare, pe cnd intimitatea vizeaz drepturile ce trebuie respectate privind
caracterul (subiectul) datelor vehiculate. Multe dintre vulnerabilitile raportate
n domeniul comerului electronic sunt de fapt bree n sistemul de asigurare a
intimitii utilizatorilor. Pentru datele transportate pe Internet sunt adoptate n
mod unanim diverse tehnici de criptare, dar la nivel de server ar putea s fie
stocate necorespunztor (de exemplu, n clar) n cadrul unui sistem de stocare
vulnerabil. Un atacator va avea astfel acces la seria crii de credit a unui client,
pe baza unei conexiuni directe cu serverul de baze de date sau a unui tehnici de
tip XSS (Cross-Site Scripting). Alte probleme viznd pierderea intimitii sunt
cauzate de configurarea necorespunztoare a sistemelor detalii i n cartea lui
Sabin Buraga, Proiectarea siturilor Web (ediia a doua), Polirom, Iai, 2005.
Niveluri de securitate
Vom face mai jos o scurt trecere n revist a cerinelor de securitate pe care
trebuie s le ndeplineasc serviciile Web.
Construirea unor servicii Web sigure (din punctul de vedere al securitii)
trebuie s ia n considerare aspecte ca:
realizarea unui model (Web Services model) care are la baz o analiz detaliat a
factorilor care amenin comunicarea i punctele terminale (endpoints) ale
serviciilor Web;
existena unui cadru de lucru (framework) facilitnd securizarea resurselor, uor
integrabil ntr-o arhitectur orientat spre servicii;
asigurarea unui mecanism de autentificare i autorizare a prilor care comunic n cadrul sistemului constituit.
Majoritatea scenariilor de securitate sunt legate de securitate la nivel de reea/
transport, securitate la nivel de date i integritate la nivel de mesaj.
RETROSPECTIV I PERSPECTIVE
289
290
SERVICII WEB
RETROSPECTIV I PERSPECTIVE
291
Drept exemplificare, furnizm urmtorul fragment de document, care precizeaz c autentificarea utilizatorului blue.ory s-a realizat cu succes, pe baza
metodei de autentificare oferit de sistemul Kerberos:
<saml:AuthenticationStatement
AuthenticationInstant="2006-09-01T10:33:33Z"
AuthenticationMethod="Kerberos">
<saml:Subject>
<saml:NameIdentifier
NameQualifier="verisign.com/ams">
blue.ory
</saml:NameIdentifier>
</saml:Subject>
</saml:AuthenticationStatement>
292
SERVICII WEB
RETROSPECTIV I PERSPECTIVE
293
Figura 6. Diversele aspecte privind securitatea serviciilor Web sunt specificate pe niveluri
294
SERVICII WEB
...
</Security>
...
</Header>
...
</Envelope>
RETROSPECTIV I PERSPECTIVE
295
296
SERVICII WEB
RETROSPECTIV I PERSPECTIVE
297
298
SERVICII WEB
RETROSPECTIV I PERSPECTIVE
299
300
SERVICII WEB
Figura 8. Reprezentarea grafic a unui workflow desfurat n cazul iniierii unei comenzi din
partea unui cumprtor online ce dorete s achiziioneze un sortiment de portocale
RETROSPECTIV I PERSPECTIVE
301
302
SERVICII WEB
Alegerea exclusiv presupune, pe baza lurii unei decizii, alegerea unei singure
soluii dintr-o alternativ. De exemplu, managerul unui magazin virtual va fi
notificat dac stocul de portocale este pe sfrite (cantitatea disponibil este mai
mic de 33 de kilograme), altfel nu. Schematic, aceasta poate fi exprimat prin
liniile:
<switch>
<case condition="#cantitMinima">
<!-- notificm managerul -->
</case>
<case condition="...">
...
</case>
</switch>
RETROSPECTIV I PERSPECTIVE
303
Figura 9. Meninerea strii fiecrei instane de serviciu Web existent ntr-un grid
304
SERVICII WEB
RETROSPECTIV I PERSPECTIVE
305
clas de servicii compuse din alte servicii. Cel de-al patrulea tip vizeaz asamblarea
serviciilor nrudite n vederea exploatrii (deployment) efective i a managementului
operaiilor.
Modelul de creare a aplicaiilor i sistemelor utiliznd SOA este descris de o
specificaie intitulat SCA (Service Component Architecture), propus la finalul anului
2005 de o serie de companii. Conform SCA, se ofer o modalitate neutr din
punctul de vedere al platformei i limbajului de programare pentru reprezentarea serviciilor care pot fi rulate pe o varietate de medii. Aceste servicii pot
fi compuse, implementate de o palet larg de framework-uri i containere (e.g.,
EJB Enterprise Java Beans). La nivel de implementare, proiectul Apache Tuscany
ofer suport pentru SCA, n limbajele C++ i Java. De asemenea, poate fi
menionat i Eclipse STP (SOA Tools Project).
Dac SOA permite adoptarea unei abordri sistematice de compunere dinamic a serviciilor conform cerinelor industriei, noua direcie de evoluie a
spaiului WWW denumit Data Web sau Web 2.0 exprim dorina de existen
a unui mecanism flexibil de integrare ad-hoc a resurselor, fr constrngeri. Modul
de utilizare a Web-ului actual se bazeaz pe modele de interaciune bogat
(aspect posibil via tehnologii ca RSS, Atom i AJAX) i pe crearea de reele
sociale slab-conectate (a se vedea fenomenul blogging, corelat cu existena taxonomiilor create de grupuri de persoane folksonomies i a aplicaiilor colaborative
de tip wiki). Web-ul este vzut ca o platform i nu numai ca depozit de date, n care
comuniti de utilizatori genereaz coninut util (pe baza inteligenei colective).
n acest context, apare tipul de aplicaie Web hibrid (aa-numitul mash-up)
care reprezint un sit Web ori o aplicaie Web ce combin n mod agil coninuturi
provenite din mai multe surse, n vederea oferirii unei interaciuni complexe.
Sursele sunt n mod uzual RSS feed-uri asociate blog-urilor sau wiki-urilor i
servicii Web exploatate prin SOAP ori prin REST. Pentru a facilita aceast
integrare, numeroi ofertani de servicii Web ncepnd cu Google i Amazon
i continund cu eBay, Yahoo! i multe alte companii au pus la dispoziie
API-uri specializate.
Mai mult dect att, exist iniiative pentru asocierea de descrieri semantice
serviciilor Web, n contextul direciei de evoluie spre Web-ul semantic detalii n
lucrrile lui Sabin Buraga, Tehnologii XML, Polirom, Iai, 2006 i Sabin Buraga,
Semantic Web, Matrix Rom, Bucureti, 2004.
Printre problemele actuale care trebuie rezolvate numr cele legate de
neconcordane semantice ntre servicii la nivel de:
coninut de exemplu, un serviciu Web care furnizeaz localizarea unei
resurse multimedia (e.g., un film) ntoarce adresa numeric (IP) a serverului de
stocare, dei solicitantul dorete URI-ul acelei resurse;
306
SERVICII WEB
RETROSPECTIV I PERSPECTIVE
307
Referine
Abbas, A., Grid Computing: A Practical Guide to Technology and Applications, Charles River
Media, 2004
Acostchioaie, D., Securitatea sistemelor Linux, Polirom, Iai, 2003
Albin, S., The Art of Software Architecture: Design Methods and Techniques, Wiley & Sons,
2003
308
SERVICII WEB
RETROSPECTIV I PERSPECTIVE
309
* * *, Globus: http://www.globus.org/
* * *, IBMs DeveloperWorks Web Services: http://www-136.ibm.com/developerworks/
webservices
* * *, Iniiativa Electronic Business XML: http://www.ebxml.org/
* * *, Iniiativa WS-I: http://www.ws-i.org/
* * *, Microsoft WSE (Web Services Enhancements): http://msdn.microsoft.com/webservices/
building/wse/
* * *, OWL-S: http://www.daml.org/services/owl-s/1.1/overview/
* * *, Proiectul GlassFish: http://java.sun.com/javaee/GlassFish
* * *, Proiectul WSRF.NET: http://www.cs.virginia.edu/~gsw2c/WSRFdotNet/
* * *, Security in a Web Services World: A Proposed Architecture and Roadmap, IBM &
Microsoft, 2002: http://www-106.ibm.com/developerworks/library/ws-secmap/
* * *, Situl dedicat serviciilor Web: http://www.webservices.org/
* * *, Soluiile de securitate XML oferite de Verisign: http://www.verisign.com/xml/
* * *, SWSF (Semantic Web Services Framework): http://www.daml.org/services/swsf/
1.0/overview/
* * *, Web Services Activity: http://www.w3.org/2002/ws/
* * *, Web Services Addressing: http://www.w3.org/Submission/ws-addressing/
* * *, Web Services AtomicTransactions: http://www.ibm.com/developerworks/webservices/
library/ws-atomtran
* * *, Web Services Business Activity: http://www.ibm.com/developerworks/webservices/
library/ws-busact
* * *, Web Services Coordination: http://www.ibm.com/developerworks/webservices/
library/ws-coor
* * *, Web Services Dynamic Discovery: http://msdn.microsoft.com/library/en-us/dnglobspec/
html/ws-discovery.pdf
* * *, Web Service Enumeration: http://msdn.microsoft.com/library/en-us/dnglobspec/
html/ws-enumeration.pdf
* * *, Web Services Eventing: http://xml.coverpages.org/WS-Eventing200408.pdf
* * *, Web Services Interoperability Technology: http://wsit.dev.java.net/
* * *, Web Services Metadata Exchange: ftp://www6.software.ibm.com/software/developer/
library/WS-MetadataExchange.pdf
* * *, Web Service Modeling Ontology: http://www.wsmo.org/
* * *, Web Services Policy Assertions Language: http://www-106.ibm.com/developerworks/
library/ws-polas
* * *, Web Services Policy Attachment: http://www-106.ibm.com/developerworks/webservices/
library/ws-polatt
* * *, Web Services Resource Framework: http://www.globus.org/wsrf/
* * *, Web Services Security: SOAP Message Security: http://www.oasis-open.org/committees/
tc_home.php?wg_abbrev=wss
* * *, Web Service Transfer: http://msdn.microsoft.com/library/en-us/dnglobspec/html/
ws-transfer.pdf
* * *, WFMC (WorkFlow Management Coalition): http://www.wfmc.org/
* * *, World Wide Web Consortium, Boston, 2006: http://www.w3.org/
Acronime
A2A Application to Application
ACID Atomicity, Consistency, Isolation, Durability
ACL Access Control List
AHAH Asynchronous HTML and HTTP
AJAX Asynchronous JavaScript and XML
ALE AJAX Linking and Embedding
ANSI American National Standards Institute
AMI Application Messaging Interface
API Application Programming Interface
ASAP Asynchronous Service Access Protocol
ASCII American Standard Code for Information Interchange
ASF Apache Software Foundation
ASP Active Server Pages/Application Service Provider
AT Atomic Transaction
AWS Amazon Web Services
B2B Business to Business
B2Bi Business to Business Integration
BASH Bourne Again SHell
BSD Berkeley Software/Standard Distribution
BPEL Business Process Execution Language
BPEL4WS Business Process Execution Language for Web Services
BPM Business Process Management
BTP Business Transaction Protocol
CA Certification Authority
CC Creative Commons
CC/PP Composite Capability/Preference Profiles
CGI Common Gateway Interface
CLR Common Language Run-time
CMS Content Management System
CoG Commodity Grid
COM Common Object Model
CORBA Common Object Request Broker Architecture
312
ACRONIME
ACRONIME
313
314
ACRONIME
ACRONIME
315
316
ACRONIME
Bibliografie general
Abbas, A., Grid Computing: A Practical Guide to Technology and Applications, Charles River
Media, 2004
Anghel, T., Programarea n PHP. Ghid practic, Polirom, Iai, 2005
Asleson, R., Schutta, N., Foundations of AJAX, Apress, 2006
Buraga, S., Tehnologii XML, Polirom, Iai, 2006: http://www.infoiasi.ro/~busaco/
books/xml/
Buraga, S.,Proiectarea siturilor Web (ediia a doua), Polirom, Iai, 2005: http://www.infoiasi.ro/
~design/
Buraga, S., Semantic Web, Matrix Rom, Bucureti, 2004: http://www.infoiasi.ro/~sweb/
Buraga, S. (coord.), Tendine actuale n proiectarea i dezvoltarea aplicaiilor Web, Matrix Rom,
Bucureti, 2006: http://www.infoiasi.ro/~busaco/books/nw05/
Buraga, S. (coord.), Situri Web la cheie. Soluii profesionale de implementare, Polirom, Iai,
2004: http://www.infoiasi.ro/~busaco/books/webapps/
Cabrera, L.F., Kurt, C., Web Services Architecture and Its Specifications, Microsoft Press,
2005
Daconta, M., Obrst, L., Smith, K., The Semantic Web: A Guide to the Future of XML, Web
Services, and Knowledge Management, John Wiley & Sons, 2003
Daum, B., Merten, U., System Architecture with XML, Elsevier Science, 2003
Erl, T., Service-Oriented Architecture: Concepts, Technology, and Design, Prentice Hall PTR,
2005
Geroimenko, V., Dictionary of XML Technologies and the Semantic Web, Springer-Verlag,
2004
Guruge, A., Web Services: Theory and Practice, Digital Press, 2004
Hartman, B. et al., Mastering Web Services Security, Wiley Publishing, 2003
Harold, E., XML 1.1 Bible (3rd Edition), Wiley Publishing, 2004
Kulchenko, P., Ray, R., Programming Web Services with Perl, OReilly, 2002
Linthicum, D., Enterprise Application Integration, Addison-Wesley, 1999
Myerson, J., The Complete Book of Middleware, Auerbach Publications, 2002
Mueller, J., Mining Google Web Services: Building Applications with the Google API, Sybex, 2004
Newcomer, E., Lomow, G., Understanding SOA with Web Services, Addison-Wesley, 2004
ONeill, M. et al., Web Services Security, McGraw-Hill/Osborne, 2003
Perry, B., AJAX Hacks, OReilly, 2006
318
BIBLIOGRAFIE GENERAL
Powell, T., Schneider, F., JavaScript 2.0: The Complete Reference (Second Edition), McGraw-Hill/
Osborne, 2004
Robinson, S. et al., Professional C# (Third Edition), Wiley Publishing, 2004
Shiflett, C., HTTP Developers Handbook, Sams Press, 2003
Si Shi, N., Murthy, V.K., Architectural Issues of Web-Enabled Electronic Business, Idea Group
Publishing, 2003
Sklar, D., Trachtenberg, A., PHP Cookbook, OReilly, 2002
Tanas, ., Olaru, C., Andrei, ., Java de la 0 la expert, Polirom, Iai, 2003
Tidwell, D., Snell, J., Kulchenko, P., Programming Web Services with SOAP, OReilly, 2001
Topley, K., Java Web Services in Nutshell, OReilly, 2003
Waltz,E., Knowledge Management in the Intelligence Enterprise, Artech House, 2003
Weerawarana, S. et al., Web Services Platform Architecture, Prentice Hall PTR, 2005
Zakas, N., McPeak, J., Fawcett, J., Professional AJAX, Wrox Press, 2006
Zeldman, J., Designing with Web Standards, New Riders Press, 2003
* * *, Apache XML: http://www.apache.com/
* * *, API-urile puse la dispoziie de Google: http://www.google.com/apis/
* * *, Apple Developer Connection: http://developer.apple.com/
* * *, ASP.NET: http://www.asp.net/
* * *, Caf con Lche: http://www.cafeconleche.org/
* * *, Code Project: http://www.codeproject.com/
* * *, Developers.net: http://www.developers.net/
* * *, Dezvoltarea de aplicaii SOAP pentru Pocket PC: http://www.pocketsoap.com/
* * *, ebXML: http://www.ebxml.org/
* * *, Fundaia Mozilla: http://www.mozilla.org/
* * *, IBM Developers Site: http://www.ibm.com/developer/
* * *, Iniiativa WS-I: http://www.ws-i.org/
* * *, Instrumente XML disponibile la Apache: http://xml.apache.org/
* * *, Interop Month: http://www.interopmonth.com/
* * *, Java Coffee-Break: http://www.javacoffeebreak.com/
* * *, Java & Web Services: http://java.sun.com/webservices/
* * *, JCP (Java Community Process): http://jcp.org/
* * *, Lista specificaiilor privitoare la limbajele bazate pe XML: http://xml.coverpages.org/
* * *, Microsoft Developers Network: http://msdn.microsoft.com/
* * *, Mozilla Developer Center: http://developer.mozilla.org/
* * *, OReilly OnLAMP: http://www.onlamp.com/
* * *, OReilly OnDotNET: http://www.ondotnet.com/
* * *, OReilly OnJava: http://www.onjava.com/
* * *, Organizaia OASIS (Organization for the Advancement of Structured Information Standards):
http://www.oasis-open.org/
* * *, OSI (Open Source Initiative): http://www.opensource.org/
* * *, Planet Source Code: http://www.planet-source-code.com/
* * *, Perfect XML: http://www.perfectxml.com/
* * *, Perl: http://www.perl.com/
BIBLIOGRAFIE GENERAL
319
Sabin Buraga
www.polirom.ro
Coperta: Radu Rileanu
Tehnoredactor: Gabriela Gheu
Bun de tipar: octombrie 2006. Aprut: 2006
Editura Polirom, B-dul Carol I nr. 4 P.O. Box 266
700506, Iai, Tel. & Fax (0232) 21.41.00 ; (0232) 21.41.11;
(0232) 21.74.40 (difuzare); E-mail: office@polirom.ro
Bucureti, B-dul I.C. Brtianu nr. 6, et. 7, ap. 33,
O.P. 37 P.O. Box 1-728, 030174
Tel.: (021) 313.89.78; E-mail: office.bucuresti@polirom.ro
Tiparul executat la S.C. LUMINA TIPO s.r.l.
str. Luigi Galvani nr. 20 bis, sect. 2, Bucureti
Tel./Fax: 211.32.60, 212.29.27, E-mail: office@luminatipo.com