l. alboaie, s. buraga: "servicii web. concepte de bază și implementări" (2006)

320
LENU}A ALBOAIE, SABIN BURAGA Servicii Web Inteligen]\ artificial\ [i web semantic

Upload: sabin-buraga

Post on 13-May-2015

1.087 views

Category:

Technology


7 download

DESCRIPTION

Varianta electronică a volumului "Servicii Web. Concepte de bază și implementări" (320 pagini, ISBN 973-681-522-6, Editura Polirom, 2006) realizat de Lenuța Alboaie și Sabin Buraga. Cartea e adresată programatorului Web (viitor sau actual) și inițiază cititorul într-un mod sistematic în tehnologiile și metodologiile de dezvoltare a serviciilor Web. Implementările sunt detaliate în cele mai utilizate limbaje, via instrumente și platforme care oferă suport pentru crearea și invocarea de servicii Web conform paradigmei SOAP. Pentru detalii, a se vizita http://profs.info.uaic.ro/~busaco/books/ws/

TRANSCRIPT

Page 1: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

LENU}A ALBOAIE, SABIN BURAGA

Servicii WebInteligen]\ artificial\ [i web semantic

Page 2: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

Bruna Zani, Augusto Palmonari (a cura di), Manuale di psicologia di comunità

© 1996 by Società editrice il Mulino, Bologna

© 2006 by Editura POLIROM

www.polirom.ro

Editura POLIROMIaºi, B-dul Carol I nr. 4, P.O. BOX 266, 700506Bucureºti, B-dul I.C. Brãtianu nr. 6, et. 7, ap. 33, O.P. 37; P.O. BOX 1-728, 030174

Descrierea CIP a Bibliotecii Naþionale a României:

ALBOAIE, LENUÞA

Servicii web: concepte de bazã ºi implementãri / Lenuþa Alboaie, Sabin Buraga. Iaºi :Polirom, 2006

ISBN (10) 973-681-522-6ISBN (13) 978-973-681-522-5

I. Buraga, Sabin

004.42004.738.5

Printed in ROMANIA

Lenuþa Alboaie este doctorandã la Universitatea �Al.I. Cuza� din Iaºi ºi are ca domenii de interesserviciile Web ºi sistemele distribuite. În prezent, este cercetãtor programator la Axiologic Research,SRL ºi cadru asociat al Facultãþii de Informaticã a Universitãþii �Al.I. Cuza�.

Seria Web este coordonatã de dr. Sabin Buraga(Facultatea de Informaticã, Universitatea �Al.I. Cuza�, Iaºi)

Sabin Buraga este lector doctor la Facultatea de Informaticã a Universitãþii �Al.I. Cuza� din Iaºi,fiind titularul cursurilor �Tehnologii Web�, �Semantic Web�, �Interacþiune om-calculator� ºi �Reþelede calculatoare�. Este laureat al Premiului �Gheorghe Cârtianu� al Academiei Române (2005). Maimulte amãnunte privitoare la activitãþile sale sunt disponibile pe Web la adresa http://www.infoiasi.ro/~busaco. La Editura Polirom a mai publicat: Atelier de programare în reþele de calculatoare (în colaborare,2001), Programare Web în bash ºi Perl (în colaborare, 2002), Proiectarea siturilor Web. Design ºi funcþionalitate+ CD (2002), Aplicaþii Web la cheie (coord., 2003), Utilizare Linux (în colaborare, 2004), Situri Web lacheie. Soluþii profesionale de implementare (coord., 2004), Proiectarea siturilor Web. Design ºi funcþionalitate + CD(ediþia a II­a, 2005) ºi Primii paºi în Linux (în colaborare, 2006).

Page 3: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

POLIROM2006

Page 4: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)
Page 5: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

Cuprins

Prefaþã ................................................................................................................................................ 9

Capitolul 1. Prezentare generalã a serviciilor Web ...............................................131. Preambul .......................................................................................................................... 13

1.1. Protocolul HTTP pe scurt ................................................................................ 132. Arhitectura orientatã spre servicii Web ................................................................... 19

2.1. Introducere ............................................................................................................ 192.2. Programarea aplicaþiilor Web ........................................................................... 202.3. Servicii Web. Punerea problemei .................................................................... 212.4. Conceptul de serviciu Web bazat pe XML .................................................. 262.5. Modalitãþile de implementare ºi exploatare .................................................. 34

Referinþe ................................................................................................................................... 36

Capitolul 2. Familia XML ........................................................................................................ 391. Preliminarii ....................................................................................................................... 392. XML (Extensible Markup Language) ............................................................................. 40

2.1. Caracterizare ºi trãsãturi esenþiale ................................................................... 402.2. Pãrþi componente ale unui document XML ................................................ 412.3. Membrii constituenþi ai familiei XML ........................................................... 432.4. Spaþiile de nume XML ....................................................................................... 442.5. XML Infoset ......................................................................................................... 452.6. Validarea documentelor XML .......................................................................... 472.7. Procesarea documentelor XML ....................................................................... 54

Referinþe ................................................................................................................................... 59

Capitolul 3. Descrierea serviciilor Web .............................................................................. 611. Punerea problemei ......................................................................................................... 612. WSDL (Web Service Description Language) ................................................................... 62

2.1. Modelul conceptual al WSDL .......................................................................... 642.2. Diferenþele dintre specificaþiile WSDL 1.1 ºi WSDL 2.0 ......................... 722.3 Exemple de documente WSDL....................................................................... 722.4. Tipuri de operaþii ºi mesaje .............................................................................. 762.5 Platforme ºi instrumente de lucru cu documentele WSDL .................... 78

Referinþe ................................................................................................................................... 84

Page 6: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

Capitolul 4. Protocolul SOAP ................................................................................................ 871. Evoluþia protocoalelor bazate pe XML ................................................................... 87

1.1. Prezentare succintã a protocoalelor din prima generaþie ......................... 871.2. Dezavantajele protocoalelor din prima generaþie ....................................... 90

2. SOAP � scurtã istorie .................................................................................................. 913. SOAP � o vedere de ansamblu ................................................................................. 924. Forma generalã a unui mesaj SOAP.

Procesarea datelor de cãtre serverele SOAP.......................................................... 945. Modelul SOAP � mesaje ºi codificãri ...................................................................... 98

5.1. Mesajele SOAP .................................................................................................... 985.2. Elementul Envelope .............................................................................................. 995.3. Elementul Header ............................................................................................... 1005.4. Corpul mesajului SOAP. Elementul Body .................................................... 1045.5. Maniera de codificare a mesajelor � SOAP Encoding .............................. 1085.6. Reguli de serializare .......................................................................................... 116

6. Maniera de transport al mesajelor SOAP ............................................................. 1196.1. Relaþia dintre SOAP ºi HTTP ....................................................................... 1196.2. Relaþia dintre SOAP ºi transportul de mesaje

de poºtã electronicã (e-mail) .......................................................................... 1227. Apelul de proceduri la distanþã via SOAP RPC ................................................. 1248. Versiuni SOAP ............................................................................................................. 1309. Intermediarii SOAP..................................................................................................... 13010. O privire asupra SOAP 1.1. O comparaþie cu SOAP 1.2 ............................... 133Referinþe ................................................................................................................................. 140

Capitolul 5. Descoperirea serviciilor ................................................................................. 1431. Descoperirea serviciilor Web prin UDDI ............................................................. 143

1.1. Scurt istoric ......................................................................................................... 1441.2. Concepte de bazã ale UDDI ......................................................................... 1441.3. Structura tModel .................................................................................................. 1501.4. Informaþii privitoare la publicarea serviciului ............................................ 1521.5. Taxonomia entitãþilor UDDI ......................................................................... 1531.6. Interfeþe de programare pentru UDDI ....................................................... 1551.7 UDDI ºi SOAP ................................................................................................. 1581.8. UDDI ºi WSDL ................................................................................................ 1591.9. Crearea propriului registru UDDI folosind jUDDI ................................. 171

2. WSIL (Web Service Inspection Language) ...................................................................... 179Referinþe ................................................................................................................................. 182

Capitolul 6. Dezvoltarea ºi utilizarea serviciilor Web ................................................. 1851. Dezvoltarea ºi invocarea de servicii Web

folosind instrumente open source ................................................................................1851.1. Introducere .......................................................................................................... 1851.2. Furnizarea stocurilor de portocale via

un serviciu Web scris în PHP 5 .................................................................... 186

Page 7: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

1.3. Un client PHP pentru serviciul Web privitor la portocale .................... 1881.4. Un serviciu de manipulare a fiºierelor implementat

în Perl cu SOAP::Lite .......................................................................................1891.5 Scrierea în Perl a clientului SOAP ............................................................... 1921.6. Invocarea serviciului de cãtre un client PHP ............................................ 196

2. Inter-operabilitatea între diverse tehnologii,instrumente ºi limbaje de programare a serviciilor Web ................................... 1992.1. Dezvoltarea de servicii Web în .NET Framework .....................................1992.2. Un client C# pentru serviciul creat ............................................................. 2102.3. Accesarea dintr-un script Perl a serviciului Web

implementat în .NET ....................................................................................... 2122.4. Invocarea din PHP a serviciului Web.......................................................... 2132.5. Invocarea de servicii Web externe ................................................................ 2162.6. Folosirea instrumentului gSOAP pentru C/C++ ..................................... 2242.7. Implementarea serviciilor Web în Java ........................................................ 2282.8. Suportul oferit de mediul Delphi pentru crearea

ºi utilizarea serviciilor Web ............................................................................. 2373. Invocarea serviciilor Web în contextul AJAX ..................................................... 245

3.1. Punerea problemei ............................................................................................ 2453.2. Caracteristici importante ale suitei de tehnologii AJAX ......................... 2453.3. Invocarea asincronã a unui serviciu Web via AJAX ............................... 2493.4. Utilizarea bibliotecii Prototype ..........................................................................2553.5. Invocarea directã, din JavaScript, a unui serviciu Web ........................... 2593.6. Transferuri asincrone prin Atlas ASP.NET................................................263

Referinþe ................................................................................................................................. 271

Capitolul 7. Retrospectivã ºi perspective ........................................................................ 2731. Procesul de dezvoltare a serviciilor Web .............................................................. 2732. Alte iniþiative vizând serviciile Web ........................................................................ 275

2.1. Privire de ansamblu .......................................................................................... 2752.2. Adresarea serviciilor prin WS-Addressing ..................................................... 2762.3. Descoperirea serviciilor ................................................................................... 2762.4. Coordonarea serviciilor Web .......................................................................... 2782.5. Accesarea resurselor serviciilor Web ............................................................ 2832.6. Accesarea meta-datelor asociate serviciilor ................................................ 2852.7. Securitatea serviciilor Web .............................................................................. 2862.8. Asigurarea inter-operabilitãþii ......................................................................... 2952.9 Serviciile Web în contextul proceselor de afaceri .................................... 2982.10. Servicii Web pentru grid ................................................................................... 302

3. SOA în contextul noului Web ..................................................................................... 304Referinþe ................................................................................................................................. 307

Acronime ......................................................................................................................................... 311

Bibliografie generalã ........................................................................................................................ 317

Page 8: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)
Page 9: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

Prefaþã

Misiunea cãrþii de faþã este, cel puþin pentru autori, atât una relativ dificilã, cât � maiales! � atrãgãtoare: ne propunem sã prezentãm sistematic unul dintre domeniileimportante, dinamice ºi de succes ale tehnologiilor actuale � serviciile Web. Astfel,adresãm acest volum viitorului sau actualului programator Web care doreºte sã seiniþieze în tehnologiile ºi metodologiile de dezvoltare a serviciilor Web bazate pre-ponderent pe SOAP. Desigur, nu uitãm nici abordarea REST, concretizatã în ilustrareainvocãrii de servicii în mod asincron via suita de tehnologii AJAX.

Plecând de la metafora cã putem asemãna un serviciu Web cu o portocalã, vomîncerca sã �decojim� straturile � poate uneori mai aspre � ale specificaþiilor privitoarela descrierea prin WSDL a interfeþei ºi implementãrii serviciului, la protocolul detransport SOAP ºi la descoperirea prin diverse metode (e.g., UDDI) a serviciilordisponibile în regim public sau privat. Într-un anumit moment vom ajunge ºi la miez,adicã tocmai la prezentarea limbajelor, instrumentelor ºi platformelor ce oferã suportpentru crearea ºi invocarea de servicii Web.

Programatorii se vor putea delecta cu diverse biblioteci, framework-uri ºi servere deaplicaþii, prinzând gustul implementãrii de servicii (cu mult) mai complexe. Nu uitãm sãenumerãm noþiunile de bazã privitoare la familia XML � baza pe care se fundamenteazãîntreg eºafodajul de limbaje ºi iniþiative privitoare la serviciile Web � ori sã �tragem cuochiul� la livada de portocali actuali, (re)prezentând perspectivele domeniului.

Materialul îi are drept destinatari pe toþi cei interesaþi de tehnologiile Web în generalºi de servicii Web în special: studenþi de la facultãþi de profil, elevi din clasele terminale,dezvoltatori din cadrul companiilor, alte categorii de specialiºti în informaticã sau îndomenii conexe. Notãm, en passant, cã una dintre cerinþele obligatorii ale secþiuniiSoftware Design a deja bine-cunoscutei competiþii internaþionale Imagine Cup este cafiecare echipã concurentã sã implementeze cel puþin un serviciu Web�

Vom descrie în continuare structura lucrãrii de faþã.Capitolul 1 conþine o prezentare generalã a serviciilor Web, în contextul dezvoltãrii

aplicaþiilor distribuite bazate pe XML. Tot aici realizãm o trecere în revistã a carac-teristicilor principale ale protocolului HTTP, introducem SOA (arhitectura orientatãspre servicii) ºi discutãm necesitatea existenþei tehnologiilor SOAP, WSDL, UDDI,REST.

Al doilea capitol se focalizeazã asupra familiei de limbaje XML. Descriem sintaxa,spaþiile de nume, manierele de validare ºi tehnicile de procesare a documentelor XML.Insistãm asupra unor concepte privitoare la XML Schema ºi modelul DOM, deoarecene vor fi de folos pe parcursul cãrþii.

Page 10: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

PREFAÞÃ10

Cel de-al treilea capitol este dedicat manierei de descriere a serviciilor Web. Înprimul rând, ne oprim asupra limbajului WSDL: componente, tipuri de documente, deoperaþii ºi de mesaje, exemple ºi instrumente de lucru.

În cadrul capitolului patru detaliem �inima� serviciilor Web � SOAP. Dupã osuccintã prezentare a protocoalelor de transport bazate pe XML, realizãm o privire deansamblu a protocolului SOAP. De asemenea, printre altele, sunt descrise: structura ºimaniera de codificare a mesajelor, modul de procesare ºi transport ale datelor, relaþiadintre SOAP ºi HTTP ºi diferenþele dintre versiunile în vigoare ale acestui importantprotocol.

Capitolul cinci are drept subiect descoperirea serviciilor Web. Prima parte sefocalizeazã asupra UDDI, unul dintre cele mai populare mecanisme de cãutare aserviciilor, mai ales prin prisma proceselor de afaceri pe care le modeleazã. Dupãdetalierea arhitecturii UDDI, a tipurilor de informaþii stocate ºi a intimitãþilor privindfuncþionarea, oferim ºi o soluþie practicã de constituire a unui registru UDDI propriuprin intermediul instrumentului open source jUDDI. A doua parte a capitolului vizeazãdescoperirea dinamicã a serviciilor prin WS-Inspection.

Pentru unii dintre cititorii mai grãbiþi, capitolul ºase ar putea reprezenta cea maiincitantã parte a volumului, deoarece cuprinde �reþete� de �sãdire� a serviciilor Web �fie ele referitoare la portocale (albastre) sau la alte aspecte � ºi de �consumare� afuncþionalitãþilor 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 elecomerciale sau liber disponibile. Tot aici punctãm etapele care trebuie parcurse pentruaccesarea serviciilor Web externe (Google ºi XMethods) ºi ilustrãm principiile de bazãale suitei de tehnologii AJAX. Prezentãm, de asemenea, maniera de invocare asincronãa serviciilor Web, fie direct � via programe JavaScript �, fie pe baza unor biblioteci ºiframework-uri precum Prototype ºi Atlas ASP.NET.

Ultimul capitol realizeazã o recapitulare a tematicilor atinse ºi traseazã diversedirecþii de evoluþie, invitându-i pe cei interesaþi sã aprofundeze domeniul. Astfel,prezentãm succint iniþiative industriale ca WS-Addressing, WS-Discovery, WS-Coordinationsau WS-AtomicTransaction. Suplimentar, punem în discuþie aspecte referitoare la ingineria,securitatea ºi asigurarea inter-operabilitãþii serviciilor Web. Spre final, �degustãm� rapidrolul serviciilor Web în cadrul proceselor de afaceri, al sistemelor de tip grid ºi al nouluiWeb (ale cãrui tendinþe sunt cunoscute sub denumirea genericã de Web 2.0, etapãpreliminarã Web-ului semantic).

Volumul se încheie cu un set cuprinzãtor de acronime folosite în text ºi, în modfiresc, cu o bibliografie generalã.

Aceastã carte nu ar fi ajuns la forma actualã fãrã ajutorul oferit � atât prinparcurgerea versiunilor preliminare, cât ºi prin formularea unor sugestii utile � de SînicãAlboaie, Mihaela Brut, Diana Gorea, Adrian Iftene, Loredana ºi ªtefan Tanasã ºi, nu în ultimulrând, Cosmin Vârlan. Suntem recunoscãtori profesorilor noºtri Toader Jucan, CorneliusCroitoru, Dorel Lucanu ºi Henri Luchian, de la Facultatea de Informaticã a Universitãþii�Alexandru Ioan Cuza� din Iaºi. De asemenea, mulþumim familiilor noastre ºi echipeide profesioniºti a Editurii Polirom.

Page 11: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

11PREFAÞÃ

La finalul acestei prefeþe trebuie sã menþionãm contribuþiile autorilor, dupã cumurmeazã: capitolele 3, 4 ºi 5 au fost redactate în principal de Lenuþa Alboaie, care arealizat ºi implementarea exemplelor de servicii Web scrise în limbajele C/C++, Javaºi Visual Basic .NET din cadrul capitolului 6. Restul materialului, inclusiv ilustraþiile, afost preponderent conceput de Sabin Buraga.

Pentru experimentarea codului-sursã al programelor incluse, nu ezitaþi sã vizitaþiadresa http://www.infoiasi.ro/~busaco/books/ws/. De asemenea, vã invitãm sã ne contactaþiprin poºta electronicã la [email protected] ºi, respectiv, [email protected].

AutoriiIaºi, 3 septembrie 2006

Page 12: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)
Page 13: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

Capitolul 1

Prezentare generalã a serviciilor Web

�Cea mai bunã cale de a prezice viitoruleste sã-l inventãm.�

(Alan Key)

1. Preambul

Spaþiul World Wide Web reprezintã un sistem de distribuþie localã sau globalã ainformaþiilor hipermedia, vãzut ca univers informaþional compus din elemente deinteres, denumite resurse, desemnate de identificatori globali � URI (UniformResource Identifiers).

Din punct de vedere tehnic, Web-ul pune la dispoziþie un sistem global ºistandardizat de comunicare multimedia (summum de media), informaþiile fiindorganizate asociativ ºi distribuite în funcþie de cererile utilizatorilor, funcþionândconform modelului client/server. Prin definiþie, clientul (în cazul nostru denumitºi navigator sau agent-utilizator Web) solicitã servicii (informaþii) de la com-ponenta server. Serverul rãspunde aºadar cererilor clienþilor, protocolul folositfiind, uzual, HTTP (HyperText Transfer Protocol).

1.1. Protocolul HTTP pe scurt

Datã fiind importanþa protocolului HTTP, vom realiza în continuare o trecere înrevistã a caracteristicilor sale importante.

Protocolul HTTP, standardizat de documentul RFC 2616, este folosit înspecial pentru hipertext, dar poate fi considerat drept protocol generic, bazacomunicãrii într-un sistem distribuit de management al datelor, în cazul WWWfiind vorba în principal de facilitarea transferului de date între clienþii ºi servereleWeb. Fiind un protocol utilizat în Internet, HTTP se situeazã la nivelul deaplicaþii al stivei de protocoale TCP/IP (Transmission Control Protocol/InternetProtocol), putând fi considerat fiabil (reliable).

Page 14: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB14

Concepte fundamentale

Conceptele de bazã sunt cererea ºi rãspunsul: un client Web trimite un mesaj(cererea) la un server. Mesajul conþine identificatorul resursei dorite, dat subforma unui URI (Uniform Resource Identifier), metoda de acces folositã, versiuneaprotocolului, precum ºi o serie de meta-informaþii care pot fi utile serverului.Rãspunsul serverului cuprinde un cod indicând starea serverului dupã inter-pretarea cererii, un mesaj explicativ pentru codul de stare transmis, meta--informaþiile care vor fi procesate de cãtre client ºi, eventual, un conþinut (e.g.,resursa solicitatã).

În general, o sesiune de comunicare HTTP este iniþiatã de cãtre client ºiconstã din solicitarea unei resurse (o paginã Web, uzual) identificatã unic pe unserver cunoscut. Acesta este numit ºi server de origine datoritã faptului cã încomunicarea între client ºi server pot sã aparã unul sau mai mulþi intermediari:proxy (numit ºi server proxy), poartã (gateway) sau tunel (tunnel). Entitatea proxyreprezintã un intermediar care retrimite un mesaj HTTP, eventual modificând oparte a sa. Poarta semnificã un intermediar care se poate situa înaintea unuiserver de origine ºi sã se identifice drept acesta, clientul Web necunoscând acestaspect. Tunelul este un intermediar care nu schimbã conþinutul mesajului, ci arerolul 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, desemnând un depozit local destocare (în memorie, pe disc) a mesajelor (datelor) la nivel de server/client. Unproxy deþine obligatoriu un cache, denumit ºi sistem de cache.

Un exemplu tipic de cerere-rãspuns este urmãtorul, în care cererea � formulatãde un browser � are forma:

GET /catalog_produse.html HTTP/1.1Host: www.portocale.infoUser-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;rv:1.8.0.5) Gecko/20060719 Firefox/1.5.0.5Accept: text/html, image/gif, image/jpeg, */*Accept-Language: en-usAccept-Encoding: gzip, deflate, compress, identityConnection: Keep-Alive

Un posibil rãspuns � obþinut din partea serverului Web � ar putea fi urmãtorul(am omis conþinutul propriu-zis al documentului solicitat):

Date: Tue, 22 Aug 2006 07:17:13 GMTServer: Apache/2.0.54 (Win32) PHP/5.0.4

Page 15: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

15PREZENTARE GENERALÃ A SERVICIILOR WEB

Accept-Ranges: bytesContent-Length: 201Keep-Alive: timeout=15, max=74Connection: Keep-AliveContent-Type: text/html; charset=ISO-8859-1...

Adresarea resurselor via URI

Modalitatea de adresare a resurselor Web este reprezentatã de identificatorii uniformide resurse � URI (Uniform Resource Identifiers). Mulþimea URI e compusã dinlocalizatori uniformi de resurse � URL (Uniform Resource Locator) � ºi nume uniformede resurse � URN (Uniform Resource Name).

Adresele de tip URL sunt folosite în localizarea unei resurse în reþea (înspecial în Internet) prin protocolul HTTP, având forma bine-cunoscutãhttp://server:port/cale?interogare, unde în mod implicit, dacã nu e precizat, portul seconsiderã 80, iar cale reprezintã un ºir de directoare delimitate de �/�, terminateventual cu numele fiºierului care stocheazã resursa adresatã prin intermediulURL-ului. Componenta interogare este opþionalã ºi desemneazã un ºir suplimentar,incluzând informaþii interpretate de resursã (de cele mai multe ori de un script).

De precizat faptul cã o serie de caractere sunt rezervate, cum ar fi simbolurile�;�, �/�, �?�, �:�, �@�, �&�, �=�, �+� ºi �$�. Aceste caractere speciale suntcodificate conform unei metode denumite URL encoding în care caracterul încauzã este substituit de codul sãu numeric, în baza 16, prefixat de semnul �%�(de exemplu, �~� devine �%7E�).

Un URL poate avea drept sufix un identificator de fragment, precedatde caracterul �#�, cu scopul de a face referire directã la o parte constituentãa resursei adresate de acel URL. Drept exemplificare, se poate da URL-ulhttp://www.portocale.info/catalog_produse.html#albastre.

O adresã de tip URN desemneazã un subset al URI care rãmâne permanentºi unic, chiar dacã resursa a dispãrut ori a devenit inaccesibilã. URN-ul seutilizeazã mai ales pentru a desemna entitãþi (tipuri de date, spaþii de nume etc.)folosite de anumite aplicaþii Web. Drept exemplificãri, enumerãm:

� urn:mozilla:package:communicator identificã pachetele software ale suitei Mozilla;� urn:schemas-microsoft-com:datatypes desemneazã tipurile de date definite de

Microsoft;� urn:ISBN:978-973-46-0249-0 desemneazã numãrul ISBN (International Standard

Book Number) asociat unei cãrþi.

Mai general, adresele URI pot preciza resurse care pot fi accesate prin intermediulunor diverse protocoale (uzual, cele bazate pe TCP/IP). Astfel, forma genericã

Page 16: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB16

a unui identificator uniform de resurse este schema://autoritate/cale?interogare. Oserie de exemple de scheme sunt:

� file:///tmp/ � schemã ce desemneazã resurse de tip fiºier din cadrul sistemuluide stocare de la nivelul clientului (aici, directorul /tmp);

� ftp://ftp.funet.fi/pub/README.txt � schemã utilizatã pentru serviciile pro-tocolului de transfer de fiºiere (FTP);

� https://www.infoiasi.ro/~busaco/teach/ � schemã pentru serviciile protocoluluisecurizat HTTPS � HTTP folosit în conjuncþie cu SSL (Secure Sockets Layer)sau TLS (Transport Layer Security);

� mailto:[email protected] � schemã mailto pentru poºta electronicã;� tag:blogger.com,2006:blog-333 � schemã destinatã sã identifice în mod unic (spaþial

ºi temporal) o anumitã resursã, într-o manierã convenabilã pentru utilizator(în acest caz, este vorba de subiectele de interes ale unui blog);

� uuid:d52c-e89c-01f8-3b53-a25e-89cf-a5bb-ad17 � schemã care specificã un iden-tificator unic universal (UUID � Universal Unique IDentifier) ce desemneazã oanumitã resursã; acest identificator se reprezintã prin 32 de cifre în baza 16ºi se regãseºte uneori ºi sub denumirea de GUID (Globally Unique IDentifier).

Maniera de codificare a conþinutului

Pentru ca datele sã fie corect interpretate de toate entitãþile participante laconversaþia prin reþea, indiferent de platforma hardware ºi software, ele trebuiesã respecte aceeaºi codificare.

Astfel, se defineºte conceptul de set de caractere, pentru a putea interpretacorect datele schimbate via protocolul HTTP între douã platforme diferite (e.g.,un server rulând pe un sistem Linux cu un navigator Web de pe un dispozitivmobil), având reprezentãri diferite ale datelor. Informaþia e transmisã sub formaunui ºir de caractere urmând ca entitatea de la celãlalt capãt, folosind indicaþiiledespre setul de caractere, sã realizeze transformarea din ºir de octeþi în ºir decaractere. Setul de caractere implicit este ISO-8859-1, dar existã o multitudine dealte seturi (de exemplu, ISO-8859-2 denumit ºi Latin-2, care oferã printre alteleºi reprezentarea diacriticelor din limba românã).

Protocolul HTTP respectã seturile de caractere definite de specificaþiile MIME(Multipurpose Internet Mail Extensions) descrise în documentele RFC 2045 ºi 2046.Conform standardului MIME, pentru fiecare resursã în parte se specificã tipul ºisubtipul acesteia. De exemplu, text/html pentru un document HTML, text/plainîn cazul unui document text neformatat, image/png pentru o imagine în formatPNG, application/json în situaþia datelor vehiculate via JSON (JavaScript ObjectNotation), application/soap+xml pentru mesajele SOAP (Simple Object Access Protocol)ºi multe altele.

Page 17: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

17PREZENTARE GENERALÃ A SERVICIILOR WEB

De asemenea, mesajele pot fi codificate prin diverse metode, precum gzip oricompress, în vederea comprimãrii sau asigurãrii identitãþii ºi/sau integritãþii.

Mesajele HTTP

Cererile ºi rãspunsurile HTTP sunt vehiculate prin intermediul mesajelor. Astfel,mesajele HTTP sunt considerate de douã tipuri: cerere provenitã de la un clientcãtre un server ºi rãspuns al serverului, trimis la acel client. Un mesaj e compusdintr-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 destare obþinut de la server, urmatã de un numãr de atribute de antet.

Un antet (header) conþine mai multe atribute care sunt folosite la completareaunei cereri sau a unui rãspuns cu meta-informaþia necesarã interpretãrii corectea mesajului prin stabilirea unor valori specificate de cãtre protocolul HTTP saua unor protocoale definite de utilizator (de exemplu, SOAP). Un atribut estefurnizat printr-un nume urmat de �:� ºi de o valoare (opþionalã, î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 informaþii (reprezentãri deresurse). Un client HTTP (navigator, robot, program de descãrcare, agregatorde ºtiri, player multimedia etc.) foloseºte metoda GET pentru a obþine oanumitã resursã, fie cã ea reprezintã un fiºier (document text, HTML, imaginePNG sau JPEG, aplicaþie, arhivã, document XML etc.), fie cã indicã execuþiape serverul Web a unui proces care va produce datele dorite (e.g., invocareaunui script CGI sau a unui program PHP);

� HEAD este similarã cu metoda GET, dar serverul va întoarce un mesajavând informaþii doar în antet. Meta-datele din anteturile HTTP din rãspunsulla o cerere HEAD vor fi identice cu cele din rãspunsul la o cerere GET.Utilitatea acestei metode constã în obþinerea meta-datelor asociate unei resurseWeb fãrã a transfera efectiv întreaga entitate, în vederea � de exemplu � atestãrii existenþei resursei, a obþinerii datei ultimei modificãri sau furnizareadrepturilor 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 funcþii precum adnotarea resurselor, trimiterea datelor unui formularWeb cãtre server, extinderea unei baze de date printr-o operaþiune de inserare,invocarea unui serviciu etc.

În cadrul unei cereri pot fi specificate diverse atribute, utilizate pentru atransmite serverului informaþii suplimentare privitoare la acea cerere ºi la client.

Page 18: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB18

Se poate face o analogie între trimiterea unei metode HTTP ºi apelul uneifuncþii dintr-un limbaj de programare, unde atributele reprezintã parametrii deintrare.

Dupã primirea ºi interpretarea unui mesaj de tip cerere ºi interpretarea lui, unserver HTTP întoarce un mesaj denumit rãspuns. Prima linie conþine versiuneaprotocolului HTTP implementat de cãtre server ºi continuã cu un cod de starereprezentând un numãr asociat de cãtre specificaþia HTTP unei anumite situaþiia serverului în urma tratãrii unei cereri. Urmeazã un text explicativ pentru codulde stare, menit sã clarifice situaþia exprimatã de acesta.

Codul de stare este format din trei cifre organizate în categorii de stãri;codurile din aceeaºi categorie se referã la stãri similare. Ele se disting dupã primacifrã în modul urmãtor:� Coduri de informare (1xx) � furnizeazã informaþii privitoare la o anumitã

acþiune (cererea a fost primitã, comunicaþia continuã). De exemplu: 100Continue (clientul poate continua cererea, trebuind sã trimitã urmãtoarea partea unui mesaj parþial).

� Coduri de succes (2xx) � raporteazã efectuarea cu succes a unei operaþiuni(cererea a fost primitã, interpretatã ºi acceptatã de cãtre server). Un cod tipicdin aceastã categorie este 200 OK (cererea a fost rezolvatã cu succes). Altexemplu este 204 No Content (serverul a rezolvat cererea, dar nu are ce returnaclientului).

� Coduri de redirecþionare (3xx) � indicã o redirecþionare a cererii spre altãlocaþie ori alt server. Drept exemple, menþionãm codurile 301 Moved Permanently(resursa solicitatã a fost asociatã unui URI nou ºi orice referinþã viitoare la eatrebuie 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ã apariþia unei erori pepartea clientului (fie cererea este incorectã din punct de vedere sintactic, fienu poate fi satisfãcutã din varii motive). Ca exemple, furnizãm 401 Unauthorized(cererea necesitã autentificarea utilizatorului � e.g., via un nume de cont urmatde o parolã) ºi 403 Forbidden (serverul a recepþionat o cerere corectã, darrefuzã sã o satisfacã din diverse motive legate de restricþionarea accesului).Un alt cod tipic, des întâlnit, este 404 Not found (serverul nu gãseºte resursaspecificatã).

� Coduri de eroare generate de server (5xx) � desemneazã coduri semnificândo eroare pe partea serverului (cererea este aparent corectã, dar serverul nu opoate îndeplini din anumite motive). Drept exemplificare menþionãm 503Service Unavailable (serverul Web nu poate satisface cererea � e.g., din cauzasupraîncãrcãrii temporare sau din raþiuni de administrare).

Page 19: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

19PREZENTARE GENERALÃ A SERVICIILOR WEB

Lista tuturor codurilor de stare este disponibilã în specificaþiile HTTP.În tabelul de mai jos poate fi parcursã lista unora dintre cele mai importante

atribute care însoþesc mesajele HTTP.

Atribut HTTP Semnificaþie

Accept

Specific unei cereri, cu rol în stabilirea tipului conþinutului prinintermediul unei negocieri conduse de server; clientul are posi-bilitatea de a furniza tipurile media (MIME) pe care acesta lerecunoaºte ºi le poate interpreta sau poate indica numai tipul derãspunsuri preferate. Un exemplu este Accept: text/xml,application/xml

Cache-ControlPermite controlul cache-ului, de cele mai multe ori la nivelulproxy-ului dintre client ºi server � Cache-Control:max-age=600

Connection

Atribut general folosit pentru a specifica anumite proprietãþilegate de conexiune. Se aplicã doar comunicaþiei între douãaplicaþii HTTP din lanþul unor cereri sau rãspunsuri. E util înimplementarea conexiunilor persistente � Connection: close

Content-TypeDesemneazã tipul MIME al reprezentãrii resursei solicitate de unclient ori transmise de server. Un exemplu notoriu esteContent-Type: text/html

HostFolosit într-o cerere pentru specificarea adresei Internet ºi a por-tului în vederea stabilirii exacte a locaþiei unde se aflã resursacãreia i se adreseazã cererea � Host: www.portocale.info

LocationSpecific rãspunsurilor HTTP. Utilizat în conjuncþie cu coduri destare de tip 3xx sau 201 Created. Poate stabili locaþia curentã saupreferatã a resursei sub forma unui URI absolut.

ServerConþine informaþii despre aplicaþia server, cum ar fi numele,versiunea, producãtorul, aplicaþiile compatibile � Server:libwww-perl-daemon/1.36

2. Arhitectura orientatã spre servicii Web

2.1. Introducere

Sistemul pe care ruleazã un server Web ºi care gãzduieºte o serie de pagini(documente) WWW înrudite � ale unei organizaþii, companii sau persoane � senumeºte sit (site). Aceastã colecþie este orientatã, de obicei, cãtre anumiteinformaþii unitare sau scopuri comune.

Din punctul de vedere al vizibilitãþii, un sit Web poate fi disponibil doar încadrul unui intranet (reþeaua internã proprie unei companii sau organizaþii) ºi/sau

Page 20: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB20

în extranet (extindere a facilitãþilor intranetului prin mijlocirea comunicaþiilorîntre intraneturile a douã sau mai multe organizaþii).

O aplicaþie Web reprezintã o colecþie interconectatã de pagini Web cu unconþinut dinamic, menitã sã ofere o funcþionalitate specificã utilizatorilor. Natural,interacþiunea dintre aplicaþie ºi utilizatori are loc prin intermediul unei interfeþeWeb. Deseori, termenii de sit ºi aplicaþie Web sunt folosiþi unul în locul celuilalt,pentru a desemna acelaºi concept. Drept exemple de aplicaþii Web pot fienumerate Amazon, Basecamp, eBay, Expedia, Flickr, Google Maps, PHPMyAdmin,Wikipedia, Yahoo! ºi multe altele.

2.2. Programarea aplicaþiilor Web

Devine evident faptul cã trebuie recurs la un mecanism de generare dinamicã aconþinutului Web redat utilizatorului, prin intermediul browser-ului, în funcþie dedatele de intrare, de modul de navigare printr-un sit ºi de diverºi alþi factori(autentificare, integrare de conþinuturi preluate de pe alte situri, preferinþe etc.).Informaþiile puse la dispoziþie pot fi eterogene, provenind din surse de datemultiple (fiºiere text, baze de date, documente XML, stream-uri multimedia,arhive software, rezultate ale unor operaþii efectuate la distanþã, pe alte calcu-latoare, ºi aºa mai departe).

Din punct de vedere istoric, prima metodã de generare dinamicã pe server areprezentãrilor unor resurse solicitate de un client Web vizeazã standardul de factoCGI (Common Gateway Interface). Principalele dezavantaje sunt cele privitoare lainvocarea concurentã a mai multor script-uri CGI, problemele survenite fiindasigurarea scalabilitãþii, a integrãrii cu alte aplicaþii, persistenþa conexiunii ºicontextul invocãrii (rulãrii).

Evoluþia a continuat cu apariþia altor interfeþe de programare Web pe parteade server. Astfel, pot fi menþionate mod_perl pentru Apache, NSAPI (NetscapeServer API) ºi ISAPI (Microsoft Internet Services API), funcþionând intern conformmodelului CGI. Ulterior a apãrut ºi tehnologia servlet-urilor Java.

De un succes larg se bucurã însã mediile ºi framework-urile care faciliteazãdezvoltarea de aplicaþii Web, printre cele mai populare numãrându-se ASP(Active Server Pages), ASP.NET (parte integrantã a .NET Framework), PHP (PHP:Hypertext Prepocessor) ºi JSP (Java Server Pages). Principalele avantaje ale acestorafaþã de vechiul, dar încã utilizatul CGI, sunt urmãtoarele: suportul pentrusesiuni, asigurarea load-balancing-ului, conexiunile persistente cu sistemele de bazede date, suportul pentru template-uri de interfaþã, facilitãþile vizând modularitatea,securitatea etc. Desigur, în unele situaþii pot fi folosite ºi cadre de lucru adiþionale.

Page 21: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

21PREZENTARE GENERALÃ A SERVICIILOR WEB

2.3. Servicii Web. Punerea problemei

Premise

Dupã cum am mai menþionat, originile ºi scopurile Web-ului iau în considerareconstituirea unui spaþiu de comunicare interumanã prin intermediul partajãriicunoºtinþelor ºi exploatarea puterii computaþionale puse la dispoziþie de calcu-latoarele interconectate. Se poate observa cu uºurinþã faptul cã interacþiuneadintre om ºi Web se rezolvã prin intermediul formularelor ºi legãturilor hipertext,iar interacþiunea dintre maºini se desfãºoarã pe Web într-o manierã limitatã.

O primã abordare este aceea de a recurge la un mecanism care sã ne permitãapelarea unor operaþii menite a fi executate la distanþã. Astfel, un program clientpoate sã invoce proceduri (metode, funcþionalitãþi) pe alte calculatoare din reþea.Aceastã soluþie este oferitã de paradigma RPC (Remote Procedure Call), pe care ovom prezenta pe scurt în cadrul urmãtoarei secþiuni.

RPC ( Remote Procedure Call)

Mecanismul RPC a apãrut cu mai bine de douã decenii în urmã în lumea UNIXºi a fost/este folosit în construcþia de aplicaþii distribuite pe sisteme eterogene,având la bazã tehnologiile Internet.

Paradigma RPC conferã forþã modelului client/server ºi constituie un instru-ment de programare mai simplu faþã de abordarea clasicã oferitã de socket-uri.Dacã în mod obiºnuit modelul client/server se axeazã mai mult pe partea decomunicaþie între procese aflate pe maºini diferite, RPC este mai aproape deproiectarea clasicã a aplicaþiilor, programatorul focalizându-se pe logica pro-gramului ºi abia la final divizând aplicaþia în componente ºi adãugând suportulde comunicare în reþea.

O aplicaþie RPC va consta dintr-un client ºi un server, serverul fiind localizatpe maºina care executã procedura. Aplicaþia client comunicã prin reþea � viaTCP/IP � cu procedura de pe calculatorul aflat la distanþã, transmiþând argu-mentele ºi recepþionând rezultatele. Clientul ºi serverul se executã ca douãprocese separate care pot rula pe calculatoare diferite din reþea.

Aceste procese client ºi server comunicã în mod transparent, prin intermediula douã interfeþe numite ciot (stub): va exista deci un stub pentru client ºi altulpentru server. Interfeþele implementeazã protocolul RPC, care specificã modulcum se construiesc ºi cum se prelucreazã mesajele emise între procesele client ºiserver. Stub-urile se genereazã de obicei cu ajutorul unui utilitar, dupã care se�leagã� de programele client ºi server. Fiºierele stub conþin funcþii care translateazã

Page 22: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB22

(de obicei, fãrã aportul programatorului) apelurile locale de procedurã într-osecvenþã de apeluri de funcþii RPC de reþea. Astfel, din punctul nostru de vedere,totul se considerã a fi un simplu apel local. Clientul �cheamã� procedurile dinstub-ul sãu prin care utilizeazã biblioteca RPC pentru a gãsi procesul la distanþã,urmând ca apoi sã-i transmitã cereri. Procesul la distanþã �ascultã� reþeaua prinintermediul stub-ului propriu. Stub-ul serverului realizeazã invocarea rutinelordorite cu ajutorul unei interfeþe de apel de proceduri locale.

Clientul ºi serverul trebuie sã comunice prin mesaje, utilizând o reprezentarea datelor independentã de calculator ºi de sistemul de operare. RPC adoptã unformat propriu pentru reprezentarea datelor, cunoscut sub numele de XDR(External Data Representation) ºi descris pe larg în documentul RFC 1014. Tipurilestandard suportate de XDR sunt cele uzuale din limbajul C (precum int, unsignedint, float sau void), plus altele, suplimentare. Stub-urile client ºi server suntresponsabile ºi cu translatarea în ºi din acest format. Se permite translatareatipurilor predefinite din C, precum ºi a unor tipuri mai complexe, cum ar fivectorii de lungime variabilã. Operaþia de (de)codificare se numeºte (de)serializaresau (un)marshalling.

O facilitate importantã oferitã de RPC este ascunderea în totalitate a pro-cedurilor de reþea în interiorul interfeþelor stub. Acest aspect conduce la simplifi-carea programelor client ºi server, eliminându-se necesitatea de a controla detaliilelegate de comunicarea în reþea. Deoarece sistemul RPC încearcã sã ascundãdetalii legate de reþea, el include de obicei o convenþie legatã de schimbul deargumente ºi rezultate între client ºi server, mãrindu-se astfel gradul de porta-bilitate a aplicaþiilor.

Astfel, RPC pune premisele oferirii de servicii (a cãror implementare nutrebuie sã fie cunoscutã de cãtre clientul care doreºte sã-l foloseascã), adreseleclientului, serverului ºi numele serviciilor fiind pãstrate la nivel simbolic. Unserviciu de reþea este identificat prin portul la care este oferit ºi unde existã undaemon (proces care ruleazã în fundal) aºteptând cererile de conectare. Un portîn viziunea RPC reprezintã un canal logic de comunicare. Comunicarea cuserviciul se realizeazã via XDR, vehicularea datelor decurgând la nivel binar,conform unor reguli prestabilite de codificare, independente de platformã.

Existã mai multe implementãri ale paradigmei RPC. Prima, de referinþã, a fostoferitã de corporaþia Sun Microsystems, fiind denumitã Open Network ComputingRPC (ONC RPC) � aceasta este de altfel cea mai rãspânditã implementare pentruUNIX/Linux (detalii în RFC 1057). Procedurile la distanþã se vor include într-unprogram la distanþã. Un program aflat la distanþã reprezintã unitatea softwarecare se va executa pe o maºinã aflatã la distanþã. Fiecare program aflat la distanþãcorespunde unui server, putând conþine un set de una sau mai multe proceduri

Page 23: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

23PREZENTARE GENERALÃ A SERVICIILOR WEB

la distanþã ori date globale. Procedurile pot partaja date comune. De remarcatfaptul cã argumentele pasate procedurilor la distanþã trebuie sã fie încapsulateîntr-o structurã (similarã cu struct din limbajul C) pentru a reduce numãrul deargumente transmise procedurii.

Fiecãrui program aflat la distanþã i se va asocia un identificator unic, stocatpe 32 de biþi, iar fiecare procedurã componentã (care va fi executatã în cadrulacelui program) este numerotatã (indexatã) secvenþial de la 1 la n, unde n estenumãrul maxim de proceduri ale acelui program. De asemenea, fiecare programla distanþã va fi însoþit de un numãr întreg pozitiv desemnând versiunea. Primaversiune a unui program de obicei este 1. Urmãtoarele versiuni vor fi identificatede alte numere, în mod unic. Numerele de versiuni oferã posibilitatea de aschimba detaliile de implementare sau extinderea capabilitãþilor aplicaþiilor fãrãa asocia unui program un identificator diferit.

Mecanismul RPC îºi gãseºte utilizãri interesante, dintre care, cea mai impor-tantã o reprezintã accesul la sisteme de fiºiere la distanþã prin NFS (Network FileSystem), prezent în orice mediu UNIX ºi semnificând de fapt un sistem de fiºieredistribuit (distributed file system).

O alternativã la ONC RPC este mediul de calcul distribuit DCE (DistributedComputing Environment), care constituie ºi fundamentul unor servicii de reþeavitale din Windows 2000/XP.

În anii �90, RPC a continuat sã fie utilizat prin abordarea obiectualã ORPC(Object RPC), mesajele de cerere ºi rãspuns de la distanþã fiind încapsulate deobiecte. Ca descendenþi direcþi ai ORPC se pot enumera DCOM (DistributedCommon Object Model) ºi IIOP (CORBA Internet Inter-ORB Protocol). ArhitecturaJava pune la dispoziþie RMI (Remote Method Invocation), iar platforma .NET oferãaºa-numitul .NET Remoting.

Necesitatea unei arhitecturi orientate spre servicii. Caracterizare

Odatã cu proliferarea aplicaþiilor Web, dezvoltatorii ºi-au dat seama cã nevoileindustriei de profil au crescut, dorindu-se existenþa unor soluþii multi-platformãslab-conectate. Acestea conduc la integrarea aplicaþiilor, serviciilor ºi sistemelor,prin folosirea tehnologiilor Web actuale. Aceastã integrare trebuie sã se realizezeîntr-un mod flexibil, ad hoc, în funcþie de necesitãþi. De asemenea, trebuie atinsun grad înalt de performanþã prin asigurarea scalabilitãþii ºi e necesarã existenþaunui suport pentru crearea ºi exploatarea unor servicii ataºabile (pluggable) ºi�inteligente�; software-ul fiind vãzut în termeni de serviciu ºi nu drept aplicaþiemamut (�software as service�).

Aceasta pune premisele constituirii unor ofertanþi de servicii de aplicaþii(application service provider). De asemenea, apare necesitatea proiectãrii ºi (re)folosirii

Page 24: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB24

unor standarde pentru îndeplinirea cerinþelor legate de vehicularea, disponi-bilitatea, mentenanþa, securitatea ºi regãsirea datelor.

Spaþiul Web poate fi considerat din acest punct de vedere ca o tehnologiemiddleware, extensie a unor modele precum CORBA sau DCOM (a se urmãri ºifigura 1). Componentele intermediare (proxy) la nivel de client ºi server pot jucaacelaºi rol ca interfeþele stub RPC.

Figura 1. Spaþiul Web ca tehnologie middleware

Mai mult decât atât, trebuie puse bazele constituirii unei arhitecturi destinatedezvoltãrii de aplicaþii 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-uluibazat pe componente Web (component-based software), în contrast cu aplicaþiilemonolitice, clasice. Desigur, software-ul standard (�vechi�) trebuie integrat înaceastã nouã arhitecturã pentru a se proteja investiþiile fãcute.

Soluþia este datã de un model cunoscut sub numele de arhitectura orientatã spreservicii (SOA � Service Oriented Architecture). Arhitectura SOA impune adoptareaunui stil de dezvoltare de aplicaþii, considerate drept servicii ce vor fi invocatede alte aplicaþii. Conform OMG (Object Management Group), definiþia � propusã înaprilie 2006 � a arhitecturii orientatã spre servicii este urmãtoarea: SOA reprezintã

Page 25: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

25PREZENTARE GENERALÃ A SERVICIILOR WEB

un stil arhitectural de obþinere a unor valori mutuale de cãtre comunitãþile deofertanþi ºi consumatori de servicii, permiþând participanþilor la aceste comunitãþide interese sã conlucreze într-o manierã cât mai puþin dependentã de tehnologie.Acest stil specificã, de asemenea, contractele pe care organizaþiile, oamenii ºitehnologiile respective trebuie sã le respecte în vederea participãrii în cadrulcomunitãþii, în vederea obþinerii de valori de tip business ºi derulãrii de procese deafaceri. Facilitarea interacþiunilor în cadrul comunitãþii trebuie sã se facã prinintermediul unei varietãþi de tehnologii (prezente ºi viitoare).

Conform enciclopediei colaborative deschise Wikipedia, prin SOA se înþelegeo perspectivã asupra unei arhitecturi software care defineºte utilizarea de servicii,oferind funcþionalitãþi solicitate de utilizatori. Resursele reþelei sunt astfel dis-ponibile graþie unei suite de servicii independente ale cãror implementãri suntnecunoscute.

SOA presupune cã noile servicii pot fi create pe baza celor deja existente,într-o manierã sinergicã, dar componentele sistemului în ansamblu trebuie sãaibã un grad mare de independenþã (de-coupling). În funcþie de schimbãrile cepot interveni în cerinþe (business requirements), serviciile pot fi recompuse sauorchestrate diferit.

Principiile de bazã impuse de prevederile SOA sunt:

� serviciile trebuie sã partajeze un contract formal;� serviciile trebuie sã fie slab conectate (loosely coupled);� serviciile trebuie sã ascundã dezvoltatorului detaliile de implementare;� serviciile trebuie sã ofere suport pentru compunerea cu alte servicii

(composability);� serviciile trebuie sã poatã fi reutilizate;� serviciile trebuie sã se execute într-un mod autonom;� serviciile nu trebuie sã depindã de starea comunicãrii (statelessness), cantitatea

de informaþie specificã unei activitãþi ce trebuie reþinutã fiind minimalã;� serviciile trebuie sã poatã fi facil descoperite (discoverability).

Astfel, arhitectura SOA trebuie sã suporte între aplicaþii paradigme decomunicare bazate pe Web sã ofere o localizare transparentã a serviciilor ºi sãpermitã adãugarea, înlocuirea ºi eliminarea serviciilor în mod dinamic.

Prin intermediul SOA, consumatorii de servicii nu sunt dependenþi deofertanþii de servicii, putând avea acces la o paletã largã de servicii oferindaceleaºi funcþionalitãþi dorite. Serviciul poate fi vãzut doar drept interfaþã,maniera de procesare (business logic) putând fi separatã de serviciul propriu-zis.

Via SOA, utilizarea ºi descoperirea serviciilor se pot realiza în mod dinamic,facilitându-se integrarea la nivel de aplicaþii (A2A � Application to Application)

Page 26: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB26

ºi/sau de afaceri (B2B � Business to Business). Suplimentar, prin intermediulserviciilor se poate realiza managementul proceselor de afaceri (BPM � BusinessProcess Management).

Metodologia de proiectare ºi dezvoltare a aplicaþiilor aliniate prevederilorSOA poartã numele de SOAD (Service-Oriented Analysis and Design). Una dintrepropunerile de astfel de metodologii este cea publicatã de IBM în 2004 � SOMA(Service-Oriented Modelling and Architecture).

2.4. Conceptul de serviciu Web bazat pe XML

Precursori

În mod obiºnuit, putem implementa serviciile Web recurgând la script-uri CGIsau diverse servere de aplicaþii. Interacþiunea tradiþionalã poate decurge înurmãtoarele douã moduri.

Prima manierã este cea funcþionalã (de tip cerere/rãspuns): utilizatorul (nuneapãrat uman) viziteazã o paginã ºi formuleazã o cerere, fie traversând olegãturã hipertext, fie prin intermediul unui formular. Serviciul (implementat deun program conceput într-un anumit limbaj, precum Perl, PHP, C# ori Java)întoarce un rãspuns, adicã o reprezentare � uzual, marcatã în HTML � a resurseisolicitate. Astfel, se acceseazã de la nivelul clientului o anumitã funcþionalitatespecificã pusã la dispoziþie de un server Web.

Cea de a doua este una conversaþionalã (de tip solicitare/rãspuns). Suplimen-tar, se dã posibilitatea exprimãrii unor întrebãri adiþionale în vederea rafinãriicererii: serviciul solicitã date de la utilizator pentru a returna un rãspuns mai bun.

Se poate observa cã serviciul Web, respectând �tradiþia�, expune o interfaþã--utilizator (conceputã în limbajul de marcare HTML în marea majoritate acazurilor) prin intermediul cãreia are loc interacþiunea. Cererile sunt captate viaformulare, utilizatorii umani trebuind sã interpreteze etichetele (labels) ataºatecâmpurilor de dialog, pentru a cunoaºte ce tipuri de date pot fi introduse (seasigurã câmpuri textuale, liste de opþiuni, butoane de tip checkbox ºi radio etc.). Deasemenea, utilizatorii umani trebuie sã interpreteze rãspunsul oferit de serviciuprin parcurgerea rezultatului redãrii de cãtre browser a reprezentãrii (HTML)expediate de server.

Pentru un calculator, activitãþile expuse mai sus sunt dificil de realizat,deoarece programul de interpretare a rezultatului depinde de succesiunea demarcaje ale paginii Web recepþionate. Orice modificare, minorã sau nu, a tag-urilordin cadrul documentului conduce la rescrierea script-ului de prelucrare a ieºiriioferite de serverul Web. Aceastã metodã de �capturare� a informaþiilor incluse

Page 27: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

27PREZENTARE GENERALÃ A SERVICIILOR WEB

într-un document HTML se mai numeºte ºi Web/HTML scrapping ºi se dovedeºtedificil de aplicat în cazul receptãrii de structuri complexe de date.

Definiþii ºi caracterizãri

Serviciile Web bazate pe XML (Extensible Markup Language) fac explicite spe-cificaþiile implicite, putând fi folosite în cadrul interacþiunii dintre maºini. Maimult decât atât, pot fi invocate ºi în cazul necunoaºterii a priori a interacþiunii cualte aplicaþii/servicii Web.

Nu existã o definiþie unanim acceptatã a conceptului de serviciu Web.Conform IBM, reprezintã o aplicaþie modularã bazatã pe tehnologiile Internet,menitã a îndeplini activitãþi specifice ºi conformându-se unui format tehnicspecific. Microsoft considerã serviciile Web ca fiind partea de procesare a datelorunei aplicaþii (application logic) disponibilã la nivel de program ºi beneficiind defuncþionalitãþile oferite de Internet. Dupã Sun, un serviciu Web este o aplicaþiecare acceptã cereri din partea altor sisteme dispuse în Internet sau intranet,mediate de tehnologii de comunicaþie neutre ºi agile.

Un serviciu Web oferã o funcþionalitate specificã accesatã pe baza unuischimb de mesaje marcate în XML. Acest schimb de mesaje e guvernat deanumite reguli. Suplimentar, un serviciu Web se poate autodescrie, folosindmeta-date (date referitoare la date).

Serviciile Web implicã utilizarea unor protocoale de comunicaþie, avândasociate descrieri ale datelor procesate ºi alte interacþiuni cu aplicaþii terþe.Identificarea unui serviciu Web se realizeazã prin intermediul URI-urilor; transfe-rul de date recurge în mod uzual la HTTP, iar definirea structuratã a datelorvehiculate se face via XML. Un serviciu Web poate fi considerat ca fiind compusdintr-o colecþie de funcþii împachetate, interpretate ca o entitate unicã ºi publicateîn spaþiul WWW cu scopul de a fi folosite de alte programe.

Ca exemple de operaþii ce pot fi puse la dispoziþie de serviciile Web, leamintim pe urmãtoarele:

� transformarea datelor primite (e.g., conversii de valori în alte unitãþi de mãsurã);� dirijarea mesajelor (mai ales în cazul �magistralelor� de date specifice,

disponibile la nivel de întreprindere);� interogãri asupra diverselor servere de baze de date relaþionale, obiectuale sau

native XML (de exemplu, furnizarea cataloagelor de produse, a coordonatelorunor localitãþi, a situaþiei unui cont bancar, a istoricului cumpãrãturilorefectuate online etc.);

� orchestrarea conversaþiilor între diferite entitãþi (jucând, din acest punct devedere, rolul de mediatori sau agenþi);

Page 28: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB28

� realizarea de procesãri (calcule) diverse;� aplicarea de politici de acces asupra resurselor;� rezolvarea unor excepþii ce pot surveni într-un context;� solicitarea de aprobãri de la utilizator (e.g., a execuþiei unor aplicaþii de cãtre

o altã entitate).

Drept principale caracteristici ale serviciilor Web menþionãm:

� accesarea, în manierã publicã, se realizeazã printr-o adresã; serviciile Web pot ficonsiderate ca reprezentând puncte terminale (end points) ale comunicãrii întremaºini, similar modelului folosit de protocoalele de transport ale stivei TCP/IP;

� abilitatea de a prelucra orice tip de date, din moment ce datele de intrare suntdocumente XML (conforme unei scheme de validare);

� posibilitãþile de dezvoltare pe baza platformelor, arhitecturilor ºi limbajelorexistente;

� adaptabilitatea (un serviciu Web poate fi extins, utilizând eventual, în modtransparent, alte aplicaþii sau invocând la rândul sãu alte servicii Web).

Serviciile Web sunt cãrãmizile pentru crearea de sisteme distribuite deschise,permiþând organizaþiilor ºi dezvoltatorilor independenþi sã-ºi facã disponibile peWeb bunurile digitale într-un mod rapid ºi facil.

Mai mult, serviciile Web separã modul de prezentare a datelor de partea deprelucrare a acestora, fiind aliniate ºablonului de proiectare MVC (Model-View--Controller), des întâlnit în domeniul ingineriei programãrii. Modulul de inter-acþiune cu utilizatorul (componenta view) este separat de cel de procesare (model),reprezentat de serviciul Web în sine, comunicarea fiind facilitatã de un strat decontrol (controller) � a se urmãri figura 2. Astfel, rezultatele preluate de la serviciulWeb, ce oferã o anumitã funcþionalitate aplicaþiei noastre, pot fi redate utili-zatorului într-o multitudine de forme, fãrã a trebui sã modificãm (sau sã avemmãcar acces la) implementarea serviciului.

Figura 2. Interacþiunea între un serviciu Web ºi un client,prin prisma MVC

Page 29: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

29PREZENTARE GENERALÃ A SERVICIILOR WEB

Orice aplicaþie-client (script Perl, applet Java, program C cu interfaþã text saugraficã, aplicaþie .NET, paginã ori serviciu Web etc.) poate �consuma� � într-ovarietate de modalitãþi � datele obþinute de la un serviciu invocat printr-ometodã standardizatã, bazatã pe normele Web în vigoare.

Desigur, în afarã de avantajele incontestabile oferite (inter-operabilitate întrediverse platforme ºi limbaje de programare, utilizarea de standarde ºi protocoaledeschise, reutilizarea componentelor software, lipsa unei relaþii strânse întreentitãþi etc.), serviciile Web pot prezenta ºi dezavantaje, precum lipsa ori suportulprecar pentru tranzacþii ºi performanþa relativ scãzutã faþã de abordãrile binare(CORBA, DCOM ori RMI).

Odatã cu proliferarea arhitecturii SOA, sunt disponibile servicii specificemediului enterprise, vizând aspecte legate de:

� conþinut � specificarea, colectarea ºi organizarea cunoºtinþelor din cadrulorganizaþiei;

� acces � utilizatorii, via un portal/desktop Web, vor avea la îndemânã mijloacelede creare ºi de exploatare a serviciilor sau aplicaþiilor compuse;

� integrare � în contextul EAI (Enterprise Application Integration) îndeosebi,conþinutul vehiculat de aplicaþii/utilizatori va putea fi transformat graþie unorentitãþi software inteligente;

� procesare � se vor putea specifica reguli pentru managementul traficului dedate (dirijare, caching, filtrare etc.) în funcþie de specificul afacerilor întreprinse;

� analizare � acordarea unui suport avansat de luare (inteligentã) a deciziilor;� colaborare � va putea fi instituitã o fundaþie pentru managementul inter-

acþiunilor ºi comunicaþiilor între utilizatori (umani sau nu) � un exemplu înacest sens este enterprise wiki.

XML pentru servicii Web: SOAP, WSDL ºi UDDI

Vom prezenta în continuare principalele componente folosite în invocarea,definirea ºi regãsirea serviciilor Web.

În primul rând, apare necesitatea dezvoltãrii unui protocol de comunicare (transport)între maºini eterogene care sã faciliteze vehicularea de mesaje permiþând inter-acþiunile complexe dintre calculatoare ºi având un conþinut oricât de complex.Mai mult decât atât, trebuie oferit suport pentru asigurarea extensibilitãþii,luându-se în calcul problemele de securitate, fiabilitate ºi performanþã ce potsurveni. Acest protocol va trebui sã punã la dispoziþie un mecanism de invocareºi de transmitere structuratã a datelor.

Trebuie, astfel, gãsit un limbaj pentru transmisia în format XML a parametrilorde intrare ºi întoarcerea rãspunsului primit de la serviciul Web invocat.

Page 30: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB30

Figura 3. Nivelurile de standardizare a serviciilor Web

Principalele protocoale de comunicare utilizate în prezent sunt XML-RPC ºiSOAP.

XML-RPC oferã o specificaþie ºi un set de implementãri pentru realizarea deapeluri de proceduri la distanþã, în spiritul mecanismului RPC descris succint maisus. A fost proiectat pentru a fi cât mai simplu, în acelaºi timp însã permiþândºi transmiterea, procesarea ºi returnarea unor structuri complexe. În mod succint,putem considera ecuaþia: XML-RPC = HTTP + XML + RPC.

SOAP (Simple Object Access Protocol) reprezintã o recomandare a ConsorþiuluiWeb, propunând facilitãþi sofisticate ºi oferind o paletã largã de posibilitãþi dereprezentare (serializare ºi deserializare) a datelor vehiculate.

Un mesaj SOAP este compus din trei pãrþi: un plic (envelope), un set de regulide codificare (encoding rules) ºi o convenþie de reprezentare (representation). Plicul defineºtecadrul de lucru pentru a descrie ceea ce conþine mesajul ºi modul de procesarea acestui conþinut. Datele din corpul mesajului pot fi transportate indiferent deprotocol (uzual, se recurge la HTTP). Regulile de codificare sunt de folos laexprimarea instanþelor tipurilor de date definite în aplicaþie, iar convenþia dereprezentare este utilizatã în contextul apelurilor de metode implementate deserviciul Web ºi al rãspunsurilor furnizate în urma invocãrii acestora.

Page 31: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

31PREZENTARE GENERALÃ A SERVICIILOR WEB

De asemenea, SOAP poate specifica ºi o cale de la expeditor la destinatar, viaun intermediar (proxy) opþional, în vederea realizãrii de dirijãri de mesaje (SOAProuting). Detalii sunt disponibile în capitolul 4 al lucrãrii de faþã.

Protocolul SOAP poate fi privit din mai multe perspective. Prima ar fi aceeaîn care poate reprezenta o extindere obiectualã a paradigmei RPC: cererea ºirãspunsul conþin parametrii de intrare/ieºire, suplimentar fiind indicate, viaXML Schema, tipurile de date ale acestora. A doua considerã SOAP ca fiind unprotocol de mesagerie (serializare), cererea incluzând un obiect-cerere serializat,iar rãspunsul stocând un obiect-rãspuns serializat. Cel de-al treilea punct devedere � prezent ºi în cazul REST (vezi infra) � admite o tranzacþie SOAP cafiind o transformare XSLT la distanþã (�XSLT with a long wire�): cererea este undocument XML, iar serverul returneazã, ca rezultat al invocãrii serviciului, oversiune XML transformatã a cererii. Desigur, nici una dintre aceste abordãri nueste impusã de protocol.

În vederea exploatãrii funcþionalitãþilor puse la dispoziþie de un serviciuWeb, trebuie oferitã o descriere a acestuia. Apare necesitatea unui limbaj dedescriere, menit a rãspunde la întrebãri precum �Care e sintaxa mesajelorvehiculate?�, �Cum se desfãºoarã transferul de date?� ºi �Cum gãsim unserviciu Web?�.

Soluþia este furnizatã de WSDL (Web Service Description Language). Limbajuloferã separarea descrierii abstracte a funcþionalitãþii oferite de un serviciu dedetaliile concrete (de tipul �cum� ºi �unde� este disponibilã acea funcþionalitate).WSDL descrie serviciile Web începând cu mesajele interschimbate între entitateacare oferã ºi cea care invocã un anumit serviciu. Mesajele sunt specificate înmanierã abstractã ºi apoi sunt asociate unui protocol de reþea, precizându-se deasemenea ºi un format (o sintaxã). Un mesaj constã dintr-o colecþie de date deanumite tipuri, iar schimbul de mesaje este descris ca o operaþie. Tipurile de datese definesc via scheme XML, la nivel conceptual folosindu-se un model de datereprezentat printr-un set de componente (mesaj, port, manierã de ataºare,serviciu) având specificate diverse proprietãþi. La nivel sintactic se recurge laXML. Mai multe amãnunte privind WSDL vor fi oferite în capitolul 3.

Apare încã o cerinþã: instituirea unui mecanism pentru publicarea ºi regãsirea,în manierã publicã, a unui serviciu Web. Este posibil ca o anumitã funcþionalitateoferitã de un grup de servicii Web sã poatã fi regãsitã prin intermediul unorinterogãri formulate de partea care intenþioneazã sã foloseascã acea func-þionalitate.

Pentru aceasta s-a constituit un catalog al tuturor furnizorilor de servicii Webpublice în vederea regãsirii informaþiilor dorite: UDDI (Universal Description,Discovery, and Integration), oferind o bazã de date distribuitã a serviciilor Web din

Page 32: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB32

prisma tipurilor de afaceri electronice pe care acestea le pot modela. Conceptual,datele stocate într-un catalog UDDI pot fi împãrþite în urmãtoarele trei categorii:

� paginile albe (white pages) semnificã informaþii generale referitoare la o com-panie furnizoare de servicii (numele companiei, descrierea tipurilor de afaceriefectuate, adresa etc.);

� paginile aurii (yellow pages) includ scheme de clasificare a companiilor ºi/sauserviciilor disponibile (de exemplu, coduri de clasificare pe criterii geografice, alecategoriei de afaceri, taxonomii referitoare la produsele comercializate ºi altele);

� paginile verzi (green pages) precizeazã informaþii tehnice despre un serviciuWeb specific (e.g., o adresã Web spre descrierea acestuia, o adresã privitoarela invocarea serviciului etc.).

Uzual, cãutarea în cadrul UDDI se realizeazã în funcþie de clasa din care faceparte afacerea, dupã un nume de serviciu sau dupã locaþia geograficã a furni-zorului. Detalii sunt furnizate în capitolul 5.

Figura 3. Relaþiile dintre un client, un serviciu Web ºi registrul UDDI interogat prin SOAPpentru a se obþine descrierea WSDL a serviciului dorit

Page 33: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

33PREZENTARE GENERALÃ A SERVICIILOR WEB

Funcþionalitãþile de cãutare sunt implementate via servicii Web, astfel încâtaccesul la registrul UDDI se realizeazã prin intermediul protocolului SOAPdescris mai sus. UDDI va pune la dispoziþie documentul WSDL corespunzãtorunui serviciu compatibil cu cererea formulatã � a se vedea ºi figura 3.

Arhitectura REST

REST (REpresentational State Transfer) reprezintã o arhitecturã de dezvoltare aaplicaþiilor Web. Conform filosofiei REST, rezultatul unei procesãri conduce lareturnarea unei reprezentãri a unei resurse Web. Orice accesare a unei reprezentãriplaseazã aplicaþia-client într-o stare care va fi schimbatã în urma unui transfer dedate (accesarea altei reprezentãri, pe baza traversãrii unei legãturi hipertext �desemnatã de un URI � inclusã în reprezentarea resursei iniþiale). Stareacomunicãrii între mesajele vehiculate între server ºi client nu trebuie reþinutã(stateless).

Transferul de date se realizeazã prin HTTP, reprezentarea este marcatã înXML (ori alt format), iar adresabilitatea se rezolvã via URI, spaþiul Web putândfi considerat drept un sistem REST.

Serviciile Web actuale se pot dezvolta în concordanþã cu arhitectura REST.Componentele care invocã funcþionalitãþi vor consuma reprezentãri de resurse(în stilul pull) conform clasicei arhitecturi client/server. Fiecare cerere esteconsideratã independentã, fãrã a se lua în consideraþie contextul � conexiunistateless. Resursele Web pot fi accesate printr-o interfaþã genericã pusã la dispoziþiede metodele protocolului HTTP: GET, POST, PUT ºi DELETE. Actualmentesunt utilizate preponderent GET ºi POST.

REST se considerã a fi o viziune complementarã de implementare ºi utilizarea serviciilor Web, în locul mesajelor SOAP (al cãror format e considerat de uniidezvoltatori prea complex în anumite situaþii) recurgându-se la reprezentãriXML mai simple � numite ºi POX (Plain Old XML). O astfel de abordare eadoptatã ºi de suita de tehnologii AJAX, prezentatã în cadrul capitolului 6.

O aplicaþie Web dezvoltatã conform principiilor REST are o arhitecturãdiferitã de una în stilul RPC (acesta din urmã fiind adoptat ºi de protocolulSOAP). În cazul RPC, punctul focal e reprezentat de mulþimea de operaþii ce potfi executate (numite ºi verbe), pe când în viziunea REST totul se axeazã pediversitatea resurselor disponibile (denumite ºi substantive).

De exemplu, pentru o aplicaþie Web privitoare la un sit de comerþ electronicoferind sortimente de portocale, abordarea SOAP relevã existenþa unor operaþii(metode) precum furnizeazaSortiment(), adaugaSortiment(), eliminaSortiment(), actualizeaza-Sortiment(), listeazaSortimente(), cautaSortimente() � privitoare la sortimentele disponibile �

Page 34: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB34

ºi furnizeazaUtilizator(), adaugaUtilizator(), eliminaUtilizator(), listeazaUtilizatori() ºicautaUtilizatori() � referitoare la utilizatorii (clienþii) magazinului virtual. Toateaceste funcþionalitãþi pot fi implementate de un serviciu Web bazat pe SOAP.Recurgând la REST, vom defini doar douã tipuri de resurse (Sortiment ºi Utilizator),fiecare identificatã unic de un URI (de exemplu, http://www.portocale.info/sortimente/japoneze). O resursã poate avea asociate reprezentãri XML ce pot fi accesate orialterate. Astfel, prin intermediul unor operaþii HTTP standard, putem manipulauºor resursele. În acest mod, via GET putem obþine o copie a reprezentãrii uneiresurse, cu PUT actualizãm o resursã, iar prin DELETE o ºtergem de pe server.Metoda POST se foloseºte pentru acþiuni care ar putea avea posibile efectecolaterale (side effects) � de exemplu, realizarea unei comenzi de platã a sorti-mentelor de portocale dorite.

Dupã cum se observã, interfaþa oferitã de HTTP este una genericã, oferindsuport pentru operaþiile de bazã, de tip CRUD (Create, Retrieve, Update, Delete) �creare, accesare, actualizare ºi ºtergere.

Actualmente, existã numeroase organizaþii care îºi pun la dispoziþie serviciilevia o interfaþã REST. Ca exemple notabile, menþionãm Amazon, Bloglines, del.icio.us,eBay, Google ºi Yahoo!. De asemenea, pot fi folosite diverse cadre de lucru pentrudezvoltarea de aplicaþii Web în stilul REST: JAX-WS (Java API for XML: WebServices), Tonic (pentru PHP), Ruby on Rails, Zope (pentru Python) etc.

2.5. Modalitãþile de implementare ºi exploatare

Existenþa serviciilor Web este insuficientã fãrã a avea la îndemânã instrumentesuplimentare de implementare, exploatare ºi integrare. Un aspect important estedat de faptul cã informaþiile ºi serviciile trebuie sã fie accesibile de pe orice tipde calculator ºi de oriunde, apãrând astfel necesitatea utilizãrii unei platformeindependente de dispozitiv, al cãrei rol poate fi jucat de o maºinã virtualã.

Noile servicii dezvoltate pot fi compuse din serviciile Web deja existente,accesibile în mod transparent. Ne situãm astfel la nivel de middleware, oferind atâtfuncþionalitãþi (implementate de codul-sursã al unor programe concepute înlimbaje diverse), cât ºi suport pentru inter-operabilitate.

Serverele Web actuale trebuie sã funcþioneze ca porþi spre pagini ºi serviciiWeb, deoarece încã existã o bazã largã de situri aliniate stilului �vechi� (e.g.,recurgând la script-uri CGI ºi/sau servere de aplicaþii convenþionale).

Soluþia este oferitã de implementarea ºi exploatarea unui cadru de lucru(framework) Web cu suport pentru SOA. Un astfel de cadru de lucru trebuie sãasigure suportul pentru protocoalele Web ºi cele înrudite (HTTP, SMTP, FTPetc.), plus pentru familia XML.

Page 35: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

35PREZENTARE GENERALÃ A SERVICIILOR WEB

Figura 4. Arhitectura stratificatã a unui cadru de lucrualiniat problematicilor serviciilor Web

De asemenea, trebuie sã se punã la dispoziþie mijloace pentru catalogarea,descoperirea ºi integrarea serviciilor Web via UDDI ºi descrierea funcþionalitãþiiºi intrãrilor/ieºirilor graþie limbajului WSDL, cu posibilitatea generãrii automatede documente WSDL asociate serviciilor Web implementate. Suplimentar, dez-voltatorii vor putea recurge la facilitãþi de specificare ºi ataºare a unui context deexecuþie, luându-se în calcul factori precum autorizarea (cine poate invoca unanumit serviciu), localizarea (unde e localizat serviciul: platformã, server, portfolosit ºi altele), planificarea (când poate fi rulat serviciul) etc.

Pentru accesul la aplicaþii ºi sisteme tradiþionale (legacy) sau la servere destocare (backend servers), cadrul de lucru va trebui sã ofere un nivel de integrare.Mai mult decât atât, e necesarã existenþa unui nivel de interfaþare (frontend) via unserver Web, care presupune existenþa unei/unor maºini virtuale ºi a unui motorde asigurare a fluxului de activitãþi (workflow engine). La nivelul cel mai de sus seaflã ofertantul de servicii Web sau utilizatorul direct al acestora � vezi figura 4.

Page 36: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB36

Actualmente existã o sumedenie de tehnologii, produse ºi ofertanþi de serviciiWeb, dintre care le enumerãm doar pe urmãtoarele: Apache Axis implementat înJava, Borland Delphi/JBuilder Web Services, IBM Web Services Toolkit, JBoss, Microsoft.NET Framework, NuSOAP ºi PEAR::SOAP pentru PHP, modulul SOAP::Litepentru Perl, Web Services Developer Pack pus la dispoziþie de mediul Java. O partedintre ele vor fi utilizate în cadrul exemplelor incluse în aceastã lucrare, în specialîn capitolul 6. De asemenea, existã implementãri oferite ºi de alte companiiprecum Apple, BEA, Fujitsu, Hewlett-Packard, Oracle, SAP, Sybase etc.

Mai trebuie sã remarcãm faptul cã au apãrut diverºi ofertanþi de servicii Web,dintre care îi enumerãm pe Amazon, Blogger, cddb (CD DataBase), eBay, EuropeanBioinformatics Institute, Google, Interfax, LiveJournal, PayPal, RedHat, MSN (VirtualEarth), Shopsync, Xignite ºi Yahoo!.

Drept direcþii importante de evoluþie se remarcã, pe de o parte, implementãrilebazate pe Java ºi, pe de altã parte, serviciile Web bazate pe .NET Framework.

La finalul acestui capitol notãm cã unii specialiºti considerã cã mediatizareaºtirilor (syndication) prin formatele deja notorii � RSS (Really Simple Syndication) ºiAtom constituie tot o formã de acces la servicii Web. Astfel, informaþii diverse �marcate în RSS ori Atom ºi disponibile prin intermediul serviciilor de tip feed �pot fi integrate ºi prelucrate în diverse alte aplicaþii de sine stãtãtoare (BitTorrent,Excel sau iTunes) ori disponibile pe Web (e.g., Gmail, Indeed.com, RSSWheather,TadaList, TagCloud, Technorati, Yahoo! Maps).

Referinþe

Albin, S., The Art of Software Architecture: Design Methods and Techniques, Wiley & Sons, 2003Alboaie, L, Buraga, S., �Dialoguri despre SOAP�, NET Report, februarie 2003:

http://www.infoiasi.ro/~busaco/publications/articles/SOAP.pdfBerners-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, Iaºi, 2006: http://www.infoiasi.ro/~busaco/books/xml/

Buraga, S., Proiectarea siturilor Web (ediþia a doua), Polirom, Iaºi, 2005: http://www.infoiasi.ro/~design/

Buraga, S., Ciobanu, G., Atelier de programare în reþele de calculatoare, Polirom, Iaºi, 2001:http://www.infoiasi.ro/~lrc/

Cabrera, L.F., Kurt, C., Web Services Architecture and Its Specifications, Microsoft Press, 2005

Page 37: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

37PREZENTARE GENERALÃ A SERVICIILOR WEB

Coyle, F., XML, Web Services, and the Data Revolution, Addison-Wesley, 2002Dumbill, E. et al., Programming Web Services with XML-RPC, O�Reilly, 2001Erl, T., Service-Oriented Architecture: Concepts, Technology, and Design, Prentice Hall PTR, 2005Fielding, R., �Architectural Styles and the Design of Network-based Software Archi-

tectures�, 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: Formatof 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: MediaTypes, 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 EngineeringTask Force (IETF), 1999: http://www.ietf.org/rfc/rfc2616.txt

Guruge, A., Web Services: Theory and Practice, Digital Press, 2004He, H., What is Service-Oriented Architecture?, XML.com, 2003: http://webservices.xml.com/

pub/a/ws/2003/09/30/soa.htmlHe, H., Implementing REST Web Services: Best Practices and Guidelines, XML.com, 2004:

http://www.xml.com/pub/a/2004/08/11/rest.htmlJacobs, I., Walsh, N., Architecture of the World Wide Web, Volume One, W3C Recom-

mendation, Boston, 2004: http://www.w3.org/TR/webarch/Linthicum, D., Enterprise Application Integration, Addison-Wesley, 1999Mahmoud, 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, 2002Tanenbaum, A., Distributed Operating Systems, Prentice Hall International, 1995Weerawarana, 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/* * *, IBM�s 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/

Page 38: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)
Page 39: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

Capitolul 2

Familia XML

�Este mai bine sã ºtii câteva întrebãri decâttoate rãspunsurile.�

(James Thurber)

1. Preliminarii

Pentru identificarea resurselor, Web-ul recurge la identificatori uniformi deresurse (URI � Uniform Resource Identifiers), iar pentru interacþiune se foloseºte înmod uzual protocolul HTTP. Reprezentarea resurselor se realizeazã via formatede date. Arhitectura spaþiului WWW încurajeazã refolosirea formatelor existente,printre aspectele importante legate de acest laturã putându-se enumera: adoptareaformatelor textuale în contrast cu cele binare, controlul versiunilor, extensibi-litatea, compunerea formatelor, separarea conþinutului, prezentãrii ºi interacþiunii.

Cu proliferarea serviciilor Internet, mai ales ale Web-ului, datele au putut fipublicate liber, folosindu-se un format de redare (prezentare) a informaþiilor pusla dispoziþie de bine-cunoscutul HTML (HyperText Markup Language), în variantaactualã XHTML (Extensible HTML). În prezent, atenþia cade asupra modelãriicât mai eficiente a informaþiilor, prin intermediul unui format deschis,extensibil � subiectul acestui capitol. Mai mult decât atât, modelarea datelor nureflectã doar sintaxa (care e specificatã printr-un set de convenþii de marcare), ciºi semantica � pânã acum reprezentatã de codul-sursã al programelor ce prelucrauacele date.

Dacã formatele de date transpun maniera efectivã de stocare ºi prezentare ainformaþiilor, la nivel conceptual trebuie adoptat cel puþin un model de repre-zentare. Evoluþia infrastructurilor de calcul a condus ºi la adoptarea unor modelede date diferite.

Prezentul are la bazã arhitecturile navigaþionale, bazate pe hipertext (textneliniar), 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 delimbaje XML.

Page 40: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB40

2. XML (Extensible Markup Language)

Aproape de finalul secolului XX, Consorþiul Web a dorit crearea unui limbajcompatibil cu mai vechiul SGML (Standard Generalized Markup Language), dar caresã se preteze la utilizarea în cadrul spaþiului WWW. În anul 1998, apare primarecomandare-specificaþie privitoare la XML (Extensible Markup Language), iar lamomentul scrierii acestei lucrãri sunt în vigoare specificaþiile XML 1.0 (ediþia apatra) ºi XML 1.1 (ediþia secundã).

2.1. Caracterizare ºi trãsãturi esenþiale

Putem considera XML ca reprezentând un standard internaþional pentru descrie-rea de marcaje (markups) privitoare la resursele electronice. În fapt, XML reprezintãun meta-limbaj (descriere formalã a unui limbaj, conform unei gramatici � suitãde reguli prin care, pe baza unor simboluri, se genereazã cuvinte). La început, afost vãzut ca un limbaj de adnotare (de formatare) de texte, dar scopurile actualedepãºesc aceastã interpretare îngustã.

Termenul marcaj (markup) a fost utilizat iniþial pentru a descrie anumiteadnotãri, note marginale în cadrul unui text cu intenþia de a indica tehno-redactorului cum trebuie listat un anumit pasaj ori chiar omis. Cum formatareaºi imprimarea textelor au fost automatizate, termenul s-a extins pentru a acoperitoate tipurile de coduri de marcare inserate în textele electronice cu scopul de aindica modul de formatare, listare ori alte acþiuni.

Marcajul (codarea) reprezintã o acþiune de interpretare explicitã a unui fragmentde datã. Astfel, un limbaj de specificare oferã un set de convenþii de marcare utilizate pentrucodificarea textelor. Un limbaj de marcare trebuie sã desemneze mulþimea demarcaje obligatorii, permise, maniera de identificare a marcajelor ºi care estesemantica fiecãrui marcaj disponibil (similar procesului de specificare a sintaxeiºi semanticii unui limbaj de programare).

Existã urmãtoarele caracteristici definitorii ale XML, primele trei fiind preluatede la SGML: utilizarea marcajelor descriptive (descriptive markups), adoptareatipurilor de documente via DTD (Document Type Definition), independenþa datelorºi caracterul case-sensitive (majusculele diferã de minuscule).

Printre trãsãturile care au fãcut meta-limbajul XML sã fie folosit în industriasoftware putem enumera: suportul acordat Web-ului, facilitãþile pentru utilizareainternaþionalã, meta-limbajul (se permite definirea de noi limbaje într-o manierãportabilã), soluþiile pentru reprezentarea conþinutului resurselor Web identificatevia URI.

Page 41: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

41FAMILIA XML

Aºadar, XML este o metodã de descriere universalã a informaþiei, astfel încâtatât computerele, cât mai ales oamenii sã o poatã înþelege. Scopurile limbajuluisunt cele legate de utilizarea lui în Internet, suportând o varietate de aplicaþii, darfiind mult mai flexibil decât HTML. Oferind o manierã universalã pentrureprezentarea (descrierea) informaþiilor hipertext, XML poate fi vãzut ca otehnologie complementarã limbajului HTML, nu ca o înlocuire a sa.

2.2. Pãrþi componente ale unui document XML

Un document XML poate cuprinde urmãtoarele categorii de constituenþi: declaraþia,elementele, atributele, entitãþile, secþiunile de marcare ºi instrucþiunile de procesare.

Documentele XML pot sã înceapã cu o declaraþie (prolog) XML care specificãversiunea limbajului XML utilizat � de exemplu: <?xml version="1.0"

encoding="UTF-8" ?> (de asemenea, s-a precizat ºi tipul de codificare a setuluide caractere folosit).

Componenta structuralã a unui document XML este elementul. Diferite tipuride elemente au asociate nume diferite. Fiecare element trebuie specificat explicitprin intermediul marcajelor (tag-urilor). Perechea marcaj de început (start tag)--marcaj de sfârºit (end tag) este folositã la încadrarea fiecãrei instanþe a elementuluirespectiv în cadrul unui text. În XML se utilizeazã <element> pentru a specificaun tag de început ºi </element> pentru cel de sfârºit, unde element estenumele unui element oarecare (specificat de utilizator ori de autoritatea care aredactat specificaþiile limbajului bazat pe XML folosit). Regulile sintacticeprivitoare la numele de elemente sunt similare celor privitoare la identificatoriide variabile. Numele începând cu caracterele �xml� (în orice modalitate descriere, cu majuscule sau minuscule) sunt rezervate. Numele de element nupoate conþine spaþii albe.

Un element poate fi vid (nu conþine nimic între tag-urile de început ºi sfârºit),putând fi menþionat fie <element></element>, fie prin forma prescurtatã<element />. De asemenea, poate include un text (ºir de caractere) ori alteelemente. Mai multe elemente de acelaºi tip pot fi, aºadar, imbricate. Un aspectdeosebit de important este cel privitor la faptul cã elementele trebuie sã fieînchise ºi imbricate corect.

Conþinutul textual al unui element poate fi compus din caracterele permise decodificarea precizatã de atributul encoding din declaraþia XML, orice apariþie despaþii albe multiple fiind implicit redusã la un singur caracter spaþiu.

Pentru a ilustra mai detaliat acest aspect, considerãm un model structural foartesimplu. Presupunem cã dorim sã identificãm o comandã de portocale ce va fiprocesatã de un sit de comerþ electronic. Astfel avem:

Page 42: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB42

<portocale> <!-- partea de achiziþie de portocale --> <achizitii> <tip>Portocale greceºti fãrã coajã</tip> <cod>P10-01-GR</cod> <cantit um="kg">3374</cantit> </achizitii> <!-- partea de vânzãri de portocale --> <vanzari> <tip>Portocale japoneze albastre</tip> <cod>P10-03-JP</cod> <cantit um="kg">0107</cantit> </vanzari></portocale>

Exemplul de mai sus nu ne precizeazã anumite reguli de compunere acomenzii (de exemplu, nu putem impune ca tipul produsului solicitat sã nu aparãde mai multe ori). Aºadar, vom avem nevoie de un mecanism de specificare astructurii.

Un atribut este utilizat cu scopul de a descrie o anumitã proprietate a uneiapariþii specifice (particulare) a unui element. Atributele sunt localizate în tag-ulde start al unui element, imediat dupã numele elementului ºi sunt urmate de �=�,apoi de valoarea atributului scrisã între ghilimele sau apostrofuri. Dacã valoareaunui atribut nu este specificatã între ghilimele, va fi semnalatã o eroare, la fel caºi în cazul în care pentru un atribut nu ar fi ataºatã ºi valoarea acestuia. Pentruun element pot exista oricâte atribute, specificate în orice ordine, atât timp câtsunt declarate corect.

Pentru exemplul dat mai sus, am specificat unitatea de mãsurã �kilogram�prin valoarea �kg� a atributului um asociat elementului <cantit>.

Referinþele la entitãþi constituie de fapt pointeri cãtre entitãþi. În XML,entitãþile reprezintã unitãþi de text, unde o astfel de unitate poate desemna orice,de la un singur caracter la un întreg document sau chiar o referinþã la un altdocument. O referinþã la o entitate prezintã construcþia sintacticã &nume_entitate;(caracterul �&�, urmat de numele entitãþii, apoi de caracterul �;�). Una dintrecele mai frecvente utilizãri ale referinþelor la entitãþi este atunci când se doreºtefolosirea unor caractere care ar conduce la erori de procesare ºi deci care nu artrebui sã aparã în forma lor normalã în text (de exemplu, pentru a generasimbolul �<� vom folosi �&lt;�). În momentul în care se întâlneºte referinþa lao entitate în document, aceasta se va substitui cu datele pe care le referã ºi se vareturna documentul cu înlocuirile fãcute.

Ocazional, anumite pãrþi ale documentului necesitã un tratament special înceea ce priveºte modul de procesare. Astfel, existã posibilitatea folosirii secþiunii

Page 43: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

43FAMILIA XML

CDATA (character data), cu rolul de inhibare a prelucrãrii construcþiilor XML.Secþiunile CDATA pot fi inserate oriunde pot apãrea datele de tip caracter. Elesunt utilizate pentru a include blocuri de text conþinând caractere care altfel arfi recunoscute ca marcaje. Acest aspect devine important atunci când documentulinclude, de exemplu, linii de cod-sursã scrise într-un limbaj de programare careare propriile convenþii sintactice.

Sintaxa generalã a secþiunii CDATA are forma <![CDATA[ ... ]]>.Secþiunile CDATA nu pot fi incluse unele în altele.

Un exemplu este urmãtorul:

<achizitii> <tip>Portocale greceºti fãrã coajã</tip> <obs><![CDATA[ Cantitatea trebuie sã fie >2000. ]]></obs></achizitii>

Instrucþiunile de procesare reprezintã un tip special de marcaj care conþineinformaþii privitoare la anumite aplicaþii ce urmeazã a fi executate pentruprocesarea conþinutului. Un exemplu este instrucþiunea de procesare care permiteataºarea de foi de stiluri documentelor XML în vederea redãrii conþinutuluiacestora:

<?xml-stylesheet href="xml2html.xsl" type="text/xsl" ?>

2.3. Membrii constituenþi ai familiei XML

Limbajul XML oferã mai mult decât o sintaxã comodã pentru reprezentareadatelor structurate sau semistructurate. XML consistã dintr-o familie de limbajebazate pe XML pentru reprezentarea datelor ºi relaþiilor dintre ele.

Aceastã familie de limbaje, menite a adapta conceptele curente de stocare,modelare ºi publicare pe Web a datelor, este compusã din:

� XML (Extensible Markup Language) � subset al specificaþiei SGML, conceputpentru o implementare mai uºoarã. Modalitãþile de validare sunt concretizate,uzual, de schemele XML, complementare DTD-urilor;

� XLL (Extensible Linking Language) � oferind suport pentru specificarea delegãturi hipertext, concretizat în douã componente majore:� XLink � conceput pentru descrierea legãturilor (simple sau multiple)

dintre resursele Web;� XPointer � are ca scop precizarea în manierã extensibilã a unor scheme de

adresare a datelor XML;

Page 44: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB44

� XSL (Extensible Stylesheet Language) � permite transformarea documentelorXML în alte tipuri de documente (XML, XHTML sau altele) ºi ataºarea unorobiecte de formatare, în vederea redãrii conþinutului XML în formate precumPDF (Portable Document Format);

� XQuery � împreunã cu limbajul XPath, oferã posibilitatea interogãrii docu-mentelor XML.

Practic, este imposibil sã se enumere toate limbajele bazate pe XML existentela ora actualã, standardizate sau nu. Numeroase limbaje utile, în numãr de peste500, sunt descrise la adresa http://xml.coverpages.org/.

2.4. Spaþiile de nume XML

În unele situaþii pot apãrea confuzii, atunci când se folosesc date din diversesurse (documente) XML care pot avea elemente/atribute cu acelaºi nume, dar cusemnificaþii (semantici) diferite. Pentru evitarea acestor ambiguitãþi sunt folositespaþiile de nume, astfel încât numele de elemente ºi/sau atribute vor fi identificateîn mod unic, evitându-se conflictele.

Necesitatea folosirii spaþiilor de nume se poate remarca din exemplul urmãtor,în care considerãm douã documente XML, primul cu informaþii despre parteneriide afaceri, al doilea despre numele furnizorilor de portocale:

<!-- parteneri de afaceri --><parteneri> <partener> <nume>Portocal Escu</nume> <adresa>Aleea Zãpezilor, 33</adresa> </partener> ...</parteneri>

<!-- furnizori --><furnizori> <furnizor adresa="http://ja.po.ro/"> <nume>Japo Nez S.A.</nume> </furnizor> ...</furnizori>

Documentul care le utilizeazã pe precedentele ºi foloseºte spaþii de numepentru evitarea ambiguitãþilor (�nume reprezintã un nume de persoanã sau unnume de companie?�; idem pentru adresã) ar putea fi urmãtorul:

Page 45: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

45FAMILIA XML

<comanda xmlns:p="http://www.undeva.ro/parteneri/"> <partener> <p:nume>Portocal Escu</p:nume> <p:adresa>Aleea Zãpezilor, 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 spaþiilor de nume, iar valoarealui trebuie sã fie un URI, fie localizând o resursã prin adresa ei � cazul URL(Uniform Resource Locator), fie desemnând un nume unic asociat resursei în cauzã �facilitate oferitã de URN (Uniform Resource Name). Prin intermediul construcþieixmlns, se asociazã un vocabular, denumit ºi spaþiu de nume (namespace), pentruelementele în cauzã.

2.5. XML Infoset

XML nu trebuie considerat a fi doar o manierã de precizare la nivel sintactic astructurii ºi conþinutului unor resurse. Mai mult decât atât, Consorþiul Web a pusproblema redactãrii unei recomandãri care sã specifice un model de date (abstract)pentru XML, numitã XML Information Set (sau XML Infoset).

Prin intermediul acestei specificaþii se oferã un punct de vedere comunreferitor la: serializarea datelor semistructurate, implementarea/folosirea deinterfeþe de programare (API-uri) pentru procesarea XML, definirea unor alterecomandãri de nivel (mai) înalt.

Acest model de date asigurã inter-operabilitatea diferitelor tehnologii, interfeþede programare ºi aplicaþii XML, stabilind o interpretare comunã a conceptelorfolosite.

Sunt definite urmãtoarele concepte de bazã, împãrtãºite de întreaga familieXML:

� document (document information item) � este considerat a fi un arbore, având nodulrãdãcinã dat de proprietatea [document element]. De asemenea, posedãproprietatea [children] oferind o serie de �lucruri� de interes (items);

� element � specificã un element XML ºi are ataºatã proprietatea [parent]conþinând informaþii despre elementul pãrinte cãruia îi aparþine. Are asociatãºi proprietatea [children] cu semantica descrisã mai sus. Proprietatea[local name] specificã numele local al elementului al cãrui scop (vizibilitate)

Page 46: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB46

e dat(ã) de proprietatea [namespace uri] indicând URI-ul spaþiului denume folosit (vid, dacã nu se specificã spaþii de nume). Prefixul spaþiului denume utilizat este stocat de proprietatea [prefix]. Astfel, se dã posibilitateaprecizãrii calificate a numelor elementelor. Accesul la lista neordonatã aatributelor asociate elementului se face via proprietatea [attributes]. Deasemenea, proprietatea [namespace attributes] menþioneazã lista neor-donatã a atributelor xmlns ataºate;

� atribut (attribute) � desemneazã conceptul de atribut XML. Numele ºi spaþiulde nume ataºat sunt specificate de proprietãþile [local name] ºi[namespace name]. Elementul cãruia îi aparþine este indicat de proprietatea[owner element], iar valoarea e specificatã de [normalized value]

(valoarea normalizatã, rezultatã dupã expandarea tuturor referinþelor laentitãþi);

� caractere (characters) � corespund informaþiilor textuale ale conþinuturilor ele-mentelor XML. Proprietatea [parent] indicã elementul cãruia îi aparþin, iar[children] conþine datele-caracter propriu-zise. Setul de caractere utilizat eoferit de proprietatea [character code].

Prin intermediul XML Infoset, datele XML nu trebuie neapãrat sã aibãreprezentãri textuale, stocate în fiºiere .xml, ci pot proveni din diverse alte surse(obiecte, rezultate ale unor interogãri etc.), cu reprezentãri diferite. Intuitiv,structura unui document XML complex poate fi mult mai uºor înþeleasã avândasociatã o reprezentare graficã arborescentã � a se vedea figura 1.

Figura 1. Reprezentarea arborescentãa unui document XML

Page 47: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

47FAMILIA XML

2.6. Validarea documentelor XML

Punerea problemei

O primã necesitate în cazul adoptãrii tehnologiei XML este aceea ca informaþiilemarcate în XML sã poatã fi regãsite, reutilizate ºi partajate între diverse aplicaþii.Astfel, o cerinþã importantã este de a cunoaºte:� setul de elemente/atribute ce pot fi specificate;� modul lor de structurare (e.g., ordinea, numãrul minim/maxim de apariþii,

contextul etc.);� tipul conþinutului (de exemplu, cantitatea de portocale sã reprezinte un

numãr natural, aparþinând intervalului [0, 7433]);� ce anume este valid ºi ce reprezintã eroare.

Soluþia este ca un grup sau grupuri de indivizi (precum o companie, oindustrie, persoane, producãtori de instrumente software specifice sau unconsorþiu) sã specifice mulþimea de elemente ºi atribute permise ºi regulile demarcare, adicã tocmai modelul structural amintit mai sus.

Modelul structural se aplicã unei clase de documente XML, în vedereaverificãrii printr-un analizor (numit ºi procesor sau parser) a corectitudiniiinstanþelor de documente aparþinând acelei clase. Se au în vedere aspecte privind:

� modul de numire a elementelor/atributelor;� definirea regulilor de utilizare a acestora;� specificarea structurii ºi conþinutului;� precizarea anumitor constrângeri;� oferirea unui set de convenþii de numire.

Apare aºadar necesitatea specificãrii unui set de constrângeri asociate docu-mentelor, astfel încât datele XML sã fie verificate dacã sunt valide sau nu dinpunct de vedere structural sau al tipului conþinutului.

Modalitãþile de precizare a constrângerilor se pot baza pe: descrieri (DTD ºiXML Schema), reguli (Sablotron) ºi ºabloane (RELAX NG) � detalii în cartea luiSabin Buraga, Tehnologii XML, Polirom, Iaºi, 2006.

Page 48: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB48

Descriere succintã a XML Schema

� Caracteristici

Deoarece este una dintre cele mai utilizate ºi versatile maniere de validare adocumentelor XML, în cele ce urmeazã vom prezenta cele mai importanteaspecte referitoare la XML Schema, recomandarea oficialã a Consorþiului Web.

O schemã reprezintã o specificaþie formalã a gramaticii asociateunui document XML ºi reprezintã, în fapt, tot un document XML stocat într-unfiºier având extensia .xsd (XML Schema Definition). O schemã XML defineºte oclasã de documente XML conformându-se unui model structural suplimentar,specificând un sistem de tipuri de date în termenii infoset-ului (vezi supra). Pentrua putea fi verificatã validitatea, o instanþã a unei clase de documente XMLtrebuie sã aibã asociatã o schemã XML. Aceste aspecte sunt asemãnãtoare celorde la paradigma obiectualã.

O schemã va specifica modul de apariþie ºi tipurile de date pe care le pot luavalorile construcþiilor XML. Rezultatul obþinut în urma unei validãri încununatecu succes este numit ºi PSVI (Post-Schema Validation Infoset).

Schemele XML sunt utilizate în multe domenii, dintre care le enumerãm peurmãtoarele:

� verificarea tipurilor de date în contextul sistemelor de baze de date (relaþionale)a maºinilor virtuale (CLR, JVM) etc.;

� serializarea automatã a datelor;� invocarea la distanþã a metodelor (RMI � Remote Method Invocation, SOAP �

Simple Object Access Protocol) � a se vedea cele discutate în capitolul 4;� generarea de cod-sursã;� implementarea de editoare �inteligente�;� crearea validatoarelor generale de date (e.g., validarea formularelor electronice).

Construcþiile XML Schema trebuie sã aparþinã spaþiului de nume indicat deadresa http://www.w3.org/2001/XMLSchema. Atributele privitoare la scheme ceapar în cadrul unei instanþe a unei clase de documente vor proveni din spaþiulde nume specificat de http://www.w3.org/2001/XMLSchema-instance.

� Construcþii de bazã

Un document XML Schema are ca element-rãdãcinã <xsd:schema>. Definireasau instanþierea unui element se realizeazã via <xsd:element>, iar în cazul unuiatribut prin <xsd:attribute>.

Page 49: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

49FAMILIA XML

Asemãnãtor definirii unor tipuri de date ºi variabile într-un limbaj deprogramare, într-o schemã XML fiecare instanþã de element trebuiesã aparþinã unei clase (tip) de elemente. Un element/atribut va avea valoripermise ce aparþin unui tip de date (simplu sau complex), specificat prin<xsd:SimpleType> ºi, respectiv, <xsd:ComplexType>.

Tipurile simple, predefinite ori derivate din cele predefinite, descriu conþinutuldatelor textuale. În acest caz, nu se permite ca un element sã includã alteelemente ºi nici sã aibã asociate atribute. Tipurile simple pot fi folosite ºi pentruspecificarea conþinutului atributelor.

Tipurile complexe descriu datele (semi)structurate. În acest caz, se acceptã caelementele sã includã alte elemente (prin reguli de apariþie) ºi sã aibã asociateatribute. Elementele de tip complex vor putea conþine:

� declaraþii de elemente, prin intermediul construcþiei <element name="nume"type="tip" />;

� referinþe la elemente a priori definite: <element ref="nume" reguli_aparitie="valori" />;

� declaraþii de atribute via <attribute name="nume" type="tip" />.

Tipurile complexe nu pot fi folosite în contextul stabilirii tipului valoriloratributelor XML.

Consorþiul Web a pus la dispoziþie o paletã largã de tipuri predefinite (primiteºi derivate). Cele mai utilizate sunt enumerate în continuare:

� numerice: byte, unsignedByte, integer, positiveInteger, negativeInteger,int, long, decimal, float, double ºi altele;

� logice: boolean;� privitoare la datã ºi timp: time, dateTime, duration, date, gYear, gMonth,

gDay etc.;� ºiruri de caractere: string, token ºi altele;� adrese Web: anyURI.

Ierarhia tipurilor de date XML Schema este ilustratã de figura 2.Pentru codificãri ale conþinuturilor binare în cadrul documentelor XML se

poate folosi tipul base64Binary, care oferã o reprezentare a oricãror ºiruri deocteþi prin intermediul a 65 de caractere specificate de documentul RFC 2045.Mulþimea acestor caractere e compusã din literele minuscule ºi majuscule, cifre,diverse simboluri ºi caracterele desemnând spaþiile albe.

Page 50: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB50

Figura 2. Tipurile de date specificate de XML Schema

Putem defini tipuri simple derivate din cele predefinite via <xsd:simpleType>.Noul tip de date specificat poate fi o restricþie a unui tip deja existent prinintermediul unor constrângeri (facets). Prin intermediul constrângerilor pot fiprecizate aspecte precum:

� lungimea: <xsd:length>;� lungimea minimã: <xsd:minLength>;� lungimea maximã: <xsd:maxLength>;� un model (pattern), exprimat printr-o expresie regulatã: <xsd:pattern>.

De asemenea, putem recurge la precizarea unei liste de valori (folosind<xsd:enumeration>) ce va forma tipul sau a unui interval de valori (construcþiile<xsd:minInclusive>, <xsd:maxInclusive>, <xsd:minExclusive> ºi<xsd:maxExclusive>).

Tipurile simple noi vor fi folosite sã descrie valorile elementelor/atributelor,ataºarea acestora unor construcþii XML putând avea loc fie în cadrul schemei ladeclararea unui element, fie în cadrul instanþei via atributul xsi:type.

Page 51: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

51FAMILIA XML

De asemenea, vom putea preciza urmãtoarele (simbolul �|� semnificã oalternativã):

� reguli (restricþii) de apariþie a unei instanþe de element: numãrul minim deapariþii (minOccurs="numãr") ºi/sau numãrul maxim de apariþii (maxOccurs="numãr | unbounded");

� reguli de apariþie a unui atribut (obligatoriu, opþional sau interzis): use="required | optional | prohibited";

� valoarea predefinitã a unui atribut via default;� valori particulare pentru elemente sau atribute: fixed.

De reþinut cã tipurile simple pot fi utilizate doar pentru a descrie date-caracter.În vederea definirii structurii unui document se recurge la <xsd:complexType>.Un tip complex poate avea un conþinut simplu (<xsd:simpleContent>) sauunul complex.

Conþinutul simplu înseamnã cã un element va putea include atribute, extinzândastfel modelul-conþinut. O primã metodã este derivarea prin extensie, viaelementul <xsd:extension>, iar a doua modalitate vizeazã derivarea prinrestricþie, realizatã prin intermediul constrângerilor (facets). Atributele vor fidefinite prin intermediul <xsd:attribute>, putând fi declarate global (la nivelulschemei) sau local (în cadrul unui tip complex). De asemenea, ele pot fi calificate(prefixate de spaþiul de nume ales) sau nu.

Specificarea unui tip cu conþinut complex vizeazã definirea listei ºi ordiniisub-elementelor ºi atributelor sale. Conþinutul unui element poate fi ºi mixt(compus din sub-elemente sau date-caracter): <xsd:complexType mixed="true">ori vid (nu va conþine decât declaraþii de atribute).

Pentru a preciza diverse modele ale conþinutului, vom adopta construcþiireferitoare la:

� alternativã: <xsd:choice>;� secvenþã: <xsd:sequence>;� grupare: <xsd:group>;� apariþie a tuturor elementelor, în orice ordine: <xsd:all>.

De menþionat ºi faptul cã specificarea unor elemente/atribute generice (alealtor tipuri de documente) se realizeazã prin elementele <xsd:any> ºi <xsd:anyAttribute>. De asemenea, XML Schema oferã ºi suport pentru documentarevia <xsd:annotation>.

În continuare vom furniza un exemplu de schemã XML menitã a validadocumentul privitor la achiziþiile ºi vânzãrile de portocale, menþionat în secþiunea2.2 a capitolului de faþã. Structura schemei este urmãtoarea:

Page 52: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB52

<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 tranzacþiilor de portocale </xsd:documentation> </xsd:annotation>

<!-- definirea elementului-rãdãcinã "portocale" --> <xsd:element name="portocale" type="portocaleType" /> <xsd:complexType name="portocaleType"> <!-- o secvenþã de alternative --> <xsd:sequence maxOccurs="unbounded"> <xsd:choice> <!-- mãcar 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 achiziþii sau vânzãri --> <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 opþional --> <xsd:element name="obs" type="xsd:string" minOccurs="0" maxOccurs="1" /> <xsd:element name="cantit"> <xsd:complexType> <!-- derivãm dintr-un tip simplu --> <xsd:simpleContent> <xsd:extension base="xsd:unsignedInt"> <!-- specif. apariþia (obligatorie) a atributului "um" -->

Page 53: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

53FAMILIA XML

<xsd:attribute name="um" type="xsd:string" use="required" /> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element> </xsd:sequence> <!-- un identificator opþional --> <xsd:attribute name="id" type="xsd:ID" use="optional" /> </xsd:complexType></xsd:schema>

Reprezentarea graficã a schemei e disponibilã în figura de mai jos.

Figura 3. Reprezentarea generatã de editorul <oXygen /> a schemei XML

Mai urmeazã sã utilizãm schema de mai sus pentru a verifica validitatea uneiinstanþe de document XML care trebuie sã declare un spaþiu de nume cu un URIdesemnând schema utilizatã.

La nivelul unei instanþe de document vom folosi o construcþie de genul:

<portocale xmlns="urn:portocale.info" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "urn:portocale.info file:portocale.xsd"> <!-- conþinut propriu-zis --></portocale>

Page 54: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB54

Aplicaþia <oXygen /> XML Editor amintitã mai sus poate fi folositã ºi cavalidator de documente XML.

În cele de mai jos ilustrãm anumite mesaje de eroare afiºate de unul dintreutilitarele puse la dispoziþie de procesorul Apache Xerces � disponibil în regim opensource � în cazul unui document XML invalid, conform schemei descrise anterior:

P:\xerces>DOMPrint.exe -v=always -n -s -f portocale.xmlError 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 childrenwithin a simple type contentError at file "portocale.xml", line 12, column 14 Message: Required attribute 'um' was not providedError at file "portocale.xml", line 13, column 15 Message: Element 'suplimentar' is not valid for contentmodel: '((tip,cod,obs),cantit)'

Un rezultat aproape similar obþinem utilizând Microsoft Visual Web Developerpentru editarea ºi validarea documentelor XML � a se urmãri figura alãturatã.

Figura 4. Semnalarea erorilor de validare a unui document XML în cadrul instrumentuluiVisual Web Developer

2.7. Procesarea documentelor XML

Modelul DOM

Consorþiul Web a propus pentru prelucrarea sofisticatã a documentelor XMLºi/sau HTML un model obiectual denumit DOM (Document Object Model). Acestmodel reprezintã o interfaþã de programare a aplicaþiilor destinate sã prelucreze

Page 55: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

55FAMILIA XML

documentele HTML ºi XML, independentã de platformã ºi de limbaj, definindstructura logicã a documentelor ºi modalitãþile de accesare ºi de modificare a lor.

Structura logicã a documentelor este o structurã arborescentã, conformã cuXML Infoset, documentele fiind modelate utilizând obiecte, iar modelul nufurnizeazã doar o vizualizare structuratã a documentului, ci ºi o modalitate despecificare a comportamentului lui ºi a obiectelor componente. Fiecare elemental unui document poate fi privit, aºadar, ca un obiect cu o identitate ºi o seriede funcþii proprii.

Recomandãrile DOM sunt structurate pe mai multe nivele de specificare amodelului. Nivelul 0 (pentru HTML) a fost nivelul de funcþionalitate a versiunilor3 ale navigatoarelor Netscape ºi Internet Explorer. Nivelul 1 este recomandareastandardizatã din anul 1998, iar în 2000 a fost standardizat DOM � nivelul 2.Parþial, nivelul 3 al DOM a fost publicat ca recomandare oficialã în anul 2004ºi este în curs de standardizare completã.

DOM nu este o specificaþie binarã ºi nu defineºte nici o formã de inter-ope-rabilitate la nivel binar, în contrast cu alte tehnologii, precum CORBA (CommonObject Request Broker Architecture) ori COM (Common Object Model). DOM reprezintãun model care specificã interfeþe ºi nu este un set de structuri de date (abstracte).De asemenea, nu defineºte semantica detaliatã a documentelor HTML sau XML.

Specificaþia DOM reprezintã documentele ca o ierarhie de obiecte-nod.Anumite tipuri de noduri pot avea noduri copii (descendenþi) de diverse tipuri.Altele pot fi noduri frunzã, lipsite de descendenþi. Tipurile fundamentale denoduri sunt cele din urmãtorul tabel:

Tip Descendenþi

Document Element,

ProcessingInstruction,

Comment,

DocumentType

DocumentFragment Element,

ProcessingInstruction,

Comment,

Text,

CDATASection,

EntityReference

DocumentType -

EntityReference Element,

ProcessingInstruction,

Comment,

Text,

CDATASection,

EntityReference

Page 56: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB56

Tip Descendenþi

Element Element,

Text,

Comment,

ProcessingInstruction,

CDATASection,

EntityReference

Attr Text,

EntityReference

ProcessingInstruction -

Comment -

Text -

CDATASection -

Notation -

Entity 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 imple-mentare efectivã a modelului. Existã o serie de interfeþe fundamentale (e.g.,Document, DocumentFragment, Node, NodeList sau Attr), plus diverse interfeþe extinsepentru a suporta implementãri având în vedere procesarea documentelor HTMLori oferind facilitãþi adiþionale.

În continuare, vom descrie succint o serie dintre interfeþele puse ladispoziþie.

O interfaþã importantã este DocumentFragment care poate reprezenta un obiect--document minimal. Sunt numeroase situaþiile în care nu trebuie lucrat cuîntregul document, ci doar cu diverse fragmente ale sale. Arborele de noduri alunui fragment de document este un sub-arbore al structurii de noduri adocumentului luat în întregul lui. În funcþie de necesitãþi, DocumentFragment poatereprezenta o entitate XML, un element XML sau chiar un grup de elemente.

Interfaþa Document reprezintã un document XML, desemnând conceptualrãdãcina arborelui de noduri-obiecte ale documentului ºi oferind accesul lainformaþiile conþinute de acesta. Din moment ce elementele (marcatorii), nodurilede tip text, comentariile, instrucþiunile de procesare nu pot exista în afaracontextului unui document, interfaþa Document conþine de asemenea metodelenecesare pentru a crea aceste categorii de obiecte.

Page 57: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

57FAMILIA XML

Interfaþa Document are ca membri trei atribute:

i. doctype reprezintã declaraþia tipului de document (DTD) asociatã unuidocument particular.

ii. implementation specificã implementarea sau implementãrile disponibilepentru procesarea documentului.

iii. documentElement (de tip Element) desemneazã nodul-rãdãcinã de accesare astructurii arborescente a documentului.

Menþionãm urmãtoarele metode importante:

� createElement() creeazã un element XML;� createTextNode(), createComment(), createCDATASection(), create-

ProcessingInstruction() vor genera noduri-obiect de tip text, comentariu,secþiune CDATA, respectiv instrucþiune de procesare;

� createAttribute() creeazã un obiect atribut care va fi asociat unui elementspecificat;

� getElementById() va întoarce elementul al cãrui atribut id se potriveºte cucel furnizat ca argument al acestei metode (în acest mod poate fi selectatexact un anumit element, ºtiind cã identificatorul asociat trebuie sã fie unic);

� getElementsByTagName() va returna o listã ordonatã de noduri NodeListpentru toate elementele corespunzãtoare unui tag, ordonarea nodurilor reali-zându-se prin parcurgerea în preordine a arborelui;

Interfaþa Node defineºte un tip primar pentru întregul model DOM, repre-zentând un anumit nod în cadrul arborelui asociat unui document. AtributelenodeName, nodeValue ºi attributes sunt introduse ca mecanisme pentrufurnizarea informaþiilor despre noduri fãrã conversie de tipuri (vizualizare�simplificatã�, nu una �orientatã-obiect�). Fiecare nod va avea asociatã o listãordonatã conþinând descendenþii sãi, plus atribute specificând nodul pãrinte,primul ºi ultimul nod copil, dacã existã.

Ca metode prezentând interes se pot menþiona cele care manipuleazã nodurilecopil:

� insertBefore()permite inserarea unui nod înaintea celui curent;� replaceChild()substituie un nod-copil;� removeChild()eliminã un nod-copil specificat;� appendChild()adaugã un alt nod-copil;� cloneChild()cloneazã un anumit nod-copil;� hasChildNodes()întoarce true dacã existã noduri-copil;� hasAttributes()întoarce true dacã nodul are atribute (metodã introdusã în

DOM nivelul 2);

Page 58: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB58

� isSameNode()întoarce true dacã nodul curent e identic cu un altul specificat(metodã oferitã de DOM nivelul 3).

NodeList reprezintã o interfaþã care oferã un tip abstract de datã pentrucolecþiile ordonate de noduri, fãrã a defini sau restricþiona cum va fi implementatãefectiv aceastã colecþie. Fiecare implementator va decide ce tipuri de dateconcrete vor fi utilizate. Membrii colecþiei se vor accesa prin metoda item()pebaza unui index întreg, numerotarea nodurilor începând cu valoarea 0.

Interfaþa NamedNodeMap este folositã pentru reprezentarea abstractã a colec-þiilor neordonate de noduri, prelucrate prin intermediul numelui. InterfaþaNamedNodeMap nu derivã din NodeList.

Interfaþa Attr modeleazã un atribut din cadrul unui obiect de tip Element.Tipic, valorile permise ale atributelor sunt definite în schema XML cores-punzãtoare documentului. Un obiect Attr nu se considerã cã aparþine arboreluide noduri-obiect al documentului. Nodurile de tip Attr sunt considerate pro-prietãþi ale elementelor (marcatorilor), putând fi asociate nodurilor Elementconþinute de obiecte de tip DocumentFragment.

Interfaþa Element derivã din Node ºi oferã metode de accesare a obiectelorAttr, prin nume sau prin valoare: getAttribute(), setAttribute(), remove-Attribute(), getAttributeNode(), setAttributeNode(), removeAttribute-Node().

Interfaþa Text este o interfaþã reprezentând conþinutul textual (date de tipºiruri de caractere) al unui nod Element sau Attr. Dacã între tag-urile de începutºi de sfârºit nu existã alþi marcatori, atunci textul va fi stocat într-un obiectimplementând interfaþa Text.

În prezent existã implementãri complete pentru DOM � nivelurile 1 ºi 2 � înmajoritatea limbajelor de programare actuale (C/C++, C#, Java, JavaScript,Perl, Python etc.). Drept exemple notabile de biblioteci ºi interfeþe de programaredisponibile în diverse limbaje pot fi enumerate JAXP (Java API for XML Parsing),JDOM, libxml, MSXML.NET, QDOM, Xerces DOM API ºi XML::DOM.

O serie de exemple de manipulare prin DOM a documentelor XML, pentruprocesarea rãspunsurilor obþinute de la serviciile Web invocate sau în contextulAJAX, sunt furnizate în cadrul capitolului 6.

Procesarea XML prin SAX

Pentru documente de dimensiuni mari, modelul DOM este ineficient, deoareceînainte de a se realiza prelucrarea, documentul respectiv trebuie încãrcat completîn memorie. Ca alternativã la implementãrile DOM, existã o interfaþã simplã deprogramare destinatã manipulãrii documentelor XML, însã nu atât de completãprecum DOM. Aceastã interfaþã este denumitã SAX (Simple API for XML).

Page 59: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

59FAMILIA XML

Majoritatea celor care se ocupã de prelucrarea documentelor XML vãdstructura unui document în formã arborescentã, iar modelul DOM oferã din plinposibilitatea de a manipula informaþiile în aceastã manierã. Din punctul devedere al implementatorilor aceastã abordare are numeroase deficienþe (manierade stocare internã a arborelui de obiecte, parcurgerea lui etc.). Unul dintrebeneficiile utilizãrii interfeþei SAX este cã arborele nu mai trebuie construit,dându-i-se programatorului o altã cale de analizã a documentului XML. Maimult, SAX poate ajuta la convertirea datelor din formatul arborescent DOM înalt format mai comod, iar pentru procesare nu este necesar a se memora întreagainformaþie XML, ci numai pãrþile dorite.

Detalii privitoare la SAX ºi alte maniere de procesare XML sunt oferite deresursele bibliografice indicate.

Analizoare XML

Desigur, pentru prelucrarea documentelor XML va trebui sã recurgem la unanalizor XML deja implementat în limbajul nostru preferat. Analizoarele XMLpot fi de douã tipuri:

� analizoare fãrã validare, care vor procesa un document XML verificând dacãacesta este bine formatat (adicã respectã regulile privind sintaxa ºi modul deimbricare corectã a tag-urilor);

� analizoare cu validare, care vor realiza procesarea documentului XML prinverificarea regulilor formale descrise de un DTD sau o schemã ataºateacestuia (aceste analizoare sunt mai complexe).

Unul dintre cele mai cunoscute analizoare fãrã validare este Expat, disponibilîn regim open source. De asemenea, pot fi utilizate analizoarele cu posibilitãþi devalidare JAXP (Sun), JDOM, libxml (parte a proiectului GNOME), MSXML(Microsoft) sau Xerces (Apache). Practic toate mediile de dezvoltare Web actualeoferã posibilitãþi de validare a documentelor XML via DTD sau XML Schemaºi diverse modalitãþi de procesare.

Referinþe

Apparao, V. et al. (eds.), Document Object Model (DOM) Level 1 Specification, W3C Recom-mendation, Boston, 1998: http://www.w3.org/TR/REC-DOM-Level-1

Biron, P., Malhotra, A. (eds.), XML Schema Part 2: Datatypes (Second Edition), W3CRecommendation, Boston, 2004: http://www.w3.org/TR/xmlschema-2/

Page 60: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB60

Bray, T. et al. (eds.), Extensible Markup Language 1.0 (4th 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, Iaºi, 2006: http://www.infoiasi.ro/~busaco/books/xml/

Buraga, S. et al., Programare Web în bash ºi Perl, Polirom, Iaºi, 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, 2003Dick, K., XML: A Manager�s Guide (2nd Edition), Addison Wesley, 2002Fallside, D., Walmsley, P., XML Schema Part 0: Primer Second Edition, W3C Recom-

mendation, Boston, 2004: http://www.w3.org/TR/xmlschema-0/Geroimenko, V., Dictionary of XML Technologies and the Semantic Web, Springer-Verlag,

2004Harold, E., XML 1.1 Bible (3rd Edition), Wiley Publishing, 2004Le 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-CoreLe 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-CoreMarini, J., The Document Object Model: Processing Structured Documents, McGraw-Hill, 2002McLaughlin, B., Java & XML (3rd Edition), O�Reilly, 2006* * *, Apache XML: http://xml.apache.org/* * *, Café con Lèche: http://www.cafeconleche.org/* * *, libxml: http://xmlsoft.org/* * *, MSXML: http://msdn.microsoft.com/xml* * *, Oxygen XML Editor: http://www.oxygenxml.com/* * *, Sun�s 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/

Page 61: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

Capitolul 3

Descrierea serviciilor Web

�Analfabetul viitorului nu va mai fi cel care nu ºtiesã citeascã; va fi cel care nu ºtie sã înþeleagã.�

(Alvin Toffler)

1. Punerea problemei

Aºa cum am menþionat în primul capitol, modul de acces la un serviciu Web estespecificat printr-un set de documente care conþin definiþii, toate acestea consti-tuind descrierea serviciului.

Asemenea documente pot fi vãzute drept blocuri menite a furniza descriereaunui serviciu Web, incluzând (a se urmãri ºi figura 1):

� definiþia unui serviciu = abstractã + concretã (service definition = abstract +concrete);

� descrierea unui serviciu = definiþia serviciului + definiþii suplimentare (servicedescription = service definition + supplementary definitions).

Sã analizãm fiecare dintre termenii de mai sus:

� descrierea interfeþei unui serviciu Web este independentã de implementare ºieste referitã de termenul �abstract�. Informaþiile despre implementarea ºilocalizarea serviciului Web constituie pãrþi �concrete� ale documentului caredescrie serviciul. Termenii �abstract� ºi �concret� au fost introduºi cu sensulde mai sus de cãtre Consorþiul Web în specificaþiile privind arhitecturaserviciilor;

� definiþia serviciului (service definition) este compusã din definiþiile interfeþei(abstracte) ºi definiþiile implementãrii (concrete);

� descrierea unui serviciu (service description) constã de obicei doar din definiþiaserviciului, însã � opþional � ea mai poate conþine informaþii suplimentare (deexemplu, cum este conectat serviciul respectiv de alte servicii).

Page 62: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB62

Figura 1. Conþinutul descrierii unui serviciu

2. WSDL (Web Service Description Language)

Serviciile Web trebuie sã fie definite într-o manierã consistentã, astfel încât sãpoatã fi uºor descoperite ºi puse în legãturã cu alte servicii ºi aplicaþii.

WSDL (Web Service Description Language) desemneazã o specificaþie standardizatãde Consorþiul Web ºi este cel mai cunoscut limbaj folosit pentru a descrie unserviciu Web. Prin aceastã descriere se înþelege specificarea locaþiei ºi descriereaoperaþiilor (metodelor) permise, aceasta fiind întrucâtva similar modului în carese face descrierea unei componente (interfeþe) COM.

Istoric

Specificaþia WSDL iniþialã a luat naºtere în anul 2000, reprezentând o fuziune adouã limbaje de descriere a serviciilor: NASSL (Network Application Service

Page 63: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

63DESCRIEREA SERVICIILOR WEB

Specification Language) propus de IBM ºi SDL (Service Description Language) proveninddin partea Microsoft.

Versiunea actualizatã WSDL 1.1 a fost publicatã un an mai târziu ºi trimisãConsorþiului Web spre standardizare. De fapt, formatul WSDL 1.1 a fost largîmbrãþiºat de industrie, fiind practic folosit ºi în prezent.

WSDL 1.2 nu a depãºit stadiul de specificaþie în lucru, fiind compusã din treidocumentaþii (partea de bazã, mecanismul de specificare a mesajelor ºi modul deataºare), ultima actualizare fiind realizatã în 2003.

Actualmente, Consorþiul Web lucreazã la WSDL versiunea 2.0.

Caracterizare

Conceptual, un document WSDL reprezintã un �contract� între o cerere ºi unrãspuns, similar modului cum o interfaþã Java reprezintã un �contract� întrecodul-client ºi un obiect, instanþã a unei clase Java. Diferenþa esenþialã 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 descrieristandard, face posibilã comunicarea la nivelul de integrare furnizat de serviciileWeb � a se consulta ºi capitolele 6 ºi 7.

Figura 2. Maniera de integrare a serviciilor Web via WSDL(documentele WSDL oferã descrierea interfeþei de interacþiune cu o aplicaþie

la nivel de integrare software)

Cea mai potrivitã cale de a înþelege cum este descris un serviciu Web cuajutorul WSDL este de avea o privire de ansamblu asupra modelului sãuconceptual ºi de a studia construcþiile care formeazã aceastã descriere.

Page 64: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB64

2.1. Modelul conceptual al WSDL

Dupã cum am vãzut, descrierea unui serviciu Web poate fi structuratã în douãpãrþi principale. În partea abstractã are loc descrierea serviciului Web în termenide mesaje trimise ºi recepþionate sub controlul unui sistem de tipuri (în mod curent,graþie unei scheme XML). Modelul schimbului de mesaje defineºte succesiuneaºi cardinalitatea mesajelor. O operaþie (operation) asociazã modelul schimbului demesaje cu unul sau mai multe mesaje. O interfaþã (interface) grupeazã acesteoperaþii într-un mod independent de transport ºi de metoda de serializare.

În partea concretã a descrierii, bindings specificã modul de transport ºi formatulde serializare pentru interfeþe. Elementul endpoint face legãtura cu o adresã, iarservice grupeazã acele endpoints care implementeazã o interfaþã comunã (SEI �Service Endpoint Interface).

Mesaje (messages)Operaþii (operation)

Interfaþa serviciului

(definiþie abstractã)Interfaþã (interface)Legare (binding)Serviciu (service)Implementarea serviciului

(definiþie concretã)Punct terminal (endpoint)

Figura 3. Modelul conceptual WSDL

Componentele WSDL

Pentru a descrie un serviciu Web, WSDL furnizeazã un set de componente ºiproprietãþi 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 urmãtoarele convenþii: meta-caracterul �?� desemneazã o con-strucþie opþionalã (elementul <documentation> poate, aºadar, lipsi), caracterele�[�]� specificã o grupare de alternative, numele de elemente fiind delimitatede �|� (în cazul nostru, poate apãrea fie marcatorul <import>, fie <include>).Simbolul �*� specificã zero, una, sau mai multe apariþii (elementele <interface>,<binding> ori <service> pot apãrea de oricâte ori dorim).

Page 65: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

65DESCRIEREA SERVICIILOR WEB

În cele ce urmeazã vom analiza fiecare element în parte, studiind iniþialcomponentele pãrþii abstracte ºi apoi pe ale celei concrete.

Elementul-rãdãcinã al documentului WSDL este definitions, putând fi vãzut ca uncontainer care conþine toate informaþiile ºi atributele asociate unui serviciu Web.Figura urmãtoare aratã schema generalã a elementului <definitions> aºa cum esteea redatã de editorul oXygen pe baza schemei XML oficiale a limbajului WSDL 1.1.

Atributul targetNamespace al elementului definitions este obligatoriu, de tipulanyURI. Spaþiul de nume poate defini în mod direct sau indirect semanticadocumentului WSDL. Marcatorul definitions poate avea ºi alte atribute opþionalecãrora sã le corespundã diferite spaþii de nume folosite în documentul WSDL.În versiunea 2.0 a limbajului, sub-elementul portType este denumit interface.

Sã considerãm un exemplu concret de utilizare a elementului definition pentruspecificarea unui serviciu de validare a documentelor XML (implementareaefectivã va fi prezentatã în cadrul capitolului 6):

<definitions> <!-- numele serviciului Web, aºa cum va fi accesat din exterior --> <interface name="XMLValidator"> ... </interface> <!-- un mesaj SOAP privind transmiterea argumentelor de intrare --> <message name="ValidateSoapIn"> ... </message> <!-- un mesaj SOAP privind transmiterea rãspunsului --> <message name="ValidateSoapOut"> ... </message> <!-- serviciul oferit --> <service name="XMLValidator"> ... </service> <!-- ataºarea (legarea) la protocolul de transport efectiv al datelor --> <binding name="XMLValidatorSoap"> ... </binding> <binding name="XMLValidatorSoap12"> ... </binding></definitions>

Page 66: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB66

Figura 4. Schema elementului definitions

Page 67: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

67DESCRIEREA SERVICIILOR WEB

Elementul interface include un set de operaþii abstracte. Opþional, o interfaþãpoate extinde una sau mai multe interfeþe. Un exemplu concret de utilizare aelementului interface este urmãtorul:

<definitions> <interface name="XMLValidator"> <!-- verificã dacã existã un fiºier --> <operation name="CheckIfExists"> ... </operation> <!-- valideazã un document XML --> <operation name="Validate"> ... </operation> </interface></definitions>

Elementul operation constã dintr-un grup de mesaje de intrare/ieºire legateîntre ele. Execuþia unei operaþii implicã transmiterea sau schimbul unor astfel demesaje între serviciul consumator ºi cel furnizor. Elementul operation al interfeþeiare ca atribut obligatoriu name, desemnând numele operaþiei expuse.

Reprezentarea acestor mesaje se face cu ajutorul construcþiei messages care segãseºte întotdeauna ca element-copil direct al marcatorului definition. Numelemesajului este apoi referenþiat în operaþiile de input/output ale elementelor copil(vezi exemplul de mai jos).

<definitions> <message name="ValidateSoapIn"> ... </message> <interface name="XMLValidator"> <operation name="Validate"> <input name="msg" message="ValidateSoapIn" /> </operation> </interface></definitions>

Un element message poate conþine unul sau mai mulþi parametri de intrare/ieºire care aparþin operaþiei. Fiecare element part defineºte un asemenea para-metru. El furnizeazã o pereche nume-valoare împreunã cu un tip de data asociat.Exemplul urmãtor ilustreazã un bloc message având un singur marcator part.

<definitions> <message name="ValidateSoapIn"> <part name="filename" type="xs:string">

Page 68: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB68

document.xml </part> </message></definitions>

La nivelul pãrþii de implementare, un document WSDL poate stabili legãturiconcrete cu protocoale cum ar fi SOAP sau HTTP.

Într-un document WSDL, elementul service constã din unul sau mai multeelemente endpoint, la nivelul cãrora serviciul Web poate fi accesat. Aceste puncteterminale includ informaþii legate de localizare ºi protocolul permis.

Alte informaþii specifice protocolului se regãsesc la nivelul elementului binding.Sã considerãm mai jos un exemplu de utilizare a elementului service (spaþiul de

nume tns este unul temporar):

<definitions> <service name="XMLValidator"> <endpoint name="XMLValidatorSoap" binding="tns:XMLValidatorSoap"> <!-- detalii concrete legate de implementare --> </endpoint> </service></definitions>

Atributul name al elementului service este obligatoriu.Elementul binding stabileºte protocolul ºi dã informaþii despre formatul

mesajelor operaþiilor. Elementul operation din cadrul unui bloc binding seamãnã cuomologul sãu din secþiunea interface.

Figura urmãtoare oferã forma generalã a elementului binding.

Figura 5. Elementul binding

Page 69: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

69DESCRIEREA SERVICIILOR WEB

Pornind de la aceastã schemã, un exemplu de utilizare a elementului bindingeste:

<definitions> <service> <binding name="XMLValidatorSoap"> <operation name="Validate"> <input>...</input> <output>...</output> </operation> </binding> </service></definitions>

Elementul feature asociat elementului binding defineºte funcþionalitãþile asociateschimbului de mesaje (fiabilitate, securitate, corelaþie ºi dirijare). Elementulproperty este folosit pentru a controla marcatorul feature. El constã dintr-un set devalori posibile specificate printr-o referinþã la o schemã de descriere. Acestevalori pot fi partajate între elementele feature.

Vom discuta mai departe alte construcþii suplimentare pe care le întâlnim înspecificaþiile WSDL.

Elementul include ajutã la modularizarea descrierii serviciului Web. El permiteca pãrþi din definiþia unor servicii care se referã la acelaºi spaþiu de nume sãpoatã fi regãsite într-un alt document WSDL, astfel putând fi folosite saupartajate de descrierile serviciilor Web. Atributul location este obligatoriu ºi rolulsãu este de a specifica locaþia unor astfel de documente WSDL. Valoareaspaþiului de nume asociat documentului WSDL inclus trebuie sã fie referitã despaþiul de nume al elementului definition din documentul WSDL inclus.

Conceptul din spatele elementului import este cumva similar celui privitor lainclude, diferenþa constând în faptul cã documentul WSDL importat poate referiun alt spaþiu de nume. Atributul namespace al marcatorului import este obligatoriu,în vreme ce atributul location are caracter opþional.

Figura 6. Schema elementului import

Page 70: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB70

Elementul types defineºte tipurile de date folosite în comunicare. WSDL nueste legat exclusiv de un anumit sistem care conþine aceste tipuri, dar implicitfoloseºte specificaþiile XML Schema. Dacã serviciul utilizeazã doar tipuri simple(precum ºiruri de caractere ºi întregi), atunci elementul types nu este obligatoriu.

Un exemplu de utilizare a elementului types care stabileºte utilizarea tipurilorde date XML Schema este urmãtorul:

<definitions> <types> <xsd:schema elementFormDefault="qualified" targetNamespace= "http://www.infoiasi.ro/XMLValidator" xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"> ... </xsd:schema> </types></definitions>

Un alt element pe care-l regãsim în forma generalã a unui document WSDLeste documentation. Acesta poate fi inclus în orice document WSDL ºi este folositîn special pentru a furniza o explicaþie textualã uºor de înþeles (human-readable).

<definitions> <documentation> Acest serviciu oferã operaþii de validare XML. </documentation></definitions>

Tipuri de documente WSDL

Sintetizând cele detaliate mai sus, documentele WSDL pot exprima douã tipuride informaþii: cele referitoare la interfaþa serviciului ºi cele privitoare la imple-mentarea efectivã a acestuia.

Dupã cum am vãzut, interfaþa unui serviciu este descrisã de un documentWSDL care conþine elementele types, import, message, interface ºi binding. Interfaþaunui serviciu conþine definiþia WSDL a acestuia, folositã pentru implementareaunuia sau a mai multor servicii. Este o definiþie abstractã a serviciului Web ºi esteutilizatã pentru a descrie un anumit tip (o clasã) de serviciu. Un document detip interfaþã poate referi un alt document de tip interfaþã, folosind elementulimport.

Un document WSDL de implementare a serviciului conþine elementele importºi service. Un astfel de document specificã o descriere a serviciului care implementeazãinterfaþa serviciului. Mãcar unul dintre elementele import va face o referinþã la

Page 71: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

71DESCRIEREA SERVICIILOR WEB

documentul WSDL de tip interfaþã. Un document de implementare a serviciuluipoate îngloba referinþe la mai multe documente de tip interfaþã (aºa cum o clasãdintr-un limbaj orientat-obiect precum C++ ori Java poate moºteni un numãr deuna sau mai multe clase).

Figura 7. Tipurile de documente WSDL

Elementul import dintr-un document WSDL de implementare conþine douãatribute. Primul este namespace, a cãrui valoare este un URI care se potriveºte cutargetNamespace din documentul de tip interfaþã. Al doilea atribut este location,precizând un URI folosit pentru a referenþia documentul WSDL care conþinedefiniþia completã a interfeþei serviciului. Atributul binding al elementului portspecificã o referinþã la un element binding particular din documentul de tipinterfaþã.

Documentul de interfaþã a serviciului este dezvoltat ºi publicat de un furnizorde servicii de interfaþã (service interface provider). Documentul de tip implementareeste creat ºi publicat de un furnizor de servicii (service provider). Rolurile acestuifurnizor de servicii de interfaþã ºi a furnizorului de servicii sunt separate dinpunct de vedere logic, dar pot desemna ºi aceeaºi entitate emiþãtoare.

Page 72: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB72

2.2. Diferenþele dintre specificaþiile WSDL 1.1 ºi WSDL 2.0

De la WSDL 1.2 s-a trecut la WSDL 2.0 ºi întâlnim în principal urmãtoarelediferenþe faþã de WSDL 1.1:

� Adãugarea de semantici limbajului de descriere. De asemenea, s-a introdusatributul obligatoriu targetNamespace pentru elementul definitions.

� Schimbarea modului de construire a mesajului: se foloseºte sistemul de tipuride date din XML Schema via elementul types.

� Elementul portTypes este redenumit interfaces. Suportul pentru moºtenireainterfeþei este obþinut prin folosirea atributului extends în cadrul elementuluiinterface.

� Elementul port a fost redenumit endpoint.

2.3. Exemple de documente WSDL

În cea mai mare parte, dezvoltatorii de servicii Web nu genereazã manualdescrieri WSDL pentru serviciile lor. Se utilizeazã anumite instrumente carefurnizeazã documente WSDL în mod automat.

De exemplu, platforma Microsoft .NET poate genera automat o descriereWSDL pentru un serviciu Web. Sã considerãm cã avem un serviciu Web (vezicapitolul 6 pentru detalii) de salutare a utilizatorului. Pentru a accesa descriereaWSDL generatã trebuie sã adãugãm sufixul �?WSDL� la URI-ul fiºierului .asmx.

Se va obþine o descriere WSDL a serviciului implementat în cadrul fiºierului.asmx (în exemplul nostru, considerãm serviciul denumit salutari.asmx). Facemobservaþia cã pentru generarea automatã a documentului WSDL de mai jos s-autilizat .NET Framework versiunea 1.1, iar versiunea WSDL folositã este 1.1.

<?xml version="1.0" encoding="utf-8" ?><definitionsxmlns: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/"><types>

Page 73: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

73DESCRIEREA SERVICIILOR 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:element minOccurs="0" maxOccurs="1" name="sayHelloResult" type="s:string" />  </s:sequence>  </s:complexType>  </s:element>  <s:element name="string" nillable="true" type="s:string" />  </s:schema></types><message name="sayHelloSoapIn">  <part name="parameters" element="hs:sayHello" /></message><message name="sayHelloSoapOut">  <part name="parameters" element="hs:sayHelloResponse" /></message><portType name="SalutariSoap"> <operation name="sayHello">  <documentation xml:lang="ro"> Metoda de salut sayHello(). </documentation>  <input message="hs:sayHelloSoapIn" />  <output message="hs:sayHelloSoapOut" />  </operation></portType><binding name="SalutariSoap" type="hs:SalutariSoap">  <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> <operation name="sayHello">  <soap:operation soapAction="urn:Hello/sayHello" style="document" /> <input>

Page 74: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB74

  <soap:body use="literal" />  </input> <output>   <soap:body use="literal" /> </output>  </operation></binding><service name="Hello">  <documentation> Un serviciu Web care vã salutã. </documentation> <port name="HelloSoap" binding="hs:HelloSoap">  <soap:address location="http://localhost/salutari.asmx" />  </port></service></definitions>

În exemplul de mai sus se pot identifica elemente ca <definition>, <message>,<portType> (din versiunea WSDL 1.1), <binding> etc.

Reprezentarea graficã a structurilor XML anterioare este datã de figura 8.

Figura 8. Reprezentarea graficã a arborelui de elemente corespunzãtor unui document WSDL

Page 75: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

75DESCRIEREA SERVICIILOR WEB

Dupã cum se poate observa, elementul definitions specificã mai multe spaþii denume 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/">

Folosirea spaþiilor de nume este importantã pentru diferenþierea elementelorºi permite documentului sã facã referinþe multiple la specificaþii externe, incluzândspecificaþii WSDL, SOAP ºi XML Schema. Atributul targetNamespace este unatribut XML Schema care permite documentului WSDL sã facã referire la elînsuºi. Trebuie observat faptul cã aceastã valoare trebuie specificatã în mod unic(diferitã de alte spaþii de nume definite).

Se remarcã, de asemenea, faptul cã elementul definitions declarã ºi un spaþiu denume implicit: xmlns="http://schemas.xmlsoap.org/wsdl/". Elementelorcare nu au specificat un spaþiu de nume (de exemplu, message sau portType) lecorespunde acest spaþiu de nume WSDL implicit.

În documentul WSDL sunt definite douã elemente message.

<message name="sayHelloSoapIn">  <part name="parameters" element="hs:sayHello" /></message><message name="sayHelloSoapOut">  <part name="parameters" element="hs:sayHelloResponse" /></message>

Primul reprezintã mesajul-cerere, sayHelloSoapIn, iar al doilea desemneazãmesajul de rãspuns, sayHelloSoapOut. Fiecare din aceste mesaje conþine un singurelement part. Pentru cerere, part specificã parametrii funcþiei (metodei), iarpentru rãspuns desemneazã valoarea întoarsã de aceasta. În exemplul de mai sus,se poate observa cã existã un singur parametru de intrare pentru caretype="s:string". La fel, avem un singur parametru de ieºire tot de tip string.

Page 76: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB76

Dacã existã situaþii în care metoda prezintã mai multe argumente sau retur-neazã mai multe valori, atunci se specificã mai multe elemente part cores-punzãtoare.

Marcatorul portType defineºte o singurã operaþie, numitã sayHello, având unsingur mesaj de intrare (sayHelloSoapIn) ºi un unic mesaj de ieºire (sayHelloSoapOut).

<portType name="SalutariSoap"> <operation name="sayHello">  <documentation xml:lang="ro"> Metoda de salut sayHello(). </documentation>  <input message="hs:sayHelloSoapIn" />  <output message="hs:sayHelloSoapOut" />  </operation></portType>

Valoarea atributului message trebuie sã fie un nume de element XML calificat(de forma prefix:nume unde prefix reprezintã prefixul spaþiului de numecorespunzãtor elementului). De exemplu, elementul input include un atributmessage="hs:sayHelloSoapIn" � prefixul hs se referã la targetNamespace definitmai devreme pentru elementul definitions.

2.4. Tipuri de operaþii ºi mesaje

WSDL suportã patru tipuri de operaþii principale:

� One-way � serviciul primeºte un mesaj. Astfel operaþia are un singur elementinput.

� Request-response (cerere-rãspuns) � serviciul primeºte un mesaj ºi trimite unrãspuns. Operaþia are un element de input, urmat de un element de output.Pentru a specifica eventuale erori se poate utiliza elementul opþional fault.

� Solicit-response (solicitare rãspuns) � serviciul trimite un mesaj ºi primeºte unrãspuns. Operaþia are un element de output urmat de un element de input. Înacelaºi mod se poate utiliza elementul opþional fault.

� Notification (înºtiinþare) � serviciul trimite un mesaj. Operaþia are un singurelement de output.

Aceste operaþii sunt prezentate în figura urmãtoare. Modelul cerere-rãspunseste cel mai utilizat pentru serviciile SOAP.

Page 77: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

77DESCRIEREA SERVICIILOR WEB

Figura 9. Tipurile de operaþii suportate de WSDL:a) one-way, b) request-response, c) solicit-response, d) notification

Elementul binding furnizeazã detalii despre modul în care mesajele privitoarela o operaþie vor fi transmise prin reþea (de exemplu, prin HTTP POST sauSOAP). Elementul binding are atributele name ºi type:

<binding name="SalutariSoap" type="hs:SalutariSoap">

Atributul type face referinþã la portType definit anterior în document. În cazulnostru, elementul binding se referã la hs:SalutariSoap. Altfel spus, elementul bindingafirmã ceva de genul �Voi furniza detalii despre modul cum datele operaþieisayHello vor fi transportate în Internet�.

Un document WSDL include construcþii SOAP. Aceasta permite specificareade detalii SOAP, cum ar fi un antet SOAP, SOAP encoding style, SOAPAction � vezicapitolul urmãtor.

Elementul soap:binding indicã faptul cã legãtura cu mecanismul de transport seva face prin SOAP. Marcatorul soap:operation desemneazã conectarea unei anumiteoperaþii la o anumitã implementare SOAP. Atributul soapAction declarã faptul cãatributul de antet SOAPAction (din cadrul unui mesaj HTTP) este utilizat pentru

Page 78: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB78

identificarea serviciului. Elementul soap:body permite specificarea diferitelor detaliidespre mesajele de intrare/ieºire.

Marcatorul service desemneazã locaþia serviciului. Deoarece este un serviciuSOAP, în exemplul de mai sus s-a folosit elementul soap:address ºi s-a utilizatadresa http://localhost/salutari.asmx.

2.5. Platforme ºi instrumente de lucru cu documentele WSDL

Vom trece în revistã o serie de instrumente de lucru cu WSDL, lãsând lalatitudinea cititorului sã decidã care este cel mai uºor de utilizat ºi mai util pentrufiecare situaþie în parte. Nu vom mai reveni la platforma .NET ºi suportul sãupentru generarea documentelor WSDL (discutate mai sus), însã remarcãm faptulcã este unul dintre instrumentele cele mai utilizate la ora actualã.

Fiind dat un fiºier WSDL, se poate crea în mod manual un client SOAPpentru a invoca serviciul. O alternativã mai bunã ar fi o invocare automatã aserviciului prin folosirea unui instrument WSDL de invocare. Figura de mai josilustreazã acest mecanism:

Figura 10. Invocarea automatã a unui serviciu Web via un instrument specializat

În continuare vom enumera cele mai cunoscute instrumente cu ajutorulcãrora se pot face invocãri, validãri, generãri de documente WSDL: WSIF (WebServices Invocation Framework), Stylus Studio�s Web Service Call Composer, XML Spy,WTP (însemnând de fapt platforma Eclipse extinsã) ºi SOAEditor.

Unul din cele mai cunoscute instrumente de invocare este WSIF, proiect iniþiatde cãtre IBM ºi donat ulterior iniþiativei Apache XML � http://xml.apache.org/.

Page 79: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

79DESCRIEREA SERVICIILOR WEB

WSIF este o interfaþã de programare a aplicaþiilor (API � Application ProgrammingInterface) folositã pentru invocarea serviciilor descrise cu ajutorul WSDL. UtilizândWSIF, putem realiza o interacþiune cu serviciile Web la un nivel abstract,neþinând cont de formatul mesajelor sau de protocolul de transport utilizat.

Poate vã întrebaþi: la ce este util un astfel de instrument? Sã ne imaginãm unsistem software al unei corporaþii, sistem format din mai multe entitãþi software,dezvoltate într-o perioadã de zeci de ani. Trebuie creatã o aplicaþie care sã poatãutiliza toate aceste entitãþi. WSIF rezolvã problema folosind descrierile WSDL ºipermiþând accesul la funcþionalitãþile acestor entitãþi într-o manierã independentãde protocol ºi de locaþie. Astfel, indiferent cã recurgem la tehnologii ca SOAP(Simple Object Access Protocol), EJB (Enterprise JavaBeans) sau JMS (Java MessagingServices), totul se concentreazã asupra unui API dependent de WSDL care permiteaccesarea tuturor funcþionalitãþilor. În consecinþã, integrarea tuturor componen-telor se poate realiza la nivel declarativ, prin intermediul documentelor WSDL.

Stylus Studio�s Web Service Call Composer (pe scurt, Stylus) reprezintã un sistemcare simplificã dezvoltarea serviciilor Web Java, oferind suport pentru gãsirea,invocarea ºi testarea oricãrui serviciu Web bazat pe Java, dezvoltat într-un cadrude lucru (framework) Java, cum ar fi Apache Axis. Vom da mai jos un exemplu almodului în care, cu ajutorul aplicaþiei Stylus, putem localiza ºi invoca metodeleunui serviciu Web. Aºa cum se poate observa ºi în figura de mai jos, creãm unproiect de tip Web Service Call.

Figura 11. Crearea unui apel de serviciu Web (Web Service Call)prin utilizarea instrumentului Stylus

Page 80: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB80

Pentru a invoca un serviciu Web, trebuie sã putem face o referire la adresadocumentului WSDL propriu. Deoarece e posibil ca nu întotdeauna sã cunoaºtemaceastã adresã, Stylus are inclus un browser UDDI care permite cãutarea înregiºtrii UDDI (vezi capitolul 5). Pentru a realiza o interogare în regiºtrii UDDI(de exemplu, IBM, Microsoft, SAP ori XMethods), se alege unul dintre aceºtia,se introduce o interogare (de pildã: �google�) ºi se porneºte cãutarea.

Figura 12. Obþinerea rezultatelor privitoare la documentele WSDL gãsite

Aºa cum se observã ºi în figura 12, Stylus va afiºa o listã cu rezultate. Pentruexemplificare, vom alege din lista de rezultate documentul WSDL cu URL-ulhttp://api.google.com/GoogleSearch.wsdl. În acest moment, avem la dispoziþie docu-mentul WSDL dorit ºi putem vedea ce metode pune la dispoziþie serviciul Web(în acest caz, cel oferit de motorul de cãutare Google).

Aºa cum se observã mai jos, Stylus afiºeazã operaþiile oferite de serviciul Web,signatura metodelor, lista parametrilor, precum ºi un mesaj SOAP necesar pentruinvocarea operaþiei selectate. Interfaþa Stylus oferã posibilitatea de a modificavaloarea parametrilor, mesajul SOAP fiind automat actualizat cu noile date introduse.

Page 81: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

81DESCRIEREA SERVICIILOR WEB

Figura 13. Detalii privitoare la o metodã oferitã de serviciul Web dorit a fi invocat

Din acest moment suntem gata sã realizãm invocarea serviciului Web (folosimbutonul �Send Request�) � a se vedea figura 14.

Figura 14. Invocarea serviciului Web oferit de Google

Stylus permite apoi inspectarea, în cadrul ferestrei Preview, a rezultatului întorsde serverul care gãzduieºte serviciul Web.

Figura 15. Obþinerea rãspunsului întors de serviciul Web invocat

Mai multe detalii despre aceastã aplicaþie comercialã puteþi gãsi la adresahttp://www.stylusstudio.com/.

Page 82: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB82

Un alt instrument este XMLSpy care, pe lângã alte facilitãþi oferite, poate fifolosit pentru invocarea, editarea, vizualizarea ºi validarea documentelor WSDL.Sã considerãm un serviciu Web de generare a numerelor prime. Pentru a-l puteainvoca avem nevoie de documentul WSDL asociat, pe care îl putem gãsi laadresa 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

Se creeazã o cerere SOAP care primeºte ca parametru URL-ul de mai sus:

Figura 17. Introducerea adresei documentului WSDL folositpentru invocarea serviciului Web dorit

Acest serviciu Web ne oferã o singurã metodã � GetPrimeNumbers. MesajulSOAP creat de instrumentul XMLSpy este ilustrat în figura 18.

Figura 18. Generarea unei cereri cãtre un serviciu Web

Page 83: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

83DESCRIEREA SERVICIILOR WEB

Trimitem cererea SOAP ºi rãspunsul obþinut va fi:

Figura 19. Obþinerea rãspunsului oferit de serviciul Web invocat

Facem observaþia cã XMLSpy poate fi gãsit ºi în cadrul mediului Eclipse(platformã universalã de dezvoltare software implementatã în Java, scopul sãufiind integrarea diferitelor instrumente utile, într-o manierã indiferentã de limbajulsau platforma folositã). Aceastã integrare permite utilizatorilor sistemului Eclipsesã lucreze cu tehnologiile standard XML, utilizând numeroasele facilitãþi oferiteîn acest caz de XMLSpy.

O altã abordare este cea oferitã de <oXygen /> XML Editor, care pune ladispoziþie un instrument de consultare ºi invocare via SOAP a serviciilor Web.În captura din figura 20 ilustrãm acest mecanism. Se poate observa structurafiºierului WSDL returnat de Google, având acces la numele operaþiilor imple-mentate. De asemenea, oXygen poate fi folosit în conjuncþie cu Eclipse.

Alte exemple notabile sunt Wsdlpull (instrument de inspectare ºi invocare aserviciilor Web) ºi WSDL Verify (program de verificare a corectitudinii docu-mentelor WSDL).

În final, putem concluziona cã folosirea documentelor WSDL aduce câtevaavantaje majore:

� WSDL face mai facilã scrierea ºi menþinerea serviciilor prin furnizarea uneiabordãri structurate, necesarã definirii interfeþei serviciului Web;

� specificaþia WSDL permite o modalitate mai eficientã de a utiliza un serviciuWeb, prin faptul cã reduce mãrimea codului (ºi astfel ºi a potenþialelor erori)pe care aplicaþia-client trebuie sã-l implementeze;

� WSDL permite ca modificãrile ulterioare ale interfeþei/implementãrii ser-viciului sã se realizeze mai uºor. Descoperirea dinamicã a descrierilor WSDLconduce la faptul cã monitorizarea acestor schimbãri va fi automat realizatãîn cazul clienþilor, recurgând la WSDL pentru invocarea serviciilor Webdorite.

Page 84: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB84

Figura 20. Pregãtirea invocãrii unui serviciu Web prin intermediul instrumentului WSDLSOAP Analyser oferit de oXygen

Referinþe

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, Iaºi, 2006Chinnici, 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, 2002Haas, H., Brown, A. (eds.), Web Services Glossary, W3C Working Draft, Boston, 2003:

http://www.w3.org/TR/ws-gloss/

Page 85: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

85DESCRIEREA SERVICIILOR WEB

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 Developer�s 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/

Page 86: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)
Page 87: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

Capitolul 4

Protocolul SOAP

�Totul ar trebui sã fie cât mai simplu cu putinþã,însã nu mai simplu de atât.�

(Albert Einstein)

1. Evoluþia protocoalelor bazate pe XML

Tehnologia din spatele serviciilor Web este construitã pe baza protocoalelorXML. Acestea guverneazã modul cum are loc comunicarea între programelerulând la nivel de server ºi de client ºi cum sunt reprezentate datele transmise(parametrii de intrare ºi rezultatul întors).

Din punct de vedere istoric, protocoalele de comunicaþie bazate pe XML seîmpart în douã generaþii: prima se bazeazã doar pe sintaxa XML 1.0, iar a douãgeneraþie foloseºte XML Schema ºi spaþiile de nume XML. SOAP se încadreazãîn aceastã a doua generaþie.

1.1. Prezentare succintã a protocoalelor din prima generaþie

S-au fãcut numeroase eforturi pentru a crea protocoale bazate pe XML. Douãdintre ele s-au impus în mod deosebit: WDDX (Web Distributed Data Exchange) ºiXML-RPC.

WDDX a fost creat în 1998 de Allaire Corporation (preluatã de Macromedia,devenitã în acest moment parte a companiei Adobe). WDDX oferea un meca-nism independent de limbaj ºi platformã pentru schimbul de date între aplicaþii.Deºi WDDX suporta tipuri de date precum ºiruri de caractere, numere, valoribooleene, tablouri ºi structuri, nu putea fi folosit pentru reprezentarea oricãrortipuri de date ce pot fi exprimate în XML.

WDDX nu era legat în mod strict de o modalitate de transport, astfel cãaplicaþiile puteau interschimba pachete WDDX folosind diverse protocoaleprecum HTTP sau SMTP. În trecut, WDDX s-a bucurat de un anume succes,existând implementãri în majoritatea limbajelor de programare.

Page 88: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB88

XML-RPC este un protocol bazat pe paradigma RPC (Remote Procedure Call),descrisã în primul capitol al acestui volum. XML-RPC a fost introdus în 1998 decompania Userland. Tipurile de date suportate sunt similare cu cele din WDDX.Ca protocol de transport se foloseºte HTTP.

Un mesaj XML-RPC reprezintã de fapt o cerere HTTP prin metoda POST.Corpul cererii are forma unui document XML. Procedura se executã pe server,iar rezultatul este întors, de asemenea, sub formã de XML.

Parametrii de intrare ai procedurii invocate pe server pot fi numere, ºiruri decaractere etc., sau pot fi structuri ori liste de structuri.

Un exemplu de cerere XML-RPC este urmãtorul, în care se doreºte invocareafuncþiei furnizeazaNumeSortiment(int), care va oferi numele unui sortiment deportocale pe baza unui index (în acest caz, indexul are valoarea 2):

POST /RPC2 HTTP/1.0User-Agent: Test/3.2 (WinXP)Host: tsxmlrpc.ex.roContent-Type: text/xmlContent-Length: 181

<?xml version="1.0"?><methodCall> <methodName>furnizeazaNumeSortiment</methodName> <params> <param> <value><int>2</int></value> </param> </params></methodCall>

Observãm cã în antetul cererii URI-ul nu este specificat. De exemplu, el arputea fi vid (doar un singur �/�), în cazul în care serverul manipuleazã doarapeluri XML-RPC.

Oricum, dacã serverul opereazã cereri HTTP de diferite tipuri, atunci pe bazavalorii URI mesajele se dirijeazã spre codul responsabil cu cererile XML-RPC.În exemplul de mai sus, URI-ul este /RPC2, aceasta indicând serverului dirijareacererilor spre aplicaþia �RPC2�, care va trimite rãspunsul. Este obligatoriu ca înantet sã fie specificate câmpurile User-Agent ºi Host.

Valoarea câmpului Content-Type este text/xml, deoarece transmitem un docu-ment XML, iar Content-Length reprezintã dimensiunea care trebuie corect spe-cificatã.

Corpul mesajului este marcat în XML ºi conþine, în acest exemplu, osingurã structurã <methodCall>. Elementul <methodCall> trebuie sã includã un

Page 89: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

89PROTOCOLUL SOAP

sub-element <methodName>, care indicã (sub forma unui ºir de caractere) numelemetodei apelate.

Dacã procedura invocatã la distanþã necesitã parametri, atunci <methodCall>trebuie sã conþinã ºi elementul-copil <params>. Acesta va include un anumitnumãr de elemente <param>, fiecare având o valoare de un anumit tip. Înexemplul anterior, tipul parametrului este int ºi este furnizat chiar de marcatorul<int>.

Un exemplu de rãspuns pentru cererea de mai sus va avea forma:

HTTP/1.1 200 OKConnection: closeContent-Length: 158Content-Type: text/xmlDate: Mon, 20 Feb 2006 19:33:07 GMTServer:Test/3.2-WinXP

<?xml version="1.0"?><methodResponse> <params> <param> <value> <string>Portocale japoneze</string> </value> </param> </params></methodResponse>

Dacã nu apar erori, se întoarce codul de stare 200 OK. Valoarea câmpului deantet Content-Type este text/xml, deoarece rãspunsul este ºi el un document XML.Câmpul Content-Length trebuie sã fie prezent ºi sã aibã o valoare corectã.

Corpul mesajului este o structurã XML <methodResponse>, care conþine unsingur parametru <params> cu un unic element-copil <param>. Acesta, la rândullui, include o singurã valoare <value>.

Elementul <methodResponse> putea conþine, de asemenea, marcatorul <fault>având sub-elementul <value>, ce reprezintã un <struct> compus din douãelemente: primul este <faultCode>, de tip <int>, iar celãlalt este numit <faultString>ºi este de tip <string>. Elementul <fault> indicã apariþia unei excepþii XML-RPC,serverul întorcând codul acesteia ºi un mesaj explicativ.

De notat cã <methodResponse> poate conþine fie <fault>, fie <params>, dar nupe ambele simultan.

Pentru cererea anterioarã putem avea ºi urmãtoarea variantã de rãspuns,indicând o excepþie referitoare la furnizarea unui numãr prea mare de parametride intrare:

Page 90: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB90

HTTP/1.1 200 OKConnection: closeContent-Length: 426Content-Type: text/xmlDate: Mon, 20 Feb 2006 19:33:09 GMTServer: 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ã simplitãþii sale, XML a fost acceptat pe scarã largã. Astfel, XML-RPCpoate fi folosit în cadrul programelor Perl, Java, Python, C, C++, PHP ºi multe altelimbaje. Implementãrile sunt disponibile pentru majoritatea sistemelor de operare.Un exemplu de aplicaþie Web scrisã în PHP ºi utilizând XML-RPC este oferit încadrul lucrãrii lui Sabin Buraga (coord.), Aplicaþii Web la cheie, Polirom, Iaºi, 2003.

1.2. Dezavantajele protocoalelor din prima generaþie

Enumerãm în cele ce urmeazã principalele neajunsuri ale primei generaþii deprotocoale de transport bazate pe XML :

Lipsa de extensibilitate. Creatorii protocolului trebuie sã ajungã la o înþelegereînainte ca orice modificãri sã fie implementate ºi versiunea protocolului trebuiesã fie revãzutã, astfel încât sã se permitã diferitelor instrumente sã facã distincþiaîntre versiunile vechi ºi cele noi ale protocolului. De exemplu, atunci când înXML-RPC ºi WDDX s-a adãugat suport pentru datele binare, specificaþiileambelor protocoale au fost reactualizate ºi acelaºi lucru s-a întâmplat cu toateimplementãrile existente pentru diferite limbaje ºi platforme de programare. O

Page 91: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

91PROTOCOLUL SOAP

astfel de necesitate constituie un serios handicap, care a fost depãºit de pro-tocoalele din a doua generaþie prin utilizarea spaþiilor de nume XML.

A douã mare problemã este legatã de tipurile de date. Aceste protocoalefoloseau un singur DTD (Document Type Definition) pentru a descrie reprezentareaserializatã a datelor. În general se utilizau doar câteva tipuri de date simple XML.Aceastã abordare a permis multor instrumente sã ofere suport acestor protocoale.Dificultatea care a apãrut ulterior a fost aceea cã datele din mesaje erau exprimatesintactic ºi nu semantic. Protocoalele din a doua generaþie folosesc structurile ºibogatele tipuri de date din XML Schema.

2. SOAP � scurtã istorie

Începând cu anul 1997, corporaþia Microsoft a iniþiat numeroase cercetãri legatede XML. Scopul era crearea de aplicaþii care sã comunice pe baza RPC ºi HTTP.Companiile DevelopMentor ºi Userland ºi-au adus aportul la aceste studii. Laînceputul anului 1998, s-a dezvoltat conceptul de protocol de comunicaþii bazatepe XML, numit SOAP.

În cadrul Microsoft, grupul DCOM (Distributed Common Object Model) nu agreaaceasta nouã direcþie ºi susþinea cã Microsoft ar trebui sã foloseascã poziþiadominantã pe care i-o oferea DCOM. Altã grupare din Microsoft era de acordcu tranziþia la SOAP, însã se considera cã era nevoie de ceva mai mult decâtXML simplu (ar fi fost de dorit suportul oferit de specificaþiile referitoare laspaþiile de nume ºi schemele XML). Datoritã acestor tergiversãri, Userland afãcut public în vara anului 1998 protocolul XML-RPC.

În 1999, Microsoft a creat propria versiune de schemã XML (numitã XMLData Reduced) ºi a adãugat facilitãþi pentru suportarea spaþiilor de nume. Astfel,protocolul SOAP începea sã capete contur. Era totuºi un mecanism de transportXML bazat pe RPC. În aceeaºi perioadã, o echipã care lucra la serverul BizTalka creat un model care se focaliza mai puþin pe RPC ºi mai mult pe ideea detransfer de mesaje (messaging).

Pentru a rezolva aceste diferenþe au fost necesare câteva luni. În septembrie1999, apare versiunea publicã SOAP 0.9, datã spre aprobare la IETF (InternetEngineering Task Force). Dupã câteva schimbãri, în decembrie 1999 e disponibilãvarianta SOAP 1.0.

Pe 8 mai 2000, SOAP versiunea 1.1 a fost prezentatã ca document alConsorþiului Web, la care IBM era co-autor al protocolului. Aceastã specificaþiese caracteriza printr-o mai mare extensibilitate ºi a eliminat îngrijorãrile conformcãrora implicarea Microsoft ar conduce dezvoltatorii la necesitatea utilizãrii unortehnologii proprietare.

Page 92: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB92

În curând, dupã apariþia specificaþiei SOAP 1.1, IBM a lansat pe piaþãimplementarea Java SOAP, pe care a cedat-o mai apoi proiectului Apache XML(http://xml.apache.org/), în scopul unei dezvoltãri open source. Ulterior, mai multecorporaþii au început sã lucreze la implementãri ale serviciilor Web folosind SOAP.

Pe 9 iulie 2001, grupul W3C a publicat o nouã schiþã (working draft) pentruSOAP 1.2, iar la data de 7 iunie 2003, noua versiune SOAP 1.2 a devenitrecomandare standardizatã. Începând cu varianta 1.2, termenul �SOAP� nu semai considerã a fi un acronim.

Ca majoritatea tehnologiilor noi, SOAP schimbã regulile dupã care suntdezvoltate aplicaþiile. Din experienþa cu alte tehnologii, s-a observat cã aceleacare se caracterizeazã prin simplitate sunt cele mai promovate ºi au ºansa sãdureze. Aºa cum se va vedea din exemplele viitoare, într-o anumitã mãsurã,protocolul SOAP se dovedeºte a fi simplu de înþeles ºi de utilizat.

3. SOAP � o vedere de ansamblu

Serviciile Web sunt o instanþã a modelului arhitecturilor orientate spre servicii(SOA � Service Oriented Architecture), care folosesc SOAP ca mecanism de transporta mesajelor între servicii descrise cu ajutorul unor interfeþe WSDL. În esenþã,avem de-a face cu o arhitecturã simplã (vezi figura 1) în care mesajele SOAPsunt propagate cu ajutorul unui protocol de transport între serviciul Web ºiposibilii sãi clienþi.

Figura 1. Stiva logicã a serviciilor Web

Page 93: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

93PROTOCOLUL SOAP

SOAP reprezintã un protocol care permite atât schimbul de informaþiistructurate într-un mediu distribuit ºi descentralizat, cât ºi accesarea de servicii,privite la nivel orientat-obiect, într-o manierã independentã de platformã.

Scopul principal al SOAP este facilitarea inter-operabilitãþii între platforme ºilimbaje de programare. Pentru realizarea schimbului de informaþii între sistemeeterogene, pãrþile care comunicã trebuie sã cadã de acord asupra unei reprezentãricomune. Aºa cum se poate observa din exemplul urmãtor, un numãr de telefonpoate avea mai multe reprezentãri echivalente din punct de vedere logic(semantic).

<nrTelefon>0232 201090</nrTelefon>

<nrTelefon> <prefix>0232</prefix> <numar>201090</numar></nrTelefon>

<nrTelefon prefix="0232" numar="201090" />

Apare întrebarea: care este codificarea corectã? Rãspunsul: este corectã cea pecare aplicaþia o aºteaptã. Cu alte cuvinte, nu este suficient sã afirmãm cã serverulºi clientul folosesc XML pentru a realiza schimbul de informaþii. Trebuie sãdefinim tipul datelor interschimbate, maniera de modelare a datelor în XML,mecanismul de transmitere a informaþiei, folosind � la nivel mai scãzut �protocoalele Internet existente.

Fãrã aceste convenþii, programele nu pot cunoaºte modul de decodificare adatelor pe care le primesc, chiar dacã sunt reprezentate cu ajutorul XML. SOAPeste cel care furnizeazã aceste convenþii.

Arhitectura generalã SOAP (despre care vom discuta în detaliu în cadrulsubcapitolelor urmãtoare) este surprinsã în figura 2.

Un mesaj SOAP constã dintr-un document XML al cãrui element-rãdãcinãare denumirea de plic (envelope). În interiorul mesajului întâlnim douã elemente--copil cunoscute ca antet (header) ºi corp (body), similar mesajelor transmise prinpoºtã. Informaþiile privind modul de interacþiune cu aplicaþiile sunt plasate îninteriorul corpului, iar în cadrul antetului se gãsesc informaþii despre destinatar,despre entitatea care va avea posibilitatea modificãrii mesajului respectiv etc.

În acest capitol, vom prezenta o serie de exemple de mesaje SOAP sub formãde documente XML. Specificaþiile SOAP se referã la un mesaj SOAP ca fiindspecificat formal printr-un XML Infoset (vezi capitolul 2), descriere abstractã aconþinutului sãu. Cititorii interesaþi de astfel de aspecte (de exemplu, asociereaSOAP cu alte protocoale, caz în care mesajele pot avea reprezentãri diferite) lepot gãsi în rapoartele tehnice furnizate de Consorþiul Web.

Page 94: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB94

Figura 2. Arhitectura SOAP

4. Forma generalã a unui mesaj SOAP.Procesarea datelor de cãtre serverele SOAP

Mesajele SOAP sunt documente XML care reprezintã structura atomicã pentrucomunicarea în medii distribuite. Elementul-rãdãcinã al unui mesaj SOAP estemarcatorul Envelope. Deoarece elementul Envelope este în mod unic identificat depropriul sãu spaþiu de nume, instrumentele de procesare vor putea determina cuuºurinþã dacã un document XML reprezintã sau nu un mesaj SOAP.

Putem sã imaginãm un mesaj SOAP ca pe un plic (SOAP Envelope) careconþine în interior un antet (header) opþional ºi un corp (body) obligatoriu � a seconsulta figura 3.

Antetul conþine blocuri de informaþii relevante pentru modul cum va fiprocesat mesajul. Acesta include date privitoare la locaþia emitentului, locaþiadestinatarului, anumite informaþii de autentificare ºi autorizare. Corpul stocheazãmesajul care va fi trimis ºi procesat. Orice aspect ce poate fi exprimat cu ajutorulsintaxei XML poate fi memorat în corpul mesajului.

Page 95: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

95PROTOCOLUL SOAP

Figura 3. Structura unui mesaj SOAP

Dupã cum se poate observa, existã aici � ca ºi în cazul poºtei electronice �o separare între partea destinatã aplicaþiilor propriu-zise ºi partea de transport.Informaþiile destinate aplicaþiilor le gãsim la nivelul corpului mesajului, pecând elementele legate de transportul mesajului sunt incluse doar în partea deantet.

Ne putem imagina cã o aplicaþie SOAP este formatã din noduri (entitãþi decalcul intermediare) care schimbã mesaje între ele. Mesajele SOAP pot treceprintr-un numãr oarecare de noduri intermediare pânã ajung la destinatarulfinal.

Specificaþiile SOAP presupun existenþa unor noduri intermediare care descriucomportamentul unui nod în anumite circumstanþe. Un mesaj, care trece dinnod în nod pentru a ajunge în final la destinatar, poate fi procesat de acestenoduri intermediare (vezi figura 4). Mai mult, un astfel de nod poate realizamodificãri în cadrul unui mesaj, astfel încât acesta sã poatã fi procesat de un noddiferit de cel final.

Page 96: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB96

Figura 4. Nodurile SOAP ºi fluxul mesajelor vehiculate

Aºa cum se observã în figura 4, nodurile intermediare primesc mesajul ºi îlpot altera sau nu. Nodul final se numeºte ºi ultimate receiver, adicã este nodulterminal pe care se aflã serviciul Web care va folosi acel mesaj.

Întregul model de procesare este implementat de cãtre serverele SOAP. Unserver SOAP desemneazã un element al mecanismului care face medierea întretraficul SOAP ºi componentele unei aplicaþii. Pentru a putea dezvolta serviciiWeb, trebuie sã înþelegem modul în care un server SOAP implementeazã modelulSOAP.

Pornind de la premisa cã este imposibil sã facem o trecere în revistã a tuturorplatformelor SOAP existente, vom prezenta arhitectura generalã a unui serverSOAP. De asemenea, vom enumera principalele caracteristici de care se bucurãcele mai populare implementãri actuale � a se vedea ºi capitolul 6 pentruexemple de aplicaþii (servere ºi clienþi) utilizând SOAP.

O imagine generalã a unui server SOAP poate fi urmãritã în figura 5.Considerãm scenariul în care un mesaj SOAP a ajuns la un server SOAP.Aºa cum se poate observa, elementele stocate în antetul mesajului SOAP (de

exemplu, informaþii caracteristice pentru alte servicii Web cum ar fi securitatea,tranzacþiile etc.) sunt procesate de anumiþi �lucrãtori� (handlers) care au fostînregistraþi pentru serviciul Web în cauzã. Astfel de entitãþi (în fapt, funcþii detratare a antetelor) sunt considerate � în termenii SOAP � noduri intermediare.

Rutinele de tratare a antetelor nu fac implicit parte din serverele SOAP, darsunt în general utilizate pentru îmbunãtãþirea capacitãþilor serverului. Aceastaînseamnã cã serverele SOAP pot fi la rândul lor perfecþionate ulterior, pentru afi compatibile cu noile tehnologii/servicii Web care apar.

Dacã în urma procesãrii antetului nu s-a obþinut nici o eroare, partea de mesajcare e destinatã aplicaþiei (care se gãseºte în corpul SOAP) ajunge la nivelul dedispecer (dispatch), care transmite implementãrii serviciului datele propriu-zise deintrare. Dupã efectuarea procesãrii în interiorul serviciului, are loc trimiterearãspunsului cãtre dispatcher, care-l va propaga cãtre entitatea ce a formulatcererea. Aºa cum se poate remarca din figura 5, mesajul de rãspuns poate trece

Page 97: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

97PROTOCOLUL SOAP

prin mai multe etape de transformãri. Anumiþi handler-i (noduri intermediare) potmodifica antetul mesajului. Altfel spus, dacã revenim la analogia mesaj SOAP �plic, e uºor sã ne imaginãm cum acesta ajunge sã fie adus de un poºtaº ladestinaþie, dar înainte de aceasta a trecut prin mai mulþi �intermediari� (societãþide transport, oficii poºtale etc.) care l-ar fi putut modifica. Aceste modificãrisunt realizate doar la exteriorul plicului (de exemplu, diverse ºtampilãri), con-þinutul lui rãmânând intact pânã ajunge la destinatar.

Figura 5. Arhitectura generalã a unui server SOAP

Eventual, mesajul poate ajunge la un nivel de reþea în care este transformat(marshalled) pentru a suporta un anumit protocol de nivel scãzut (de exemplu,SMTP ori HTTP), însã va fi trimis într-un mod corespunzãtor nodurilor SOAPpentru a putea fi procesat.

Page 98: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB98

5. Modelul SOAP � mesaje ºi codificãri

Pornind de la premisa cã toate cele discutate pânã acum v-au stârnit curiozitateaºi v-au familiarizat cu noþiunile importante ale protocolului, vom încerca sãprezentãm în detaliu elementele care contribuie la crearea modelului SOAP.

Specificaþia SOAP este divizatã în trei componente:

� prima constã într-o descriere a utilizãrii protocolului SOAP, a structuriimesajelor ºi a modelului conform cãruia se realizeazã schimbul de mesajeSOAP;

� partea a doua (Messaging Framework) furnizeazã un model în care se specificãregulile de procesare a unui mesaj SOAP, un cadru de lucru extensibil carepermite dezvoltatorilor sã utilizeze extensii în cadrul sau în afara mesajuluiSOAP, reguli pentru construcþia mesajelor SOAP ºi legãturi între SOAP ºidiferite protocoale (cum ar fi HTTP);

� partea a treia (Adjuncts) prezintã, printre altele, regulile pentru realizarea unuiapel SOAP RPC ºi regulile de codificare a mesajelor SOAP.

În secþiunile urmãtoare, vom prezenta modelul de bazã ºi structura docu-mentelor XML, schemele de codificare, convenþiile RPC utilizate ºi legãturaSOAP cu protocoalele de transport.

5.1. Mesajele SOAP

Dacã pânã în acest moment ne-am fãcut o idee generalã privitoare la structuraper ansamblu a unui mesaj SOAP, în aceastã secþiune vom începe studiereaconcretã a unor exemple.

Reamintim cã un mesaj SOAP trebuie sã includã cel puþin un bloc de date încorpul mesajului ºi cã antetul este opþional. De altfel, nu existã o limitã superioarãa numãrului de blocuri ce pot apãrea în antet sau în corp.

Fie urmãtorul exemplu de mesaj SOAP, vehiculând date referitoare la achi-ziþiile ºi vânzãrile unor sortimente de portocale:

<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:env="http://www.w3.org/2002/06/soap-envelope"> <env:Header>

<tz:tranzactie-id xmlns:tz="http://tranzactie.portocale.info" env:encodingStyle=

Page 99: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

99PROTOCOLUL SOAP

"http://tranzactie.portocale.info/enc" env:role= "http://www.w3.org/2002/06/soap- envelope/role/ultimateReceiver" env:mustUnderstand="true">

tranz10-01</tz:tranzactie-id>

</env:Header> <env:Body xmlns:p="http://www.portocale.info/"> <p:portocale> <!-- partea de achiziþie de portocale --> <p:achizitii env:encodingStyle= "http://www.w3.org/2002/06/soap-encoding"> <p:tip>Portocale greceºti fãrã coajã</p:tip> <p:cod>P10-01-GR</p:cod> <p:cantit p:um="kg">3374</p:cantit> </p:achizitii> <!-- partea de vânzãri 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ã urmãrim structura acestui mesaj, observãm cã respectã modelul pre-zentat în figura 2. Mesajul din exemplul nostru conþine un singur bloc-antet, iarîn corp întâlnim douã elemente (care vor fi utilizate de destinatarul final). Atâtelementul Header, cât ºi Body sunt copiii marcatorului Envelope care, de fapt, joacãrolul unui container de date.

5.2. Elementul Envelope

Elementul Envelope este elementul în interiorul cãruia se gãseºte mesajul SOAP.Acest element are asociat spaþiul de nume de la adresa http://www.w3.org/2002/06/soap-envelope.

În exemplul anterior, identificarea acestui spaþiu de nume se face prin prefixulenv.

<env:Envelope xmlns:env="http://www.w3.org/2002/06/soap-envelope"> <!-- parte opþionalã -->

Page 100: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB100

<env:Header> ... </env:Header> <!-- un singur element Body (obligatoriu) --> <env:Body xmlns:p="http://www.portocale.info/"> ... </env:Body></env:Envelope>

Elementul Envelope poate avea maxim douã elemente-copil: Header ºi Body. Deasemenea, Envelope trebuie sã conþinã ºi declaraþiile spaþiilor de nume care suntfolosite în interiorul mesajului.

5.3. Elementul Header

Dacã acest element apare, atunci el trebuie sã fie primul element-copil almarcatorului SOAP Envelope. Elementul Header poate conþine un set de intrãri,fiecare element încapsulat de Header purtând numele de bloc antet.

Scopul unui bloc antet este de a comunica informaþia relevantã în procesareamesajului SOAP. Un exemplu ar putea fi un bloc antet care conþine elemente deautentificare sau informaþii despre ruta (drumul) mesajului.

Elementul Header are asociat spaþiul de nume specificat de adresa http://www.w3.org/2002/06/soap-envelope.

<env:Envelope xmlns:env="http://www.w3.org/2002/06/soap-envelope"> <env:Header>

<tz:tranzactie-id xmlns:tz="http://tranzactie.portocale.info" env:encodingStyle= "http://tranzactie.portocale.info/enc" env:role= "http://www.w3.org/2002/06/soap- envelope/role/ultimateReceiver" env:mustUnderstand="true">

tranz10-01</tz:tranzactie-id>

</env:Header> ...</env:Envelope>

Fiecare bloc antet trebuie sã aibã asociat un spaþiu de nume calificat (în acordcu regulile din SOAP Schema). Modul de codificare a datelor se realizeazã prinintermediul atributului encodingStyle, iar nodul care trebuie sã-l proceseze se specificã

Page 101: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

101PROTOCOLUL SOAP

prin atributul role. De asemenea, poate conþine ºi atributul mustUnderstand, cuajutorul cãruia se poate solicita ca un nod SOAP sã-l înþeleagã sau nu.

În specificaþiile SOAP este clar definit faptul cã atributele role ºi mustUnderstandpot apãrea doar în declaraþiile blocurilor antet. De altfel, emiþãtorul unui mesajSOAP trebuie sã plaseze aceste atribute cu mare grijã. Dacã ele sunt amplasategreºit, atunci receptorul poate sã le ignore. Deoarece aceste atribute suntfundamentale pentru procesarea SOAP, le vom detalia în cele ce urmeazã.

Atributul role

Atributul role controleazã nodul SOAP (îl vom numi nod-þintã) care va puteaprocesa unul sau mai multe blocuri antet. Atributul role conþine un URI careidentificã rolul pe care îl va juca nodul-þintã. Atunci când un nod primeºte unmesaj incluzând blocuri antet, el trebuie sã verifice aceste blocuri pentru adetermina dacã existã unul pe care-l poate prelucra.

Deºi unui atribut role i se poate asocia orice URI, specificaþia SOAP aprevãzut trei situaþii standard:

� http://www.w3.org/2002/06/soap-envelope/role/none � în acest caz, nici un nodSOAP nu ar trebui sã încerce sã proceseze respectivul bloc antet, deºi alteblocuri antet pot conþine referinþe la el ºi la conþinutul sãu;

� http://www.w3.org/2002/06/soap-envelope/role/next � în aceastã circumstanþã,fiecare nod trebuie sã recunoascã faptul cã respectivul bloc antet trebuietrimis intact urmãtorului nod SOAP (din cadrul rutei de transport a mesajului);

� http://www.w3.org/2002/06/soap-envelope/role/ultimateReceiver � în acest caz, blocu-rile antet ce conþin atributul role cu acest URI asociat (sau cele care nu auatributul role) vor fi procesate doar de cãtre 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 ultimeste cel care va putea procesa acest antet. Acest ultim nod (pe care se gãseºtemãcar un serviciu Web), trebuie sã fie capabil sã proceseze conþinutul mesajului(inclus în elementul Body).

Atributul mustUnderstand

Dacã atributul mustUnderstand are valoarea true, atunci nodul care primeºte mesajultrebuie sã-l poatã procesa sau sã emitã un mesaj de eroare corespunzãtor în cazcontrar. Blocurile antet care conþin mustUnderstand="true" sunt cunoscutesub numele de blocuri antet obligatorii. Anteturile care nu au specificat atributulmustUnderstand sunt totuºi examinate de nodurile-þintã.

Page 102: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB102

În exemplul anterior atributul mustUnderstand are valoarea true, aceasta însemnândcã destinatarul final este obligat sã proceseze antetul. Altfel, nu poate sãprelucreze corpul mesajului.

În specificaþiile SOAP se precizeazã cã un emiþãtor SOAP nu trebuie sãgenereze un mesaj care sã aibã atributul mustUnderstand cu valoarea 1 sau 0, citrue, respectiv, false. Totuºi, nodurile SOAP care primesc mesajul trebuie sãaccepte ºi mesajele pentru care atributul mustUnderstand are valoarea 0 sau 1.

Atributul encodingStyle

Atributul encodingStyle este folosit pentru a declara modul prin care conþinutulunui bloc antet a fost creat. Aceastã informaþie permite nodurilor care inter-acþioneazã cu acel mesaj sã poatã decodifica informaþiile pe care le conþine.SOAP permite mai multe scheme de codificare, dar furnizeazã ºi o schemãproprie.

Deoarece acest atribut este utilizat ºi în corpul mesajului, vom discuta maimulte despre el în cadrul secþiunii 5.4.

Atributul relay

În SOAP 1.2, pentru blocurile antet este definit ºi atributul opþional relay, cuvalori de tip boolean. Acest atribut specificã dacã un bloc antet poate fi transmismai departe, în cazul în care nodul intermediar care trebuia sã-l proceseze nu arealizat acest lucru. Existã precizatã regula conform cãreia un bloc antet care afost deja prelucrat trebuie ºters.

Sunt situaþii în care proiectantul unui aplicaþii ar dori sã introducã noi facilitãþiîn aplicaþie cu ajutorul unor blocuri antet. Un astfel de bloc antet va putea fiprocesat de nodurile intermediare care îl �înþeleg� ºi va fi ignorat de celelalte. Înmod evident, facilitatea nou apãrutã nu a fost implementatã de toate nodurileSOAP. Astfel, pentru a evita situaþiile în care un nod SOAP nu recunoaºte acelbloc antet ºi genereazã o eroare, se va preciza env:mustUnderstand="false".Suplimentar, pentru a împiedica aplicarea regulii implicite a mecanismului deprocesare, blocul antet va avea asociat ºi atributul env:relay= "true" (bloculnu va fi eliminat).

Exemplul urmãtor 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"

Page 103: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

103PROTOCOLUL SOAP

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>

Observãm în exemplul dat cã blocul antet b:secondQuestion este þintã pentruurmãtorul (next) nod din calea de mesaje ºi are prevãzut ºi atributul relay="true".Un nod SOAP care primeºte un asemenea mesaj poate procesa acest bloc antetîn cazul în care îl poate înþelege, dar realizând aceasta conform regulilor existente,el va trebui sã ºteargã acest bloc antet înainte de a retransmite mesajul. Oricum,dacã nodul SOAP ignorã acest bloc antet (ºi poate efectua acest lucru, deoareceblocul nu trebuie obligatoriu sã fie procesat), atunci el va trebui sã-l retrimitã.

Procesarea blocului antet a:firstQuestion este obligatorie. În acest caz, blocultrebuie ºters înainte ca mesajul sã fie retransmis. Existã ºi cazul de excepþie cândnodul, procesând ºi alte blocuri antet, gãseºte reguli care impun ca acel bloc sãnu fie eliminat.

Blocul antet c:thirdQuestion nu are prevãzut atributul relay, aceastã situaþie fiindechivalentã cu relay="false". Conform regulilor, acest bloc antet nu estetrimis mai departe dacã nu este procesat.

Blocul antet Representation

Blocul antet Representation permite mesajelor SOAP sã transporte reprezentãri aleresurselor Web.

Utilizarea unui astfel de bloc se face în cazul în care receptorul are ocapacitate limitatã de a obþine reprezentãri prin alte mijloace, de exemplu dincauza restricþiilor de accesare sau pentru cã efortul de calcul ar fi prea mare(situaþie întâlnitã, de pildã, pentru anumite dispozitive mobile). Acest bloc este,de asemenea, folositor atunci când sunt necesare mai multe referinþe la aceeaºiresursã, dar duplicarea resurselor nu este de dorit.

Page 104: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB104

În acelaºi mesaj SOAP pot exista mai multe apariþii ale blocului Representation.Sã urmãrim urmãtorul 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 Lenuþa</a:nume> <a:foto uri='http://www.infoiasi.ro/~adria/me.jpg' /> </a:Persoana> </soap:Body></soap:Envelope>

Elementul Representation poate avea atributele resource ºi reinsert, conþinândobligatoriu marcatorul Data. Valoarea atributului resource identificã resursa Web acãrei reprezentare este transportatã de elementul Representation. Atributul reinserteste de tip boolean. Când are valoarea true înseamnã cã nodul intermediar careproceseazã mesajul trebuie sã reinsereze blocul antet. Aceasta înseamnã cã, înconjuncþie cu atributul relay cu valoarea true, blocul antet Representation trebuieretrimis. Dacã acest atribut nu existã sau valoarea lui este false, atunci se aplicãregulile obiºnuite de procesare SOAP.

Valoarea elementului Data este o codificare în baza 64 (base64) a reprezentãriiunei resurse Web transportatã de elementul Representation.

5.4. Corpul mesajului SOAP. Elementul Body

Elementul Body este un simplu container pentru datele XML destinate aplicaþiei.Dacã pentru Header trebuie respectate o serie de reguli, pentru Body nu existã oformã standard a structurii sau o modalitate strictã de interpretare. Singuraconstrângere este ca destinatarul final (ultimateRecipient) sã poatã procesa con-þinutul mesajului.

Page 105: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

105PROTOCOLUL SOAP

Dacã privim cu atenþie elementele Header ºi Body observãm cã, deºi suntdefinite ca elemente independente, ele sunt totuºi interconectate. Relaþia dintreun bloc Body ºi unul Header este urmãtoarea: o intrare Body este din punct devedere semantic echivalentã cu una Header care nu are specificat un atribut roleºi pentru care atributul mustUnderstand prezintã valoarea true.

Deja am furnizat exemple de conþinuturi stocate de marcatorul Body, astfelîncât putem sã ne referim acum la semnalarea excepþiilor de comunicare.

Coduri de eroare SOAP

În afarã de rolul sãu de a conþine datele destinate prelucrãrii de cãtre o aplicaþie,Body este folosit ºi pentru trimiterea (cãtre client, uzual) de excepþii care potapãrea în comunicarea de date. Astfel, este utilizat elementul Fault pentrutransportul informaþiilor (structurate sau nestructurate) legate de problemelecare pot apãrea � de exemplu, în momentul procesãrii unui mesaj. Acestmecanism de management al erorilor este prevãzut de specificaþiile SOAP, deaceea instrumentele SOAP trebuie sã respecte acest standard pentru tratareaerorilor.

Elementul Fault are acelaºi spaþiu de nume ca Envelope ºi conþine obligatoriudouã elemente-copil: Code ºi Reason. De asemenea, poate include opþional ºielementele Node, Role ºi Detail.

Un exemplu de utilizare a elementului Fault îl avem în fragmentul de cod demai jos. Acest mesaj de eroare este un rãspuns la mesajul din exemplul privitorla tranzacþiile de sortimente de portocale (a se revedea secþiunea 5.1). Pentru aînþelege ce a cauzat eroarea trebuie sã cunoaºtem semnificaþia fiecãrui elementprezent în mesaj.

<?xml version="1.0" ?><env:Envelope xmlns:env="http://www.w3.org/2002/06/soap-envelope" xmlns:p="http://www.portocale.info/"> <env:Body> <env:Fault> <env:Code> <env:Value>env:Receiver</env:Value> <env:Subcode> <env:Value>p:cod_incorect</env:Value> </env:Subcode> </env:Code> <env:Reason lang="en-UK"> The specified product does not exist. </env:Reason>

Page 106: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB106

<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>

Urmãrind codul exemplului, remarcãm faptul cã primul element al lui Faulteste Code, incluzând douã sub-elemente: primul este obligatoriu ºi se numeºteValue, iar al doilea e opþional ºi are denumirea de Subcode.

Elementul Value poate conþine orice cod de eroare care se gãseºte în spaþiulde nume specificat de http://www.w3.org/2002/06/soap-envelope.

În cazul nostru, conþinutul marcatorului Value este env:Receiver (vezi exemplulurmãtor) ºi ne indicã faptul cã a existat un nod la capãtul rutei de mesaje (adicãdestinatarul final) care a generat eroarea. Astfel, putem ºti cã aceastã eroare nua fost generatã de un nod intermediar care a procesat antetul mesajului:

<env:Code> <env:Value>env:Receiver</env:Value></env:Code>

Elementul Subcode include elementul Value, care oferã informaþii despre erorilespecifice aplicaþiei respective (se foloseºte spaþiul de nume definit de dezvoltatorulacelei aplicaþii).

<env:Subcode> <env:Value>p:cod_incorect</env:Value></env:Subcode>

Tabelul urmãtor enumãrã codurile de eroare definite de specificaþia SOAP.

Cod de eroare Descriere

Version Mismatch Apare când se sesizeazã o diferenþã între versiunileSOAP folosite.

MustUnderstand Apare dacã blocul antet conþinând atributulmustUnderstand=�true� nu a putut fi procesat dereceptor.

Page 107: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

107PROTOCOLUL SOAP

Cod de eroare Descriere

DataEncodingUnknown

Apare atunci când conþinutul fiecãrui bloc antet sau bloc din corpul mesajului este codificat cu aju-torul unei scheme despre care nodul SOAP raporteazã cã nu o poate înþelege.

Sender

Apare atunci când emiþãtorul trimite un mesaj care nu are un format corect (de exemplu, un mesaj care nu conþine suficiente date astfel încât destina-tarul sã-l poatã procesa).

Receiver

Apare atunci când entitatea ce recepþioneazã mesa-jul nu-l poate procesa din cauza unor erori ale aplicaþiei. Presupunându-se cã eroarea nu este per-sistentã, mesajul se poate retransmite.

Server

Clasa de erori Server precizeazã cã mesajul nu poate fi prelucrat, nu din motive legate strict de conþi-nutul mesajului, ci mai degrabã din cauza unor pro-bleme de procesare. De exemplu, serviciul ar putea include o conexiune la un terþ server care nu rãs-punde. Mesajul ar putea fi totuºi procesat cu succes într-un alt moment de timp.

Deºi nu-l gãsim în exemplul nostru, elementul Subcode determinã ca meca-nismul de tratare a erorilor în SOAP sã fie extensibil. Astfel, Code conþine unsub-element obligatoriu Value ºi unul opþional Subcode, care poate la rândul lui sãincludã alte marcaje Subcode.

Elementul Reason asociat lui Code este utilizat pentru a furniza o explicaþie înlimbaj natural. În exemplul nostru, avem un mesaj emis în limba englezã: �Thespecified product does not exist� (�Produsul specificat nu existã�). InstrumenteleSOAP folosesc adesea conþinutul elementului Reason atunci când semnaleazãerori, astfel încât activitatea de depanare sã decurgã mai uºor.

Elementul opþional Node furnizeazã informaþia despre nodul din calea demesaje care a generat eroarea. Conþinutul marcatorului Node va fi URI-ul acelui nod.În exemplul de mai sus nu existã specificat Node, deoarece entitatea care a generateroarea a fost ultimul destinatar ºi, evident, emiþãtorul cunoaºte URI-ul sãu.

Elementul Node este completat de marcatorul opþional Role, care furnizeazãinformaþii despre ceea ce realiza nodul atunci când a eºuat. Conþinutul ele-mentului Role este de obicei un URI identificând operaþia (de obicei, un serviciuWeb) cauzatoare a erorii. Partea responsabilã cu rezolvarea erorilor poatedetermina ce �porþiune� a aplicaþiei a funcþionat greºit. Putem observa, deci, cãelementele Node ºi Role sunt utile pentru detectarea cu uºurinþã a erorilor carepot apãrea.

Page 108: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB108

Sã urmãrim în exemplul urmãtor elementul Detail în forma specificã a uneiaplicaþii.

<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>

Prezenþa marcatorului Detail furnizeazã informaþii despre erorile surveniteatunci când destinatarul final a încercat procesarea corpului mesajului. Esteevident cã � atunci când elementul Detail existã � elementele Node ºi Role nu vormai fi specificate. Acelaºi lucru este valabil ºi invers.

Conþinutul elementului Detail este dependent de specificul fiecãrei aplicaþii înparte.

5.5. Maniera de codificare a mesajelor � SOAP Encoding

Deºi scopul acestei cãrþi nu este de a intra în detalii legate de modelul de dateutilizat de protocolul SOAP sau de alte scheme de serializare, vom prezenta însecþiunile urmãtoare câteva concepte care sã ajute cititorul sã aprofundezespecificaþiile oficiale legate de codificãri.

Termeni folosiþi în procesul de codificare

Pentru o mai bunã înþelegere a procesului de codificare în maniera SOAP adatelor transportate, este importantã clarificarea urmãtorilor termeni.

Termenul de valoare (value) este folosit pentru a descrie o anumitã datãcodificatã cu ajutorul unui element XML. O datã reprezintã un ºir de caractere.Valorile dintr-un mesaj SOAP aparþin întotdeauna unui anumit tip de date(similar variabilelor dintr-un limbaj de programare ca Java ori C).

SOAP face distincþie între valorile simple (simple value) ºi valorile compuse(compound value).

Tipurile simple value nu au elemente componente. Pentru a înþelege ce sunt ºicum aratã aceste valori simple, sã urmãrim un paralelism între tipurile int, float ºistring, aºa cum sunt reprezentate într-un limbaj de programare (e.g., Java), ºimodul de reprezentare al lor în SOAP:

Page 109: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

109PROTOCOLUL SOAP

int cantit = 33;<cantit xsi:type="xsd:int">33</cantit>float pi = 3.14159265;<pi xsi:type="xsd:float">3.14159265</pi>java.lang.String sortim = "verde";<sortim xsi:type="xsd:string">verde</sortim>

Se poate remarca faptul cã tipurile de date SOAP sunt de fapt cele specificatede recomandarea XML Schema a Consorþiului Web.

Pentru cazul compound value, o valoare e constituitã din mai multe elementecomponente între care existã o relaþie. Elementele componente care formeazã oastfel de valoare compusã pot fi accesate prin diverse metode precum: indicareapoziþiei în secvenþa de valori (sã ne imaginãm cum accesãm un element pe bazaindexului, atunci când folosim un tablou), utilizând o cheie (ca în cazul tablourilorasociative � hash tables) sau recurgând la numele elementului respectiv (similarstructurilor 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 urmãtorul:

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 folosiþi accesori ordinali pentru obþinerea valorilor dinvariabila de tip tablou Stoc.

Page 110: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB110

Cât priveºte obiectul Java produs, pentru a obþine elementele lui componentevom folosi accesori cu nume: cantit ºi sortim. Vom reveni ulterior la discuþiaasupra tipurilor compuse (inclusiv tablouri ºi structuri).

În SOAP, ca în majoritatea limbajelor de programare, valorile au asociat unanumit tip de datã. Aºa cum se observã ºi din exemplu, mai întâi declarãminstanþe ale tipurilor ºi mai apoi le ataºãm o anumitã valoare.

În esenþã, un accesor reprezintã un element care conþine sau permite accesulla o valoare. În exemplul urmãtor, prenume este un accesor, iar Ory este o valoare:

<prenume>Ory</prenume>

În codul XML de mai jos avem specificat un tip compus reprezentând ocombinaþie de doi accesori (nume ºi prenume) care sunt copiii unui singur accesor(identitate).

<identitate> <nume>Blue</nume> <prenume>Ory</prenume></identitate>

Prin intermediul atributelor id ºi href, SOAP defineºte accesori de tip single--referenced sau multi-referenced. Un accesor simplu-referenþiat (single-referenced) nuposedã o identitate, exceptând cazul în care este element-copil al altui element.În exemplul urmãtor, <adresa> reprezintã un accesor de tip single-referenced:

<persoana> <identitate nume="Blue Ory"> <adresa>

<strada>Portocalelor</strada> <localit>Iaºi</localit> <tara>România</tara>

</adresa> </identitate></persoana>

Conform specificaþiilor SOAP, elementelor li se permite sã referenþieze valorileconþinute în alte elemente. În acest caz, elementul are asociat un atribut (id) careidentificã elementul în cadrul cãruia se aflã data referenþiatã.

Aceastã posibilitate de a referenþia valorile altor elemente este importantã dinmai multe motive. În primul rând, existã ºansa ca dimensiunea mesajului sã semicºoreze. Sã ne imaginãm cã avem de trimis un mesaj care conþine toþi membriifamiliei Blue. Documentul XML în cauzã ar putea avea o structurã precumurmãtoarea:

Page 111: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

111PROTOCOLUL SOAP

<membru> <prenume>Ory</prenume> <nume>Blue</nume></membru><membru> <prenume>Grappy</prenume> <nume>Blue</nume></membru><membru> <prenume>Kiwy</prenume> <nume>Blue</nume></membru>...

Dupã cum se poate observa, are loc o duplicare nedoritã a datelor.Referinþele ne permit minimizarea repetiþiilor, deoarece mulþi accesori potreferi un acelaºi element. Când are loc acest lucru, valoarea este de tipmulti-referinþã (multi-referenced).

Folosind aceastã facilitate, noul document XML va avea forma:

<nume-fam id="nume-fam">Blue</nume-fam><membru> <prenume>Ory</prenume> <nume href="#nume-fam" /></membru><membru> <prenume>Grappy</prenume> <nume href="#nume-fam" /></membru><membru> <prenume>Kiwy</prenume> <nume href="#nume-fam" /></membru>...

Chiar dacã în exemplul de faþã nu s-a salvat foarte mult spaþiu, sã ne gândimla utilitatea acestui mecanism atunci când lucrãm, de exemplu, cu o multitudinede elemente compuse.

Variabilele multi-referinþã sunt utile ºi atunci când se serializeazã un graf sauo colecþie de obiecte, multe dintre acestea având referinþã cãtre acelaºi obiect. Înacest caz, este important sã menþinem legãturile astfel încât sã putem reconstruiobiectul la deserializare.

Aceastã abordare poate fi folositã, de asemenea, pentru a permite unuiaccesor sã referenþieze informaþii externe resurselor, care nu fac parte din

Page 112: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB112

elementul Envelope (date binare, de exemplu). În exemplul urmãtor sunt referiteinformaþii conþinute în interiorul unui document XML extern:

<identitate nume='Blue Grappy'> <adresa href='http://www.portocale.info/inf.xml#BlueGrappy' /></identitate>

Tipuri de date

Dupã cum probabil deja cititorii avizaþi au remarcat, tipurile de date suportate decodificarea SOAP sunt definite în specificaþiile XML Schema: Datatypes (a serevedea capitolul 2).

Pot fi folosite tipurile elementare ca int, float, string, enumerãri, ºiruri de octeþietc., plus tipurile derivate din acestea.

Figura 6. Fragment din reprezentarea graficã a schemei privitoarela codificare (SOAP Encoding)

Vom face mai jos o trecere rapidã în revistã a acestor tipuri, lãsând lalatitudinea cititorului aprofundarea amãnuntelor.

� String

Tipul de date string este definit de recomandarea XML Schema. De remarcat cãacest tip string nu este identic cu tipul string întâlnit în alte limbaje de programare.

Page 113: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

113PROTOCOLUL SOAP

În mod particular, interzice apariþia unei serii de caractere pe care acele limbajele permit (sunt caracterele rezervate din XML, precum �<�, �>� ori �&�). Unstring 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

Specificaþia XML Schema: Datatypes defineºte un mecanism numit enumerare(enumeration). Modelul SOAP îl adoptã în mod direct. Limbajele de programaredefinesc tipul enumerare într-un mod diferit. În cazul SOAP, enumeration � luatdrept concept � indicã un set distinct de nume. O enumerare particularãreprezintã o listã de valori distincte, apropiate, bazate pe acelaºi tip. De exemplu,(�1�, �3�, �5�) este o enumerare posibilã bazatã pe tipul integer. Sunt suportateenumerãrile pentru toate tipurile simple, exceptând tipul boolean.

Fie urmãtoarea 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>

Figura 7. Reprezentarea graficã a schemei XML specificând o enumerare de elemente

Page 114: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB114

O posibilã instanþã care se conformeazã schemei XML anterioare poate aveaforma:

<lotPortocale>12</lotPortocale><greutate>3374.01</greutate><culoare>Albastru</culoare>

� ªir de octeþi

Deºi în multe limbaje de programare ºirurile de caractere (string) sunt privite cafiind ºiruri de octeþi, în SOAP lucrurile stau diferit. Un string este reprezentat cuajutorului tipului de datã string. Astfel, dacã aveþi la dispoziþie o colecþie de octeþicare nu reprezintã un string (de exemplu, conþinutul binar al unei imagini ori alunui fiºier executabil), atunci aceºti octeþi trebuie transformaþi cu algoritmul decodificare base64 descris în specificaþia XML Schema.

Un exemplu de codificare base64 a unui ºir de octeþi este urmãtorul:

<imagine xsi:type="SOAP-ENC:base64">hsgajTYUTUgsjaguuwq1jgds33ds</imagine>

Un ºir de octeþi poate fi codificat ca o valoare de tip single-referenced saumulti-referenced. Regulile de codificare pentru ºiruri de octeþi sunt similare cu celepentru string.

În particular, un element ºir de octeþi poate avea un atribut de tip id.Elementele accesor suplimentare pot avea asociat atributul href.

� Folosirea tipurilor compuse

SOAP defineºte tipuri corespunzãtoare a douã modele întâlnite adesea înlimbajele de programare.

Primul este structura. Un struct este o valoare compusã în care numeleaccesorului permite diferenþierea valorilor membrilor ºi nici un accesor nu areacelaºi nume cu un altul (se asigurã unicitatea numelor).

Al doilea procedeu recurge la un tablou; un array permite memorarea uneivalori compuse în care indexul (numãrul) poziþiei diferenþiazã valorile membrilorsãi.

Un exemplu în care se folosesc structuri este urmãtorul, considerând frag-mentul de schemã XML:

<xs:element xmlns:xs='http://www.w3.org/2001/XMLSchema' name="Carte"> <xs:complexType> <xs:sequence> <xs:element name="autor" type="xs:string" />

Page 115: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

115PROTOCOLUL SOAP

<xs:element name="titlu" type="xs:string" /> <xs:element name="pag" type="xs:integer" /> </xs:sequence> </xs:complexType></xs:element>

Reprezentarea graficã este ilustratã de figura 8.

Figura 8. Reprezentarea graficã a schemei XML specificând o structurã

O structurã ce se conformeazã schemei anterioare poate fi urmãtoarea:

<Carte xmlns="urn:infoiasi.ro"> <autor>Sabin Buraga</autor> <titlu>Proiectarea siturilor Web</titlu> <pag>346</pag></Carte>

În cazul tablourilor exemplificãm cu ajutorul schemei de mai jos, care foloseºteîn mod explicit maniera de codificare SOAP:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:enc="http://www.w3.org/2001/06/soap-encoding"> <xs:import namespace="http://www.w3.org/2001/06/soap-encoding" /> <xs:element name="numereleFavorite" type="enc:Array" /></xs:schema>

Un exemplu de tablou conform schemei de mai sus este:

<numereleFavorite xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:enc="http://www.w3.org/2001/06/soap-encoding" enc:itemType="xs:int" enc:arraySize="2"> <number>29</number> <number>10</number></numereleFavorite>

Page 116: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB116

5.6. Reguli de serializare

Elementele XML într-un mesaj SOAP sunt fie independente, fie imbricate. Dinînsãºi natura XML, majoritatea elementelor sunt imbricate ca sub-elemente alealtora. Marcajele independente nu sunt sub-elemente ale nici unui element, iar înurma serializãrii ele se gãsesc pe primul nivel al arborelui DOM asociat.

Toate valorile într-un mesaj SOAP sunt codificate ºi incluse în cadrul unuielement. Aceasta nu înseamnã cã orice element XML conþine o valoare. Deexemplu, tipurile de date compuse precum structurile sau tablourile includsub-elemente conþinând valori.

Modelul de date SOAP

Atributul encodingStyle apare atât în blocurile antet, cât ºi în cadrul elementuluiBody al unui mesaj SOAP. Acest atribut impune ca mesajul sã aibã o anumitãformã care se supune regulilor unei scheme XML ce este cunoscutã atât deemiþãtor, cât ºi de receptor.

Din anumite motive, poate exista ºi riscul ca emiþãtorul ºi receptorul sã nuaibã acces la aceeaºi schemã. Pentru evitarea problemelor de acest gen, spe-cificaþiile SOAP prevãd existenþa unei scheme ºi a unor reguli de codificareproprii. Acestea sunt cunoscute sub denumirea de SOAP Encoding ºi spaþiul denume corespunzãtor se precizeazã prin construcþia:

env:encodingStyle= "http://www.w3.org/2003/05/soap-encoding"

Regulile pentru codificarea datelor aplicaþiei în mesaje SOAP se regãsesc înrecomandarea SOAP sub denumirea de model de date (SOAP Data Model). Înaceastã parte a specificaþiei se aratã cum sunt reduse structurile de date la un grafetichetat.

Mecanismul general este prezentat în figura 9.Existã douã aspecte ale codificãrii. Primul constã în transformarea structurilor

de date într-o formã convenabilã de exprimare în XML, cu ajutorul regulilorspecificate în modelul de date SOAP. Un alt aspect presupune verificarea datelorexistente în documentul XML, astfel încât sã respecte regulile din schema SOAP.

În mod obiºnuit, instrumentele SOAP vor suporta serializarea ºi deserializareagrafurilor de obiecte folosind acest model, cu minim de efort din parteaprogramatorului.

Page 117: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

117PROTOCOLUL SOAP

Figura 9. Mecanismul de codificare oferit de SOAP

Utilizarea altor codificãri SOAP

Multe dintre aplicaþiile existente au fost create astfel încât sã poatã folosi XML.Dacã se doreºte utilizarea protocolului SOAP în cadrul acestor aplicaþii, ar trebuisã se recurgã la schemele de modelare deja existente.

Aceasta se poate realiza prin intermediul atributului encodingStyle. Deci, în locsã se codifice corpul sau antetul unui mesaj folosindu-se SOAP Data Model, sevor putea utiliza regulile din schemele de validare specifice fiecãrei aplicaþii.Evident, trebuie sã ne asigurãm cã entitatea care doreºte serviciile pe care leoferim înþelege modul nostru de codificare.

Un asemenea stil de codificare adaugã un plus de forþã protocolului SOAP.Cu excepþia faptului cã acest mod de codificare favorizeazã reutilizarea schemelordeja existente ºi, mai mult, se are de-a face cu schimburi de mesaje ºi nu cuapeluri de proceduri la distanþã (RPC), se încurajeazã proiectarea de servicii Webcare permit o granularitate mult mai mare a interacþiunilor. În esenþã, se facetrecerea de la modelul RPC � care încurajeazã un model de tip fine-grain (unclient trimite o serie de date, apoi primeºte alte date ºi comunicarea continuã

Page 118: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB118

pânã când clientul este satisfãcut) � la un model coarser-grained (clientul transmitetoate datele necesare, astfel încât receptorul, dupã ce realizeazã operaþiilepreconizate, va trimite dupã un anumit timp rãspunsul complet).

Pentru a înþelege mai bine aceastã trecere de la fine-grained la coarser-grained, sãne imaginãm diferenþa dintre o discuþie la telefon ºi trimiterea unui fax. Înprimul caz, purtãm un dialog, în care partenerii joacã un anumit rol, schimbândpe o anumitã perioadã de timp tot felul de informaþii. În al doilea caz însã,cineva care doreºte sã rezolve o problemã trimite un fax prin intermediul cãruiatransmite toate informaþiile de care cealaltã parte are nevoie.

Am fãcut mai sus precizarea cã, folosind propriile noastre scheme decodificare, trebuie sã scriem ºi propriul cod cu ajutorul cãruia sã se poatã realizamanagementul mesajelor codificate în acest mod. Dacã un anumit nod foloseºteSOAP RPC (unde codificarea este datã de modelul de date SOAP) ºi dorim sãcomunicãm cu acel nod, atunci trebuie sã efectuãm o adaptare a instrumentelornoastre în acest sens.

Figura 10. Procesarea datelor folosind mai multe scheme

Dupã cum se remarcã în figura 10, handler-ul aflat pe serverul SOAP este celcare oferã posibilitatea de înþelegere a mesajelor care sunt codificate cu o altãschemã, diferitã de cea implicitã, pusã la dispoziþie de protocolul SOAP.

Page 119: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

119PROTOCOLUL SOAP

6. Maniera de transport al mesajelor SOAP

Aºa cum precizam la începutul capitolului de faþã, în cadrul stivei tehnologiilorcare stau la baza serviciilor Web, SOAP se regãseºte la un nivel superiornivelurilor de reþea ºi transport ale Internetului. Pentru aplicaþiile folosindSOAP, nu conteazã ce protocol de transport este utilizat la realizarea schimbuluide mesaje. Acest aspect conferã protocolului SOAP o flexibilitate sporitã.

În cadrul specificaþiile SOAP întâlnim expresia SOAP Binding, care precizeazãmodul prin care mesajele SOAP pot fi transmise de la un nod la altul, folosindla bazã un anumit protocol (HTTP, SMTP etc.).

Un mesaj SOAP e definit respectând regulile XML Infoset. Pentru transportulunui astfel de document, se recurge la un protocol care sã permitã forma serializatãa documentului ºi care sã faciliteze transportul între nodurile din ruta (calea) demesaje fãrã pierdere de informaþii � se asigurã fiabilitatea transmisiei de date.

În majoritatea situaþiilor se pot utiliza facilitãþile native ale protocolului debazã sau, dupã caz, se pot introduce anumite blocuri antet care sã oferefuncþionalitãþile de care este nevoie.

6.1. Relaþia dintre SOAP ºi HTTP

Legãtura SOAP-HTTP oferã avantajul de a folosi caracteristicile protocoluluiSOAP împreunã cu bogatele trãsãturi oferite de HTTP. Transportând mesajeleSOAP via HTTP nu înseamnã cã protocolul SOAP suprascrie semantica existentãa HTTP-ului, ci, mai degrabã, faptul cã semantica SOAP se integreazã în modnatural în cea a protocolului HTTP.

SOAP, în mod firesc, urmeazã modelul HTTP cerere/rãspuns, cererea SOAPîncapsulându-ºi parametrii în cererea HTTP, iar furnizarea rãspunsului SOAP serealizeazã printr-un rãspuns HTTP.

Figura 11. Încapsularea mesajelor SOAP în cadrul mesajelor HTTP

Page 120: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB120

De observat cã intermediarii SOAP nu sunt aceeaºi cu intermediarii HTTP.Astfel, un intermediar HTTP adresat cu un câmp din antetul unui mesaj HTTPnu poate controla ºi prelucra elementul de conþinut al mesajului SOAP transportatîn cererea HTTP.

Existã douã modalitãþi de schimb al mesajelor SOAP folosind HTTP, denu-mite ºi ºabloane de interschimb al mesajelor � MEP (Message Exchange Pattern):

� utilizând metoda POST pentru transportul mesajelor SOAP în corpul cereriiHTTP, respectiv în mesajul de rãspuns (acesta este modelul de schimb almesajelor SOAP de tip cerere-rãspuns � SOAP Request-Response Message ExchangePattern);

� utilizând metoda GET pentru a întoarce mesajul SOAP în corpul mesajuluide rãspuns HTTP (acesta este modelul de schimb al mesajelor SOAP de tiprãspuns � SOAP Response Message Exchange Pattern).

Ar putea apãrea întrebarea: care metodã ar trebui folositã la un moment dat?Conform modelului arhitectural al spaþiului Web, metoda GET poate fi folositãatunci când scopul schimbului de mesaje este de obþinere a unei informaþii, iarresursa cu care s-a interacþionat a rãmas neschimbatã. Astfel de interacþiuni suntcunoscute în specificaþiile HTTP ca fiind sigure (safe) ºi idempotente. MetodaPOST poate fi folositã în toate cazurile.

Relaþia SOAP � HTTP GET

Utilizarea metodei GET semnificã faptul cã rãspunsul la cererea GET a unuinod SOAP este un mesaj SOAP încorporat în rãspunsul HTTP.

Sã urmãrim exemplul urmãtor în care avem o cerere GET (dupã cum seobservã, parametrii de intrare transmiºi serviciului Web sunt incluºi în URL, caºir de interogare � query string � prefixat de �?�):

GET /Informatii?tip=3307 HTTP/1.1Host: www.portocale.infoAccept: application/soap+xml

Facem observaþia cã în acest caz corpul mesajului e vid (empty body).Câmpul de antet Accept este folosit pentru a indica formatul preferat cores-

punzãtor cererii realizate. În cazul nostru, este tipul MIME application/soap+xml,datele fiind procesate de aplicaþia client � în loc de tipul text/html folosit pentruredarea conþinutul în cadrul navigatorului (deci datele în loc sã fie destinate�consumului� uman vor fi utilizate pentru o anumitã procesare de cãtre oaplicaþie la nivelul maºinii-client).

Page 121: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

121PROTOCOLUL SOAP

Rãspunsul cererii GET de mai sus va putea fi urmãtorul:

HTTP/1.1 200 OKContent-Type: application/soap+xml; charset="utf-8"Content-Length: NNNN

<?xml version='1.0' ?><env:Envelope xmlns:env="http://www.w3.org/2002/12/soap-envelope"> <env:Header> ... </env:Header> <env:Body> <!-- diferite informaþii specifice aplicaþiei --> </env:Body></env:Envelope>

Relaþia SOAP � HTTP POST

Dupã cum am precizat anterior, POST este disponibilã pentru toate aplicaþiile,indiferent dacã se �scufundã� date XML în mesajele SOAP sau se utilizeazãstilul SOAP RPC.

Vom considera mai jos un exemplu în care o cerere SOAP, numitã GetOrangePrice,este trimisã serverului. Cererea are un parametru cu numele OrangeType, iar rãspunsulva întoarce un parametru Price. Spaþiul de nume propriu aplicaþiei (în fapt, alserviciului Web) ce va fi invocate pe server este http://www.portocale.info/. Dupã cumse poate deduce, dorim sã obþinem preþul unui anumit sortiment de portocale.

Cererea SOAP va avea structura:

POST /Inf HTTP/1.1Host: www.portocale.infoContent-Type: application/soap+xml; charset="utf-8"Content-Length: NNNN

<?xml version="1.0"?><soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:p="http://www.portocale.info/">   <p:GetOrangePrice> <p:OrangeType>Portocale greceºti fãrã coajã</p:OrangeType>    </p:GetOrangePrice> </soap:Body></soap:Envelope>

Page 122: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB122

Rãspunsul SOAP, încapsulat într-un mesaj HTTP, este de forma:

HTTP/1.1 200 OKContent-Type: application/soap+xml; charset="utf-8"Content-Length: NNNN

<?xml version="1.0"?><soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:p="http://www.portocale.info/">   <p:GetOrangePriceResponse> <p:Price>33</p:Price>    </p:GetOrangePriceResponse> </soap:Body></soap:Envelope>

În cazul în care apare o eroare la procesarea cererii, se va returna un mesajSOAP Fault de genul:

HTTP/1.1 500 Internal Server ErrorContent-Type: application/soap+xml; charset="utf-8"Content-Length: NNNN

<?xml version='1.0' ?><env:Envelope xmlns:env="http://www.w3.org/2002/12/soap-envelope"> <env:Body> <env:Fault> ... </env:Fault> </env:Body></env:Envelope>

6.2. Relaþia dintre SOAP ºi transportul de mesajede poºtã electronicã (e-mail)

Mesajele SOAP pot fi trimise ca parte text a corpului unui mesaj de e-mail saudrept fiºier ataºat (attachment) acestui mesaj.

Facem încã de la început observaþia cã exemplele oferite mai jos nu reprezintão manierã standard, ci doar o modalitate de transport al mesajelor SOAP.

Sã urmãrim urmãtoarea cerere SOAP transportatã cu ajutorul protocoluluiSMTP (Simple Mail Transfer Protocol):

Page 123: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

123PROTOCOLUL SOAP

From: [email protected]: [email protected]: ContractDate: Fri, 29 Dec 2006 18:33:00 ESTMessage-Id: <[email protected]>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>

Vom presupune cã nodul care recepþioneazã un astfel de mesaj are abilitateade a procesa mesajele SOAP. În plus, ºi nodul care a emis cererea trebuie sã aibãcapacitatea de a putea prelucra, de exemplu, un rãspuns SOAP, în cazul apariþieiunei erori.

Rãspunsul pentru cererea anterioarã ar putea fi de forma:

From: [email protected]: [email protected]: ContractAxDate: Fri, 29 Dec 2006 18:45:07 ESTMessage-Id: <[email protected]>In-replyto: <[email protected]>Content-Type: application/soap+xml<?xml version='1.0' ?><env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">

Page 124: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB124

<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>

În acest exemplu, Message-ID-ul corespunzãtor mesajului original estetransportat în In-replyto, care interconecteazã mesajele de e-mail la nivelulSMTP. Nu se furnizeazã însã o corelaþie specificã SOAP între cerere ºirãspunsul aferent. În exemplificarea de faþã, aceasta se bazeazã pe existenþablocului antet contract. În general, aceste corelaþii sunt dependente de fiecareaplicaþie în parte.

Mai multe discuþii legate de legãtura SOAP-Email puteþi gãsi la adresahttp://www.w3.org/TR/soap12-email.

7. Apelul de proceduri la distanþã via SOAP RPC

Datoritã faptului cã specificaþiile SOAP furnizeazã suport pentru RPC, mulþiprogramatori au constatat uºurinþa cu care se pot dezvolta servicii Web bazatepe SOAP RPC. Chiar dacã SOAP RPC nu este paradigma cea mai dominantãpentru SOAP, este uºor de obþinut rezultate folosind-o, deoarece majoritateainstrumentelor suportã bine-cunoscutul model RPC.

Avem în figura de mai jos arhitectura generalã SOAP-RPC:

Page 125: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

125PROTOCOLUL SOAP

Figura 12. Mecanismul de transmisie ºi invocare SOAP RPC

Conform specificaþiilor SOAP, atunci când dorim sã realizãm o cerere folosindSOAP RPC trebuie sã cunoaºtem urmãtoarele:

� adresa nodului SOAP þintã;� numele metodei (procedurii) dorite a fi invocate;� argumentele (ºi valorile acestora) care vor fi transmise metodei împreunã cu

orice parametri de ieºire sau valori de retur;� modalitatea clarã de separare a argumentelor folosite pentru identificarea

resursei Web de cele utilizate de cãtre nodul-þintã care face apelul metodei.

Opþional, putem avea date care pot fi transportate în blocurile antet alemesajului SOAP.

Unul din principalele scopuri ale protocolului SOAP este cel de a încapsulaºi interschimba apelurile RPC folosind extensibilitatea ºi flexibilitatea limbajuluiXML.

SOAP RPC implicã douã modalitãþi de interschimb al mesajelor: SOAPResponse MEP ºi SOAP Request-Response MEP, despre care am discutat în cadrulsecþiunii 6.1 a prezentului capitol.

Page 126: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB126

Sã urmãrim în cele de mai jos un exemplu de utilizare a SOAP-RPC. Figura13 prezintã o interacþiune simplã între un serviciu Web care oferã posibilitateade deschidere a unui cont bancar ºi un client (în cazul nostru, companiaAxiologic Research) care intenþioneazã sã foloseascã acest serviciu. ServiciulWeb pune la dispoziþie o operaþie (metodã) numitã deschideCont(�), fiind expusvia un server SOAP. Maniera de acces la acest serviciu Web se realizeazã prinSOAP RPC (protocolul SOAP nu furnizeazã nici o modalitate de descriere ainterfeþelor, dar � aºa cum s-a vãzut în capitolul 3 � acest aspect e suplinit delimbajul WSDL).

// Implementarea clientului

Banca b = new Banca();

String cont = b.deschideCont

(tip, denumire, sitWeb);

// Implementarea serviciului

class Banca {

public String deschideCont

(tip, denumire, sitWeb) {

// operaþii pt. crearea

// unui cont bancar

return nrCont;

}}

Figura 13. Interacþiunea cu un serviciu Web folosind SOAP RPC

Clientul interacþioneazã cu serviciul printr-o clasã ciot (numitã stub sau proxy)purtând numele de Banca, generatã uzual în mod automat de cãtre un instrument(puteþi scrie ºi manual propriul dumneavoastrã stub). Cu ajutorul acestei clase sefaciliteazã împachetarea ºi despachetarea datelor aplicaþiei în/din mesaje SOAPRPC.

Liniile de mai jos semnificã o cerere SOAP RPC de la un client cãtre unserviciu 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=

Page 127: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

127PROTOCOLUL SOAP

"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 surprinzãtor într-un mesaj SOAPRPC. Respectând specificaþiile, conþinutul este inclus într-un element Body.Facem observaþia cã în exemplul nostru nu avem blocuri antet, care nu ne suntutile în acest caz, dar SOAP RPC nu exclude astfel de elemente.

Revenind la exemplu, vedem cã numele elementului deschideCont e identic cunumele metodei care va fi apelatã de serviciul Web. Conþinutul marcatoruluib:deschideCont va corespunde parametrilor metodei deschideCont(�) prezentatã înfigura de mai sus. Suplimentar, se va mai adãuga atributul xsi:type necesardestinatarilor mesajului pentru a converti conþinutul fiecãrui parametru conformtipurilor de date corespunzãtoare limbajului de programare ce implementeazãserviciul Web în cauzã.

Rãspunsul la cerere respectã un set mai complex de reguli ºi convenþii:

<?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>

Page 128: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB128

</b:deschideContResponse></env:Body></env:Envelope>

Sesizãm douã aspecte legate de acest rãspuns care trebuie discutate.În primul rând, numele elementului de rãspuns este acelaºi cu cel din mesajul

de cerere, numai cã i s-a ataºat sufixul Response (în momentul de faþã, toateinstrumentele folosesc aceastã convenþie).

Al doilea aspect constã în faptul cã rãspunsul este capabil sã se muleze pesemantica apelului de procedurã pentru multe dintre limbajele de programareactuale. Acest aspect se datoreazã suportului pentru parametri de tip in, out, in/out.Un parametru de in este un parametru de intrare pentru procedura apelatã. Unparametru out este parametrul care va conþine date la terminarea apelului deprocedurã. Un parametru de tip in/out are caracteristicile ambilor parametri in ºiout. Diferenþa constã în faptul cã un parametru de tip out este similar cu o valoarede retur, dar datele conþinute de el pot fi ignorate de cãtre apelantul procedurii.

Datoritã importanþei pe care o valoare de retur o are în numeroase limbajede programare, ea este separatã de parametrii in/out, astfel încât în mesajulnostru se foloseºte elementul rpc:result pentru identificarea elementului ce includerãspunsul dorit. În cazul acesta e vorba de b:nrCont, elementul care conþinevaloarea de retur. Alte elemente care nu sunt referenþiate sunt tratate ca simpliparametri in/out.

Comportamentul este diferit de versiunile anterioare de SOAP, unde valoareade retur trebuia sã fie primul element-copil al rãspunsului.

Specificaþia SOAP 1.2 a fost modificatã astfel încât sã se rezolve eventualeprobleme care puteau apãrea (de exemplu, ce se întâmplã în cazul în care nu seîntoarce nici o valoare de rãspuns).

Este posibil ca ºi în comunicarea SOAP RPC sã aparã probleme (excepþii).Pentru detectarea ºi eventual rezolvarea lor, se recurge la avantajul mecanismuluifurnizat de Fault. În plus, au fost adãugate ºi alte coduri de eroare, al cãror spaþiude nume este specificat de adresa http://www.w3.org/2002/06/soap-rpc (a se vedeatabelul de mai jos).

EroareCodificarea SOAP privitoare la

semnalarea erorii

O eroare apãrutã la receptor (de exem-plu: out of memory)

Trebuie generatã o eroare cu valoareaenv:Receiver

Receptorul nu înþelege codificarea (cazulîn care emiþãtorul foloseºte altã codificaredecât receptorul)

Trebuie generatã o eroare în care Value arevaloarea env:DataEncodingUnknown

Page 129: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

129PROTOCOLUL SOAP

Eroare

Codificarea SOAP privitoare la semnalarea erorii

Serviciul care a fost invocat nu conþine nici o metodã care sã se potriveascã cererii RPC

Trebuie generatã o eroare în care elementul Code conþine elementul Value cu valoarea env:Sender, iar elementul SubCode va avea Value setat pe rpc:ProcedureNotPresent

Receptorul nu poate procesa argumentele trimise (numãr incorect de parametri ori nu se potrivesc tipurile de date)

O eroare în care elementul Code conþine Value având valoarea env:Sender ºi elementul SubCode include Value cu rpc:BadArguments

În exemplul de mai jos avem un caz în care a apãrut o eroare SOAP RPC.Aceastã situaþie este rezultatul unei cereri construite incorect (nu s-a transmis unparametru). Serviciul Web trimite un mesaj de rãspuns în care se poate depistacauza apariþiei erorii. Se observã cã ne regãsim în ultimul caz expus în tabelul demai sus, în care mesajul de rãspuns specificã faptul cã a apãrut o eroare generatãde emiþãtor (<env:Value>env:Sender </env:Value>) ºi care s-a datorattrimiterii unui numãr 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"> Lipseºte parametrul &quot;tip&quot;. </env:Reason> </env:Fault></env:Body></env:Envelope>

Remarcãm, de asemenea, cã în mesaj este utilizat ºi elementul Reason ceinclude explicaþii în limbaj natural despre eroarea apãrutã.

Page 130: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB130

8. Versiuni SOAP

O observaþie interesantã despre SOAP este aceea cã elementul Envelope nuexpune o versiune explicitã a protocolului, aºa cum fac alte protocoale � unexemplu este HTTP (e.g., HTTP/1.0 versus HTTP/1.1), iar un altul este WDDX(<wddxPacket version="1.0">...</wddxPacket>).

Proiectanþii protocolului SOAP au ales cu bunã ºtiinþã aceastã variantã,deoarece s-a observat cã suportul oferit de numãrul versiunii este destul de fragil.

Astfel, s-a apelat la utilizarea spaþiilor de nume XML: versiunea protocoluluieste indicatã de URI-ul spaþiului de nume corespunzãtor elementului Envelope.

Motoarele de cãutare/regãsire a serviciilor Web vor cunoaºte cum sã tratezediferite mesaje SOAP cu care ar putea intra în contact conform urmãtoarelorreguli:

� dacã mesajul are o versiune similarã cu aceea utilizatã de aplicaþie, atuncimesajul se va putea procesa;

� dacã mesajul are o versiune mai veche decât orice versiune pe care aplicaþiaºtie sã o proceseze, atunci pot avea loc douã acþiuni: se genereazã o eroare detipul Version Mismatch ºi/sau se trimit clientului informaþii legate de versiunilepe care le poate accepta;

� dacã mesajul are o versiune mai nouã decât toate versiunile pe care programulîn cauzã ºtie sã le prelucreze, atunci se poate alege procesarea mesajului (ceeace nu este întotdeauna o soluþie bunã) sau se poate încerca sã se trimitãclientului informaþii privitoare la versiunile pe care le suportã.

Pe ansamblu, mecanismul versiunilor bazate pe URI-uri oferã o mare flexi-bilitate ºi adaugã o mai mare putere de conciliere între aplicaþii în cazul apariþieimesajelor 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ã sereferã la capacitatea de a introduce noi informaþii în cadrul mesajelor SOAP.

Existã ºi o extensibilitate orizontalã care se referã la posibilitatea ca diferitepãrþi dintr-un mesaj sã poatã fi procesate de noduri diferite. Aceastã extensibilitateorizontalã este furnizatã de cãtre intermediarii SOAP.

Page 131: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

131PROTOCOLUL SOAP

Necesitatea existenþei intermediarilor

Intermediarii SOAP sunt aplicaþii care pot procesa pãrþi ale unui mesaj SOAP pedrumul pe care acesta îl parcurge de la emiþãtor la destinaþia lui finalã. Inter-mediarii pot accepta ºi pot retrimite mesajele SOAP. Existã trei motive principalecare fac necesarã prezenþa intermediarilor SOAP: traversarea de domenii deîncredere (crossing trust domains), asigurarea scalabilitãþii ºi furnizarea unor serviciisuplimentare de-a lungul cãii (rutei) de transport al mesajelor.

Modul de traversare a mesajului SOAP prin domenii sigure este de fapt oproblemã care se regãseºte în cadrul sistemelor distribuite. Sã considerãm relaþiadintre o organizaþie ºi Internet. În cadrul organizaþiei, calculatoarele formând oreþea localã constituie un domeniu sigur, însã Internetul este vãzut ca undomeniu nesigur. Între aceste domenii existã ziduri de protecþie (firewall-uri) ºiporþi (gateway-uri) având rolul de a permite sau nu accesul în �domeniul sigur� alorganizaþiei.

Un alt motiv al prezenþei intermediarilor se datoreazã necesitãþii de asigurarea scalabilitãþii sistemelor distribuite. O imagine simplificatã a sistemelor distribuitee formatã din douã tipuri de noduri (gazde): unele care formuleazã cereri(clienþii) ºi altele care furnizeazã rãspunsul la aceste cereri (serverele). Folosindacest model, se poate crea un sistem distribuit scalabil, cu oricâte servere la unmoment dat. Pe acest principiu funcþioneazã ºi spaþiul Web.

Sã luãm exemplul unui mesaj de e-mail. Avem douã companii A ºi B.Corporaþia A trimite un mesaj de e-mail la B, însã serverul de e-mail al acesteiaeste supraîncãrcat. În aceste condiþii, folosind prioritatea mesajelor ºi comparândcam cât este de încãrcat serverul, mesajul poate sã treacã printr-o serie de noduriintermediare înainte de a ajunge la compania B. Eventual, mesajul va fi stocattemporar pe una dintre maºinile intermediare.

Este clar cã într-un astfel de sistem se cere o dirijare a mesajelor care sã nuse bazeze doar pe parametrii mesajului (emiþãtorul, receptorul, prioritatea), citrebuie sã depindã ºi de aspecte ca disponibilitatea ºi încãrcarea nodurilor,congestia datelor etc. Nodurile intermediare sunt cele care ascund faþã deemiþãtor ºi receptor toate aceste entitãþi prin care �navigheazã� un mesaj.

Un ultim argument în favoarea existenþei nodurilor intermediare se referã lacapacitatea acestora de a furniza servicii suplimentare. Unele dintre acesteservicii pot fi foarte importante pentru aplicaþia finalã. Sã analizãm câtevaexemple:

� schimbul de mesaje într-un mediu nesigur (e.g., Internet). Pentru a fi siguri cãmesajul nu va fi alterat, mai întâi putem trimite mesajul unui intermediar

Page 132: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB132

care-l cripteazã. La recepþie, un alt nod intermediar verificã semnãtura digitalãataºatã ºi dacã totul este în regulã va decripta mesajul;

� asocierea unor facilitãþi legate de drumul pe care un mesaj îl va parcurge.Folosind aceste facilitãþi, mesajul va fi dirijat sã treacã exact prin anumiþiintermediari, pentru a ajunge la destinaþie în timpul ºi forma potrivitã. Astfelde informaþii sunt indispensabile pentru realizarea unor activitãþi precumasigurarea calitãþii serviciilor (QoS � Quality of Service), identificarea congestiilorde date etc.

Tipuri de intermediari

SOAP oferã soluþii flexibile la trei din cele mai importante probleme legate denodurile intermediare, rãspunzând la urmãtoarele întrebãri:

� Cum se pot transmite intermediarilor informaþiile necesare?� Cum se poate identifica entitatea care proceseazã datele ºi ce anume pro-

ceseazã?� Ce se întâmplã cu informaþia 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 urmãtoarele operaþii:

� ºterg toate blocurile antet procesate;� eliminã toate blocurile antet care nu mai pot fi retrimise ºi care au fost

ignorate atunci când un nod-þintã a procesat mesajul;� pãstreazã toate blocurile antet care pot fi retransmise ºi care nu au fost

procesate de nodurile-þintã.

Intermediarii activi îndeplinesc diferite acþiuni care pot modifica traseulmesajului SOAP (uneori în moduri care nu sunt descrise în blocurile antet alemesajului). Ca exemple de astfel de acþiuni putem menþiona apelul unor serviciide securitate, invocarea unor servicii care manipuleazã conþinutul mesajului etc.Acþiunile pe care un astfel de intermediar le efectueazã trebuie sã poatã fidetectate de nodurile care vor primi mesajul.

Facem observaþia cã informaþia destinatã nodurilor intermediare (care segãseºte în antet) nu are în general nici o legãturã cu informaþia conþinutã încorpul mesajului.

Page 133: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

133PROTOCOLUL SOAP

10. O privire asupra SOAP 1.1. O comparaþie cu SOAP 1.2

În acest moment, o multitudine de servicii Web încã folosesc SOAP versiunea1.1. Vom discuta în continuare ce diferenþe ºi asemãnãri existã între cele douãversiuni.

SOAP 1.1 se bazeazã pe XML 1.0 (documente XML text), iar SOAP 1.2 sefundamenteazã pe XML Infoset, o viziune mai abstractã, arborescentã, a tipurilorde construcþii XML. De asemenea, reprezentãrile interne bazate pe XML Infosetpot conduce la optimizãri în ceea ce priveºte performanþa.

De asemenea, în SOAP 1.2 au fost schimbate spaþiile de nume XML pentruEnvelope ºi pentru schema de codificare. SOAP 1.2 nu permite existenþa a niciunui element dupã partea de corp a mesajului, pe când definiþia schemei pentruSOAP 1.1 permitea o astfel de posibilitate � vezi tabelul de mai jos.

SOAP 1.1 SOAP 1.2

<Envelope>

<Header>

Zero sau mai multe blocuriantet

</Header>

<Body>

Corpul mesajului

</Body>

Alte elemente

</Envelope>

<Envelope>

<Header>

Zero sau mai multe blocuriantet

</Header>

<Body>

Corpul mesajului

</Body>

</Envelope>

Organizaþia de standardizare a inter-operabilitãþii serviciilor Web � WS-I (WebServices Interoperability) � a dezaprobat existenþa vreunui element suplimentar dupãBody, motivul fiind problemele de incompatibilitate ce ar putea surveni.

În SOAP 1.2 se defineºte un element antet Misunderstood, în interiorul cãruiase gãsesc informaþii suplimentare despre erorile care au apãrut.

În exemplul urmãtor, receptorul raporteazã cã nu poate înþelege douã anteturiobligatorii � o:oranges ºi p:peaches.

<e:Envelope><e:Header> <f:Misunderstood qname="o:oranges" /> <f:Misunderstood qname="p:peaches" /></e:Header><e:Body> <e:Fault>

Page 134: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB134

<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 înSOAP 1.1 valorile permise erau 0 sau 1.

Versiunea 1.2 a înlocuit atributul actor cu atributul role, în esenþã semantica lorfiind asemãnãtoare.

În SOAP 1.2, actorului Next din SOAP 1.1 i s-au ataºat încã douã opþiuni:

� 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.

Noua manierã de semnalare a erorilor în SOAP 1.2

În ceea ce priveºte semnalarea erorilor, specificaþia SOAP 1.2 defineºte noul codde eroare DataEncodingUnknown, care trebuie generat atunci când un mesaj primitfoloseºte o valoare nerecunoscutã, corespunzãtoare atributului encodingStyle. Codulde eroare Client din SOAP 1.1 este redenumit Sender în SOAP 1.2, iar codul deeroare Server din SOAP 1.1 se regãseºte sub numele Receiver în noua versiune.Sunt, de asemenea, adãugate noi coduri de eroare pentru RPC (a se revedeasubcapitolul 7).

SOAP 1.2 aduce o manierã diferitã de structurare a elementelor privitoare laerori � vezi tabelul alãturat.

SOAP 1.1 SOAP 1.2

Fault Fault

faultcode Code

Subcode

Value

faultstring Reason

faultactor Node

Role

detail Detail

Dacã SOAP 1.1 permite o extensie a codurilor de eroare folosind notaþia cu�.� (dot notation), versiunea 1.2 înlocuieºte aceastã notaþie cu o reprezentare XML.

Page 135: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

135PROTOCOLUL SOAP

SOAP 1.1 SOAP 1.2

<e:Fault>

<faultcode>

e:Server.Memory

</faultcode>

<faultstring>

Out of memory.

</faultstring>

</e:Fault>

<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 SOAPtrebuie sã proceseze un mesaj respectând urmãtoarele reguli, în aceastã ordine:

� determinarea rolului pe care îl are de �jucat�. Modalitatea de procesaredepinde de valorile atributului role;

� identificarea antetelor obligatorii corespunzãtoare nodului-þintã. Astfel, dacãantetul este marcat cu atributul mustUnderstand="true" ºi atributul role areo valoare care se potriveºte cu nodul-þintã, atunci acesta e obligat sã procesezeacel bloc antet;

� generarea erorii MustUnderstand, dacã unul sau mai multe anteturi nu suntînþelese; aceasta se întâmplã în cazul în care nodul nu conþine software-ulpotrivit pentru procesarea antetului;

� procesarea antetelor, iar � dacã nodul este destinatarul final �prelucrarea, deasemenea, a corpului mesajului.

� dacã existã un nod intermediar, acesta va ºterge partea din antet care îi eradestinatã ºi va retrimite mesajul.

Mecanismul versiunilor

În SOAP 1.2 s-au adãugat noi semantici pentru a putea lucra cu mesaje SOAPde versiuni diferite.

Un nod SOAP 1.2 care primeºte un mesaj SOAP 1.1 va rãspunde cu unmesaj SOAP 1.1 care conþine eroarea SOAP 1.1 Version Mismatch.

Page 136: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB136

Un nod SOAP 1.2 care primeºte un mesaj SOAP de o versiune oarecare(inclusiv mesaje din versiunile superioare) va rãspunde cu un mesaj (tot de tipSOAP 1.2) conþinând eroarea SOAP 1.2 Version Mismatch ºi un antet Upgrade culista versiunilor pachetelor pe care le suportã.

Un exemplu este urmãtorul:

<u:Upgrade xmlns:u="http://www.w3.org/2001/12/soap-envelope"> <envelope qname="ns1:Envelope" xmlns:ns1= "http://schemas.xmlsoap.org/soap/envelope/" /> <envelope qname="ns2:Envelope" xmlns:ns2= "http://www.w3.org/2001/12/soap-envelope" /></u:Upgrade>

Maniera de codificare a datelor

Versiunea 1.2 furnizeazã o manierã similarã de codificare cu SOAP 1.1, însã multsimplificatã. Vom prezenta în cele ce urmeazã diferenþele cele mai importante.

În SOAP 1.2 atributul encodingStyle poate fi folosit ca element-copil doar alelementelor Body ºi Head ºi al elementului Detail. În SOAP 1.1, acest atribut estepermis pentru orice element din mesaj.

În ceea ce priveºte valorile de tip multi-referenced, pentru SOAP 1.2 acestea potfi codificate diferit faþã de versiunea 1.1.

Vom furniza un exemplu:

SOAP 1.1 SOAP 1.2

<e:Carti>

<e:Carte>

<titlu>Proiectarea

siturilor Web</titlu>

<autor

href="#SabinBuraga"

/>

</e:Carte>

<e:Carte>

<titlu>Tehnologii

XML</titlu>

<autor

href="#SabinBuraga"

/>

</e:Carte>

</e:Carti>

<autor id="SabinBuraga">

<nume>Sabin Buraga</nume>

</autor>

<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>

Page 137: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

137PROTOCOLUL SOAP

Elementele din schema de codificare SOAP diferã între SOAP 1.1 ºi SOAP1.2, dupã cum se poate remarca din tabelul de mai jos:

SOAP 1.1 SOAP 1.2

Atribut href ref

Tip uri-reference IDREF

Exemplu #SabinBuragahttp://www.sit.ro/csb.gif

SabinBuraga

În ceea ce priveºte tablourile, în SOAP 1.2 nu mai întâlnim matricele rare(sparce array). Faþã de SOAP 1.1, atributul arrayType a fost înlocuit cu itemType ºicu atributul arraySize. Sã urmãrim tabelul:

SOAP 1.1 SOAP 1.2

<numere enc:arrayType= "xs:int[2]">

<numar>29</numar>

<numar>10</numar>

</numere>

<numere

enc:itemType="xs:int"

enc:arraySize="2">

<numar>29</numar>

<numar>10</numar>

</numere>

Specificaþia SOAP 1.1 include atributul root care poate fi utilizat pentru amarca rãdãcina schemei/grafului de codificare. În SOAP 1.2 acest atribut esteeliminat.

În SOAP 1.2 omiterea unui accesor este echivalentã cu NIL. Semanticaaccesorului NIL este însã dependentã de aplicaþie.

Mecanismul RPC

SOAP 1.1 oferã un model de implementare care constã în existenþa unui noddestinatar SOAP dat sub forma unui URI, iar în cererea SOAP se regãseºtelogica aplicaþiei. O astfel de abordare implicã ascunderea sub �umbrela� unuiURI a tuturor resurselor care pot fi oferite de un nod, împiedicându-se astfelaccesarea individualã a fiecãrei resurse dorite.

Sã revenim la exemplul nostru cu portocale ºi sã considerãm cã firma cusitul www.portocale.info oferã servicii precum: aflarea preþului unui anumit sor-timent de portocale, obþinerea datelor privind ofertele promoþionale etc. Dacãaceste servicii ar fi plasate sub acelaºi URI, ele ar fi efectiv ascunse. O astfelde abordare reduce Web-ul la un nivel de transport ºi neagã caracterul robustºi scalabil al arhitecturii spaþiului WWW (în stilul REST amintit în primulcapitol).

Page 138: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB138

SOAP 1.2 recomandã ca resursele sã fie identificate de URI-uri separate.Acest aspect permite ca resursele SOAP sã poatã fi accesate nu numai via HTTPPOST, ci ºi prin metoda GET.

SOAP 1.2 acceptã utilizarea fie a tablourilor, fie a structurilor pentru repre-zentarea rãspunsurilor sau apelurilor RPC, în contrast cu SOAP 1.1, care permiteadoar folosirea de structuri. Serializarea bazatã pe tablouri este utilã în condiþiileîn care numãrul de argumente nu este cunoscut dinainte.

În urmãtorul exemplu avem apelul unei funcþii de adunare de numere, careare un numãr variabil de argumente:

<e:Envelope xmlns:e='...'> <e:Body> <a:adunaNumere xmlns:a='...' e:encodingStyle='...'> <n>29</n> <n>15</n> ... <n>33</n> </a:adunaNumere> </e:Body></e:Envelope>

De asemenea, în SOAP 1.2 corpul mesajelor SOAP care folosesc codificareaSOAP pentru RPC trebuie sã conþinã un singur element-copil, acesta repre-zentând apelul sau rãspunsul RPC sub formã de structurã sau tablou.

În urmãtoarele linii, elementul Body este valid în raport cu codificarea SOAP,dar nu este valid când este folosit în conjuncþie cu convenþiile RPC.

<e:Envelope xmlns:e='...'> <e:Body> <a:adunaNumere xmlns:a='...' e:encodingStyle='...'> <n ref='unNumar' /> <n ref='unNumar' /> </a:adunaNumere> <n id='unNumar'>33</n> </e:Body></e:Envelope>

În cele de mai jos, elementul Body va fi valid atât în raport cu codificareaSOAP, cât ºi atunci când apare în legãturã cu convenþiile RPC.

<e:Envelope xmlns:e='...'> <e:Body> <a:adunaNumere xmlns:a='...' e:encodingStyle='...'> <n id='unNumar'>33</n> <n ref='unNumar' />

Page 139: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

139PROTOCOLUL SOAP

</a:adunaNumere> </e:Body></e:Envelope>

Versiunea 1.2 introduce ºi noi coduri de eroare specifice RPC: ProcedureNotPresentºi BadArguments.

Referitor la valorile RPC întoarse, SOAP 1.2 adaugã noi convenþii pentrureprezentarea acestora:

SOAP 1.1 SOAP 1.2

<e:Body>

<b:deschideContResponse>

<b:nrCont>

56291527

</b:nrCont>

</b:deschideContResponse>

</e:Body>

<e:Body>

<b:deschideContResponse>

<rpc:result>

b:nrCont

</rpc:result>

<b:nrCont>

56291527

</b:nrCont>

</b:deschideContResponse>

</e:Body>

Legãtura cu HTTP

Vom prezenta în rândurile urmãtoare diferenþele între legãtura HTTP cu SOAP1.1, respectiv cu SOAP 1.2. Tipul text/xml folosit în SOAP 1.1 a fost înlocuit înversiunea 1.2 cu application/soap+xml.

În SOAP 1.1 s-a pus problema folosirii doar a metodei POST pentrutransportul mesajelor SOAP via HTTP. Versiunea 1.2 oferã suport ºi pentruutilizarea metodei GET. Metoda GET asigurã cã acþiunile de cerere sau derãspuns realizate de un nod SOAP sunt sigure ºi idempotente, fãrã efectesecundare (side effects).

SOAP 1.1 menþiona cã în antetul HTTP apare atributul SOAPAction, carepoate fi folosit pentru a preciza scopul mesajului pe baza unui URI. PentruSOAP 1.2, conþinutul acestui atribut poate fi specificat cu ajutorul parametruluiopþional action, ce poate fi ataºat tipului MIME application/soap+xml. Valoareaparametrului action va fi desemnatã printr-un URI absolut, nu neapãrat rezolvabil,putând fi folositã de diverse entitãþi (e.g., firewall-uri) pentru filtrare.

Suplimentar, SOAP 1.2 oferã o descriere mai detaliatã a codurilor de stareHTTP, de exemplu 2xx sau 4xx, pentru raportarea posibilelor situaþii ce potsurveni.

Page 140: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB140

Securitatea în SOAP

SOAP 1.2 a adus clarificãri versiunii 1.1 din multe puncte de vedere, însã la nivelde securitate oferã destul de puþine noutãþi.

Din acest motiv programatorii trebuie sã urmeze anumiþi paºi adiþionali ºi sãutilizeze diverse tehnici de criptare pentru protejarea mesajelor SOAP � a separcurge ºi cele prezentate în capitolul 7.

De asemenea, dezvoltatorii de instrumente SOAP trebuie sã prevadã situaþiileîn care nodurile SOAP pot primi mesaje cu diferite date eronate. Este recomandatca nodurile SOAP sã aibã capacitatea sã evalueze care este nivelul de încredereîn emiþãtorul unui mesaj ºi în conþinutul aferent.

Referinþe

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): GenericSyntax, IETF RFC 2396: http://www.ietf.org/rfc/rfc2396.txt

Biron, P., Malhotra, A. (eds.), XML Schema Part 2: Datatypes (Second Edition), W3CRecommendation, 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, Iaºi, 2006Cabrera, L., Kurt, C., Web Services Architecture and Its Specifications, Microsoft Press, 2005Dumbill, E., Johnston, J., St. Laurent, S., Programming Web Services with XML-RPC,

O�Reilly, 2001Fallside, 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.txtFreed, N., Borenstein, N., Multipurpose Internet Mail Extensions (MIME) Part One: Format

of Internet Message Bodies, IETF RFC 2045: http://www.ietf.org/rfc/rfc2045.txtGudgin, M. et al. (eds.), SOAP Version 1.2 Part 1: Messaging Framework, W3C Recom-

mendation, 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

Page 141: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

141PROTOCOLUL SOAP

Guruge, A., Web Services: Theory and Practice, Digital Press, 2004Haas, H. et al. (eds.), SOAP Version 1.2 Specification Assertions and Test Collection, W3C

Recommendation, Boston, 2003: http://www.w3.org/TR/soap12-testcollectionKarmarkar, 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-bindingWeerawarana, 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/

Page 142: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)
Page 143: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

Capitolul 5

Descoperirea serviciilor

�Raþionamentul meu nu trebuie interpretatca afirmaþie, ci drept întrebare.�

(Niels Bohr)

Descoperirea serviciilor este una dintre cele mai importante probleme dez-bãtute pe larg în cadrul comunitãþii serviciilor Web. Aceasta, de fapt, poate fiformulatã cu ajutorul unei întrebãri simple: cum poate afla un client despreexistenþa ºi modul de utilizare a unui serviciu?

Procesul de descoperire a serviciilor Web poate fi unul centralizat saudistribuit. Existã mai multe abordãri de soluþionare a acestei probleme, careconstituie subiectul capitolului de faþã.

1. Descoperirea serviciilor Web prin UDDI

Cele mai multe aplicaþii destinate comerþului electronic ºi care recurg la serviciiWeb urmeazã cãi divergente pentru conectarea cumpãrãtorilor, furnizorilor deproduse, pieþelor ºi ofertanþilor de servicii. Fãrã largi investiþii în infrastructuratehnologicã, companiile de toate mãrimile ºi tipurile pot tranzacþiona afaceribazate pe Internet doar cu parteneri globali deja cunoscuþi ºi care furnizeazãaplicaþii ºi servicii Web compatibile.

Specificaþiile UDDI (Universal Description, Discovery, and Integration) au ca scopdefinirea unui set de servicii care sã permitã descrierea ºi descoperirea:

� afacerilor, organizaþiilor ºi a altor furnizori de servicii Web;� serviciilor Web pe care diverse entitãþi le pun la dispoziþie;� interfeþelor cu ajutorul cãrora pot fi accesate aceste servicii.

UDDI reprezintã nivelul superior în stiva formatã din tehnologii ca TCP/IP,HTTP, XML, XML Schema ºi SOAP, cu care cititorul este deja familiarizat.

Page 144: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB144

1.1. Scurt istoric

Atunci când a apãrut UDDI, cea mai mare atenþie s-a fixat asupra UBR (UDDIBusiness Registry) � o implementare publicã a standardului UDDI, care este defapt un catalog principal folosit pentru publicarea serviciilor de tip e-commerce.Deºi UBR rãmâne un aspect important în ceea ce priveºte UDDI, el reprezintãdoar o componentã a acestuia.

Tabelul urmãtor sintetizeazã nivelurile specificaþiilor UDDI (standardeledisponibile de-a lungul anilor):

VersiuneaUDDI

Anullansãrii

Obiectiv

1.0 2000 Crearea cadrului pentru cataloage (regiºtri) destinate ser-viciilor de tip e-business.

2.0 2001 Alinierea specificaþiilor la standardele Web existente ºifurnizarea unei taxonomii flexibile a serviciilor.

3.0 2004 O principalã caracteristicã este cea de adãugare a supor-tului pentru securitate.

Actualmente este în vigoare UDDI 3.0, bazat pe mai vechiul standard UDDI2.0 propus de OASIS (Organization of the Advancement of Structured InformationStandards).

UDDI poate fi considerat drept un meta-serviciu folosit pentru localizareaserviciilor Web, permiþând în acelaºi timp interogãri �robuste�, în raport cucantitatea imensã de meta-date privitoare la serviciile Web oferite de diverºiimplementatori.

1.2. Concepte de bazã ale UDDI

Modelul de date UDDI

În figura 1 se pot remarca principalele entitãþi stocate în regiºtrii UDDI,suplimentar fiind ilustrate ºi relaþiile dintre ele.

Tipurile de date folosite (care constituie nucleul modelului UDDI) suntdefinite cu ajutorul unor scheme XML. A fost ales formatul XML, deoarece esteindependent de platformã ºi permite exprimarea într-un mod natural a relaþiilorierarhice.

Schemele XML utilizate de UDDI specificã diverse tipuri de date funda-mentale necesare utilizatorilor ºi aplicaþiilor în vederea folosirii unui serviciuWeb.

Page 145: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

145DESCOPERIREA SERVICIILOR

Figura 1. Tipurile de date UDDI ºi relaþiile stabilite între acestea

Tipurile de informaþii de bazã sunt urmãtoarele:

� businessService � descrie o colecþie de servicii Web înrudite, oferite de oorganizaþie desemnatã de businessEntity;

� businessEntity � semnificã informaþia privitoare la organizaþia care publicã unserviciu;

� bindingTemplate � specificã detalii tehnice despre serviciu, incluzând o referinþãla interfaþa de programare (API-ul) serviciului;

� tModel � descrie un model tehnic (technical model) reprezentând un conceptreutilizabil, cum ar fi tipul unui serviciu Web, un protocol folosit de serviciileWeb, diverse alte atribute sau meta-date (e.g., semnãturi digitale, relaþii cu alteservicii etc.).

Page 146: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB146

Figura 2. Tipurile de informaþii de bazã UDDI

O structurã de tip businessEntity conþine una sau mai multe structuri distinctede tip businessService. Similar, o structurã de tip businessService poate include unasau mai multe structuri bindingTemplate.

În versiunile recente existã încã douã tipuri de date care faciliteazã afilierearegiºtrilor:

� publisherAssertion � semnificã relaþiile dintre entitãþile stocate într-un registru;� subscription � menþine anumite cereri pentru a se detecta schimbãrile care pot

avea loc în ceea ce priveºte un set de entitãþi.

Toate aceste tipuri de date sunt stocate persistent de regiºtrii UDDI. Pentruun anumit catalog UDDI, structurii de date fundamentale i se asociazã unidentificator unic, în acord cu o anumitã schemã standard. Acest identificator senumeºte cheie (UDDI key).

Mai remarcãm ºi faptul cã o anumitã structurã businessEntity (identificatã de ocheie unicã) va conþine întotdeauna o anumitã instanþã a unei structuri de tipbusinessService (specificatã de propria sa cheie).

De oricâte ori este necesar, prin intermediul acestor chei pot fi folositereferinþe la o anumitã entitate.

Page 147: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

147DESCOPERIREA SERVICIILOR

Informaþiile de tip businessEntity

Fiecare intrare de tip businessEntity stocheazã date descriptive privitoare la oafacere sau organizaþie ºi, prin intermediul entitãþilor businessService pe care leconþine, pune la dispoziþie informaþii despre serviciile oferite.

O entitate businessService descrie un serviciu, dintr-un anumit punct de vedere.Similar, fiecare bindingTemplate inclus într-o structurã businessService furnizeazã odescriere tehnicã a serviciului Web care aparþine serviciului logic declarat debusinessService.

Structura businessEntity conþine urmãtoarele elemente:

� uddi:discoveryURLs, care reprezintã o listã de URL-uri care indicã spre docu-mente conþinând mecanisme de descoperire; avem mai jos un exemplu:<discoveryURLs> <discoveryURL useType="businessEntity"> http://ws.portocale.info?businessKey =uddi:portocale.info:registry:Sales:74 </discoveryURL></discoveryURLs>

� uddi:name, care este un element obligatoriu, semnificând numele procesuluiglobal de afacere oferit (de exemplu, managementul ordinelor de platã);

� uddi:description, ce oferã o descriere, fiind un element opþional;� uddi:contacts, ce include informaþii de contact privitoare la entitatea care a

publicat serviciul; un exemplu este urmãtorul:<contacts> <contact useType="Sales"> <personName>Blue Ory</personName> <email>[email protected]</email> </contact></contacts>

� uddi:businessServices, care reprezintã o listã de servicii furnizate de businessEntity;� uddi:identifierBag � pe lângã businessKey, care identificã în mod unic o structurã

businessEntity într-un registru, acest element opþional permite ca structurilebusinessEntity sã poatã fi regãsite în acord cu un sistem de identificare public;

� uddi:categoryBag � conþine o listã de categorii de afaceri � de exemplu, dupãindustrie, dupã regiunea geograficã etc. �, fiecare descriind un anumit aspectconform unei taxonomii alese (e.g., schema de clasificare NAICS � NorthAmerican Industry Classification System);

� dsig:Signature, reprezentând o semnãturã digitalã XML ataºatã unei entitãþibusinessEntity.

Page 148: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB148

Notãm faptul cã elementele name, description ºi contacts oferã informaþii textualeprivitoare businessEntity, eventual în mai multe limbi.

Orice instanþã a elementului businessEntity este identificatã în mod unic deatributul businessKey. Atunci când o structurã de tip businessEntity este publicatãîntr-un registru UDDI, atributul businessKey trebuie omis în cazul în care cel carepublicã informaþiile doreºte ca registrul sã genereze automat o cheie. Atuncicând o entitate de tip businessEntity este obþinutã dintr-un registru UDDI,atributul businessKey trebuie sã existe obligatoriu.

Informaþiile de tip businessService

Elementul businessService este o structurã reprezentând un serviciu specificat logicºi conþine informaþii descriptive în termeni de afaceri. Informaþii tehnice desprebusinessService se gãsesc în structurile de tip bindingTemplates (vezi infra).

Structura businessService încapsuleazã urmãtoarele elemente:

� uddi:name, care semnificã numele serviciului din cadrul procesului de afacereoferit (e.g., recepþionarea unui ordin de platã);

� uddi:description, care specificã o descriere a serviciului;� uddi:bindingTemplates � este o listã de descrieri tehnice a serviciilor Web

furnizate de businessService;� uddi:categoryBag, ce conþine o lista de clasificãri ale afacerilor, fiecare descriind

un aspect al elementului businessService;� dsig:Signature reprezentând o semnãturã digitalã asociatã entitãþii businessService.

Elementului businessService îi sunt ataºate ºi atributele:

� serviceKey, ce identificã în mod unic o entitate businessService;� businessKey reprezentând o cheie referitoare la o intrare businessEntity.

Când o informaþie de tip businessKey este inclusã într-un registru UDDI,atributul serviceKey poate fi omis dacã organizaþia care o publicã doreºte caregistrul sã genereze o cheie. Atunci când businessEntity este obþinut de la unregistru, atributul serviceKey trebuie sã fie prezent.

Atributul businessKey identificã în mod unic o informaþie businessEntity carefurnizeazã o structura businessService. Fiecare entitate businessService este inclusãîntr-o singurã structurã businessEntity.

Un exemplu de intrare de tip businessService este urmãtorul (cheile sunt furnizatesub formã de identificatori unici universali de tip UUID; pentru UDDI versiunea3, aceºti identificatori nu trebuie neapãrat sã fie numerici):

Page 149: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

149DESCOPERIREA SERVICIILOR

<businessEntity ...> ... <businessServices> <businessService businessKey="uuid:..." serviceKey="uuid:..."> <name>Preia un ordin de platã</name> <description xml:lang="ro"> Serviciu pentru recepþionarea ordinelor de platã.

</description> <bindingTemplates> ... </bindingTemplates> <categoryBag> ... </categoryBag> </businessService> </businessServices></businessEntity>

Informaþiile de tip bindingTemplate

Entitãþile bindingTemplate furnizeazã descrierile tehnice pentru serviciile Web. Unelement bindingTemplate corespunde unei instanþe a serviciului oferit la o anumitãadresã, în general furnizând URI-ul acesteia. De asemenea, acest element facereferiri la datele de tip tModel (pe care le vom descrie mai jos), precum ºi laparametri ºi setãri specifice aplicaþiei.

Structura bindingTemplate conþine urmãtoarele elemente:

� uddi:description, care oferã informaþii textuale despre bindingTemplate;� uddi:accessPoint, care este un ºir de caractere ce permite accesul la serviciul Web

descris. În mod obiºnuit, este un URI, dar poate fi ºi o adresã de e-mail sauchiar un numãr de telefon;

� uddi:hostingRedirector, ce reprezintã un element folosit doar pentru pãstrareacompatibilitãþii cu versiunea UDDI 2.0. Funcþionalitatea sa este acoperitã deuddi:accessPoint;

� uddi:tModelInstanceDetails, care semnificã o listã de unul sau mai multe elementetModelInstanceInfo. Colecþia de atribute tModelKey existente în elementele tModel-InstanceInfo formeazã aºa-numita amprentã tehnicã a serviciului Web, carepoate fi folositã pentru identificarea serviciilor compatibile.

� uddi:categoryBag, ca mai sus, reprezintã o colecþie de categorii asociate serviciului;� dsign:Signature, ce semnificã o semnãturã digitalã.

Page 150: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB150

Similar sunt specificate ºi atributele bindingKey ºi serviceKey, având aceleaºisemnificaþii ca în cazul anterior.

Un exemplu este urmãtorul:

<businessService ...> <bindingTemplates> <bindingTemplate serviceKey="uuid:..." bindingKey="uuid:..."> <accessPoint URLType="http"> http://ws.portocale.info:3333/Sales </accessPoint> <tModelInstanceDetails> ... </tModelInstanceDetails> </bindingTemplate> </bindingTemplates></businessService>

1.3. Structura tModel

Unul dintre scopurile UDDI este acela de a facilita gãsirea cu uºurinþã aserviciilor Web. Un alt obiectiv este cel de a oferi descrieri complete ale acestorservicii, astfel încât oamenii ºi programele sã poatã interacþiona uºor cu serviciidespre care nu ºtiau mai nimic în prealabil. Aceste scopuri sunt de fapt trãsãturileesenþiale ale structurilor tModel. Entitãþile de bazã UDDI sunt tocmai instanþeletModel.

La nivel general, scopul elementelor tModel este de a furniza un sistem dereferinþã abstract. Existã douã motive principale pentru utilizarea structurilortModel: determinarea compatibilitãþii între serviciile Web ºi folosirea lor dreptreferinþe la un spaþiu de nume fixat.

Utilizare

Din punct de vedere al utilizãrii, o instanþã a unei structuri tModel poate fireferitã de mai multe structuri businessEntity. De asemenea, în diferite apeluri aleinterfeþei de programare pot apãrea referiri la tModel.

Utilizarea cea mai obiºnuitã a elementelor tModel este în reprezentareaspecificaþiilor tehnice ºi a conceptelor. De exemplu, un tModel poate fi folositpentru a reprezenta o specificaþie care defineºte un protocol de transport wireless,formatul interschimburilor de date ºi secvenþa de reguli ce trebuie urmate înprocesul de schimb al mesajelor.

Page 151: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

151DESCOPERIREA SERVICIILOR

O aplicaþie care comunicã cu o alta va prefera, desigur, sã adere la specificaþii(convenþii) prestabilite. În acest caz, proiectanþii acestor specificaþii pot stabili oidentitate tehnicã unicã într-un registru UDDI, publicând informaþii despreacestea în cadrul unui tModel.

În timp ce principalul motiv pentru înregistrarea unui tModel într-un registruUDDI este definirea unei identitãþi, specificaþia realã sau setul de documentecare descriu conceptul tModel-ului nu vor face parte din registru, însã vor puteafi referite (cu ajutorul structurii overviewDoc). Evident, cei care publicã astfel dedocumente, specificând conceptul pe care un tModel îl reprezintã, trebuie sãofere descrieri folosind formate ºi limbaje bine-cunoscute.

Din moment ce un tModel a fost publicat, alte organizaþii pot considera cã unanumit serviciu Web pe care îl furnizeazã respectã specificaþiile acestuia ºi îºiafirmã �disponibilitatea� prin simpla incluziune a unei referinþe la acel tModel(folosindu-se tModelKey din structura bindingTemplate) � un mod similar este cel încare cineva poate �cita� un document Web, fãcând o referire la acesta printr-olegãturã hipertext desemnatã de un URI.

Aceastã abordare faciliteazã gãsirea serviciilor Web compatibile cu o anumitãspecificaþie. Odatã ce o valoare validã pentru tModelKey este cunoscutã, este uºorde descoperit cã o anumitã entitate particularã de tip businessEntity are asociat unserviciu Web referenþiind un tModel. În acest mod, un tModelKey devine aºa-numitaamprentã tehnicã (technical fingerprint), unicã pentru o anumitã specificaþie.

Elementele tModel pot fi incluse în cadrul marcatorilor identifierBag, categoryBag,address ºi publisherAssertion care sunt folosiþi pentru specificarea identitãþii organi-zaþionale ºi a diferitelor categorii. Utilizat în acest context, un tModel desemneazãun sistem de valori folositor pentru identificarea sau clasificarea entitãþilorUDDI, având astfel un rol în constituirea unor taxonomii referitoare la serviciileWeb.

Pentru a reprezenta faptul cã o anumitã afacere descrisã de elementulbusinessEntity are un anumit identificator ID asociat, keyedReference este plasatîntr-un identifierBag. Acest keyedReference va avea atributul keyValue cu valoareaidentificatorului ID dat ºi referã un tModel semnificând �sistemul identificat deID�. Împreunã, keyValue ºi referinþa la tModel specificã o valoare particularãîntr-un anumit sistem de valori.

Structura unui element de tip tModel

Un element tModel este compus din urmãtoarele sub-elemente:

� uddi:name care asociazã un nume unic, obligatoriu (în general este un URI);� uddi:description, reprezentând o descriere textualã opþionalã;

Page 152: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB152

� uddi:overviewDoc, care face referire la informaþii privitoare la tModel; include unelement overviewURL ce reprezintã adresa la care se gãseºte documentuldescriind tModel-ul. Atributul useType al marcatorului overviewURL poate aveamai multe valori. Dacã valoarea lui este �text�, atunci înseamnã cã overviewURLconþine informaþii textuale. O altã valoare des întâlnitã pentru useType estewsdlInterface, ceea ce semnificã faptul cã overviewURL referã un documentWSDL care poate fi reutilizat de diferite implementãri;

� uddi:identifierBag, ce conþine o listã de identificatori logici, cu rol de meta-date;� uddi:categoryBag, care furnizeazã o listã de clasificãri descriind anumite aspecte

ale tModel-ului.

Structura tModel are asociate ºi atributele:

� tModelKey, care identificã în mod unic un tModel;� deleted este un câmp care specificã dacã tModel-ul a fost ºters logic (valorile

sale pot fi true sau false).

Un exemplu de informaþii conþinute de un tModel este urmãtorul, descriindcomportamentul unui serviciu Web:

<tModel tModelKey="uuid:..."> <name>Vânzãri online de portocale</name> <description xml:lang="ro">...</description> <overviewDoc> http://ws.portocale.info:3333/Sales?WSDL </overviewDoc> <identifierBag>...</identifierBag> <categoryBag>...</categoryBag></tModel>

1.4. Informaþii privitoare la publicarea serviciului

Structura publisherAssertion

Multe afaceri ºi organizaþii nu sunt efectiv reprezentate de o singurã entitate detip businessEntity. Atunci când o organizaþie este desemnatã de mai multe structuribusinessEntity, s-ar dori ca acestea sã fie interconectate prin relaþii vizibile. Aceastase poate realiza cu ajutorul elementului publisherAssertion.

Pentru a elimina posibilitatea ca o entitate care a publicat un serviciu sãrevendice o relaþie care nu e reciprocã, ambii parteneri trebuie sã facã publiceaceleaºi �afirmaþii� pentru ca relaþia lor sã devinã vizibilã (se asigurã astfelreciprocitatea).

Page 153: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

153DESCOPERIREA SERVICIILOR

Structurii publisherAssertion îi corespund urmãtoarele elemente:

� uddi:fromKey � identificã instanþa �sursã� de tip BusinessEntity care stabileºteacordul (relaþia);

� uddi:toKey � specificã instanþa �destinaþie� de tip BusinessEntity participantã laacord;

� uddi:keyedReference � descrie relaþia dintre cele douã pãrþi;� dsig:Signature � desemneazã o semnãturã digitalã XML. Atunci când o structurã

publisherAssertion este semnatã, fiecare semnãturã digitalã trebuie sã fie furnizatãde propriul element dsig:Signature.

Structura operationalInfo

La publicarea unui serviciu, în registrul UDDI sunt stocate ºi o serie de informaþiioperaþionale, incluzând data ºi timpul la care structura de date a fost creatã saumodificatã, identificatorul nodului UDDI ºi identitatea celui care a publicatdatele.

Aceste informaþii operaþionale vor fi memorate într-un element operationalInfo,pentru structurile de date de tip businessEntity, businessServices, bindingTemplate ºitModel.

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.

1.5. Taxonomia entitãþilor UDDI

UDDI furnizeazã o structurã semanticã a informaþiilor referitoare la serviciileWeb dintr-un registru. UDDI permite utilizatorilor sã defineascã taxonomiimultiple. Astfel, utilizatorii nu sunt legaþi de un singur sistem taxonomic, ci potfolosi un numãr nelimitat de clasificãri dorite.

Specificaþiile UDDI includ anumite definiþii privitoare la relaþiile ierarhicedintre o instanþã a unei implementãri UDDI ºi alte entitãþi de care aceasta estelegatã.

Serverele UDDI sunt împãrþite în urmãtoarele tipuri:

� nod (node) � este un server UDDI care suportã minimul de funcþionalitãþidefinite în specificaþie. Poate executa una sau mai multe operaþii asupradatelor UDDI la care are acces. Este membrul unui singur registru UDDI;

� registru/catalog (registry) � este format din unul sau mai multe noduri. Unregistru executã setul complet de funcþionalitãþi definit în specificaþiile UDDI.

Page 154: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB154

� regiºtri afiliaþi (affiliated registries) � sunt regiºtrii UDDI care implementeazãreguli de partajare a informaþiilor. Aceºti regiºtri afiliaþi partajeazã un spaþiude nume comun pentru cheile UDDI care identificã în mod unic înregistrãrilede date.

În versiunea 3.0, una dintre modificãrile esenþiale este cea privitoare laconceptul de regiºtri afiliaþi. Sã urmãrim mai jos câteva aspecte referitoare latipurile de regiºtri UDDI:

Tipul registrului

Descriere

Exemplu de aplicaþie

De tip enterprise sau

privat (corporate/

private)

Un registru intern, al unei întreprinderi, aflat în spatele unui firewall izolat de Internet. Accesul la facilitãþile administrative ºi la datele din regiºtri este restricþionat. Datele nu sunt partajate cu alþi regiºtri.

Catalog UDDI la nivel de corpo-raþie (Enterprise

Web Service Registry)

De tip afiliat (affiliated)

Un registru dezvoltat în cadrul unui mediu controlat ºi cu acces limitat la clienþi autorizaþi. Funcþiile de administrare pot fi realizate ºi de alt partener de încre-dere. Datele pot fi partajate cu alþi regiºtri într-o manierã controlatã.

Reþea de par-teneri comerciali (Trading Partener

Network)

Public

Din perspectiva unui utilizator final, un registru public este un serviciu obiºnuit. Deºi funcþiile admi-nistrative pot fi securizate, accesul la datele din regiº-tri este public. Datele pot fi partajate sau transferate între diferiþi regiºtri, iar conþinutul propriu-zis poate fi sau nu moderat.

Catalog de tip UDDI Business Registry (UBR)

Altfel spus, afilierea permite sistemului UDDI sã suporte o varietate detopologii de reþele sau de infrastructuri. Structura unui registru UDDI permitereflectarea realitãþii existente în interacþiunile reale dintre entitãþile business.

Managementul versiunilor multiple ale datelor stocate de regiºtrii UDDIconstituie o realã provocare pentru o astfel de infrastructurã distribuitã. Spe-cificaþiile UDDI oferã un cadru care sã faciliteze menþinerea ºi asocierea de cheiUDDI înregistrãrilor din regiºtri, dar nu pun în discuþie existenþa vreunui suportde definire de scenarii business. Regulile de afaceri ºi scenariile aferente se lasã înresponsabilitatea dezvoltatorului software care însã, poate folosi infrastructurade bazã oferitã de UDDI.

Page 155: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

155DESCOPERIREA SERVICIILOR

Figura 3. Tipurile de regiºtri ºi interacþiunile între aceºtia (RP = registru privat, RPA =registru privat afiliat, UBR = UDDI Business Registry)

În figura de mai sus sunt descrise o serie de moduri de interacþiune întreregiºtri. Prin mecanisme de tip publicare/abonare (publish/subscribe) ºi replicare(replication) între nodurile unui registru, informaþiile de pe serverele UDDI pot fiîn totalitate publice (cazul UBR), semi-private sau total private ºi izolate (situaþiaunei corporaþii folosind servicii Web interne, la nivel de intranet propriu).

1.6. Interfeþe de programare pentru UDDI

În cadrul specificaþiilor UDDI sunt definite douã categorii de interfeþe deprogramare principale: Publisher API ºi Inquire API.

Publisher API

Interfaþa Publisher API permite publicarea ºi actualizarea de informaþii conþinuteîn regiºtrii UDDI. Funcþiile puse la dispoziþie sunt descrise de tabelul urmãtor.

Page 156: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB156

Metoda Descriere

add_publisherAssertions Adaugã una sau mai multe relaþii specificate depublisherAssertion

delete_binding ªterge una/mai multe instanþe ale elementuluibindingTemplate din regiºtri

delete_business ªterge una/mai multe înregistrãri de afaceridelete_publisherAssertions Eliminã unul/mai multe elemente publisherAssertion

delete_service ªterge unul/mai multe elemente businessService

delete_tModel ªterge logic una/mai multe structuri tModel

discard_authToken Informeazã un nod cã informaþiile de autentificarevor fi înlãturate

get_assertionStatusReport Raporteazã starea declaraþiilor care implicã oriceînregistrare de afacere a cãrui management esterealizat de un anumit publisher

get_authToken Obþine un jeton de autentificareget_publisherAssertions Furnizeazã toate relaþiile de tip publisherAssertion

realizate de un publisher

get_registeredInfo Obþine o listã a tuturor structurilor businessEntity ºitModel

save_binding Salveazã/actualizeazã un element bindingTemplate

save_business Salveazã/actualizeazã o structurã businessEntity

save_service Adaugã/actualizeazã unul ori mai multe elementebusinessService

save_tModel Salveazã sau actualizeazã unul/mai multe elemente detip tModel

set_publisherAssertions Înlocuieºte toate declaraþiile de tip publisherAssertionale unui publisher

Inquiry API

Interfaþa de programare Inquiry API permite operaþii pentru cãutarea ºi parcurge-rea regiºtrilor cu scopul de a obþine informaþii despre o anumitã afacere sau unserviciu dorit. Tabelul de mai jos sintetizeazã lista funcþionalitãþilor oferite.

Metoda Descriere

find_binding Localizeazã o informaþie de legare (binding) a unui serviciu laun protocol (tip, port etc.) în cadrul unui sau mai multorelemente businessService

find_business Localizeazã informaþii despre una/mai multe afacerifind_relatedBusinesses Localizeazã informaþii despre înregistrãrile businessEntity

asociate unei anumite entitãþi de afacerifind_service Localizeazã anumite servicii în cadrul unor entitãþi de afaceri

Page 157: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

157DESCOPERIREA SERVICIILOR

Metoda Descriere

find_tModel Localizeazã una/mai multe structuri tModel

get_bindingDetail Obþine informaþii detaliate pentru realizarea de cereriprivitoare la bindingTemplate

get_businessDetail Obþine informaþii despre businessEntity pentru una sau maimulte afaceri/organizaþii

get_businessDetailExt Furnizeazã informaþii detaliate despre businessEntity

get_serviceDetail Obþine detalii complete despre un set de entitãþi businessService

get_tModelDetail Furnizeazã detalii referitoare la un tModel

Publisher API ºi Inquiry API reprezintã nucleul instrumentelor care realizeazãmanagementul datelor din cadrul regiºtrilor UDDI.

De notat faptul cã marile companii pun la dispoziþie cataloage de tip UBR cepot fi accesate via API-urile prezentate mai sus. Câteva exemple notabile sunturmãtoarele:

� accesarea interfeþei de interogare a registrului UBR de la IBM: http://uddi.ibm.com/ubr/inquiryapi

� accesarea interfeþei de publicare în registrul UBR oferit de IBM: https://uddi.ibm.com/ubr/publishapi

� accesarea interfeþei de interogare a registrului UBR pus la dispoziþie deMicrosoft: http://uddi.microsoft.com/inquire

� accesarea interfeþei de publicare pentru registrul de tip UBR de la Microsoft:https://uddi.microsoft.com/publish

Sunt disponibile ºi o serie de instrumente grafice de acces la UDDI prininterfeþele prezentate mai sus. Menþionãm doar Registry Browser din cadrulpachetului de dezvoltare a serviciilor Web oferit de Sun � Java WSDP (WebServices Developer Pack). Tot în cadrul acestui pachet sunt disponibile o serie deexemple de programe Java pentru lucrul cu regiºtrii UDDI publici.

Alte interfeþe de programare

O interfaþã de programare suplimentarã este Security API, oferind douã funcþii:

� discard_authToken � informeazã nodul cã token-ul (jetonul) de autentificareobþinut anterior nu mai este solicitat ºi cã trebuie considerat invalid dacã esteutilizat dupã ce acest mesaj este primit (astfel, se controleazã maniera devalabilitate a procesului de autentificare);

� get_authToken � solicitã de la un nod UDDI un jeton de autentificare subforma unui element authInfo. Un astfel de element poate fi solicitat atunci

Page 158: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB158

când se folosesc funcþii din alte interfeþe de programare precum Inquiry,Publication, Custody and Ownership Transfer sau Subscription.

Interfaþa de programare numitã Custody and Ownership Transfer API permite caorice nod al unui registru sã transfere �custodia� unei structuri businessEntity sautModel de la un nod la altul. De asemenea, se oferã suport ºi pentru preluarea dela o entitate la alta a dreptului de proprietate asupra acestor structuri.

Fãrã a intra în detalii tehnice � pe care le puteþi gãsi în specificaþiile UDDI �sã urmãrim un scenariu general. Sã consideram cã avem la dispoziþie un registruUDDI format din nodurile A, B ºi C. Registrul permite fiecãrui nod sã-ºidefineascã propriile reguli pentru înregistrare, autentificare ºi autorizare. Dacã opersoanã P doreºte sã se autentifice, va trebui sã obþinã regulile de politicã aaccesului ale celor trei noduri. Sã considerãm cazul în care P alege nodul A.

Dacã reuºeºte sã se autentifice cu succes ºi sã publice o entitate business (fieea desemnatã de E1), atunci P devine proprietar (owner) al lui E1. Se considerã cãnodul A este custode (custodian) pentru E1. De asemenea, P poate efectua aceleaºioperaþii la nodul B, fiind în mãsurã sã publice o entitate de afaceri E2. Nu sepoate face nici o presupunere cã un registru UDDI (sau nodurile sale) este�conºtient� cã P reprezintã aceeaºi persoanã. P este responsabil pentru menþi-nerea identitãþii ºi autentificãrii corecte pentru fiecare nod din cadrul registrului.

Interfaþa Subscription API dã posibilitatea clienþilor autentificaþi sã primeascãinformaþii privitoare la schimbãrile regiºtrilor UDDI de care aceºtia sunt inte-resaþi. Aceastã interfaþã este opþionalã ºi poate fi implementatã în maniera doritãla nivelul fiecãrui nod.

1.7. UDDI ºi SOAP

Vom enumera în cele ce urmeazã convenþiile utilizãrii SOAP ºi UDDI, pre-zentând ce elemente ale protocolului SOAP 1.1 sunt suportate sau nu de UDDI:

� UDDI necesitã prezenþa câmpului SOAPAction din antetul HTTP. SOAPActionpoate conþine o valoare sau poate fi vid:

POST ... HTTP/1.1Host: www.portocale.infoContent-Type: text/xml; charset="utf-8"Content-Length: NNNNSOAPAction: "" <?xml version="1.0" encoding="UTF-8" ?><Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">

Page 159: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

159DESCOPERIREA SERVICIILOR

<Body>   <get_bindingDetail xmlns="urn:uddi-org:api_v3">...</Envelope>

� UDDI nu oferã suport pentru conceptul de actor SOAP (pentru SOAP 1.2,regãsit sub numele de rol � role). Nodurile UDDI vor respinge orice cererecare vine cu un atribut actor în elementul Header. Se va întoarce o eroareSOAP fãrã nici un element Detail, iar codul erorii este de tip Client (sau Senderîn cazul SOAP 1.2).

� UDDI nu are prevãzut suport pentru facilitatea SOAP Encoding. În mesajeletrimise unui nod UDDI, nu trebuie sã existe nici o informaþie privitoare lastilul de codificare pentru nici un element din cadrul spaþiului de numeurn:uddi-org. În caz contrar, nodul va rãspunde cu un cod de eroare de tipClient, iar faultstring va indica motivul apariþiei problemei.

� Regiºtrii UDDI pot ignora conþinutul anteturilor SOAP.� UDDI suportã urmãtoarele coduri de eroare SOAP 1.1: VersionMismatch,

MustUnderstand, Client ºi Server.

1.8. UDDI ºi WSDL

UDDI este o arhitecturã care permite stocarea informaþiilor privitoare la diferiteservicii Web, însã nu se ocupã cu descrierea acestora. Pentru a putea utiliza unserviciu Web regãsit prin intermediul UDDI, avem nevoie de o descriere WSDLa acestuia. În cele ce urmeazã, ne vom referi la WSDL 1.1, modificãrile în celece priveºte versiunea 2.0 fiind minore.

Specificaþiile existente descriu câteva tipuri de structuri tModel, care trebuie sãfie furnizate de regiºtrii UDDI, astfel încât sã putem avea suport pentru amodela informaþii de tip portType ºi binding din WSDL la nivel UDDI. Deasemenea, trebuie furnizat un model care sã fie consistent atunci când selucreazã atât cu versiunea 3.0, cât ºi cu UDDI 2.0. Mai mult, surprindereainformaþiilor dintr-o WSDL trebuie sã se realizeze fãrã o duplicare excesivã.

Sunt introduse ºase aºa-numite sisteme categoriale (category systems):

1. WSDL Entity Type Category System � este folosit pentru a identifica entitãþileUDDI care corespund celor WSDL. Este în mod obiºnuit folosit în cazulstructurilor tModel ºi businessService. Cum WSDL permite ca portType ºi unbinding sã aibã acelaºi nume, singurul mod de a diferenþia cele douã elementetModel � corespunzãtoare informaþiilor portType ºi, respectiv, binding � este dea recurge la keyedReference.

Page 160: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB160

2. XML Namespace Category System � este utilizat la reprezentarea oricãrui spaþiude nume XML (nu doar pentru spaþii de nume privitoare la WSDL). Aceastãfacilitate permite realizarea de interogãri precise, folosindu-se numele completal elementelor XML (spaþiu de nume + numele local de element).

3. XML Local Name Category System � poate fi util atunci când se foloseºte numelelocal al unui element XML, pentru cazul în care numele corespunzând uneistructuri UDDI nu poate fi acelaºi cu cel al unui element XML local (fãrã afi prefixat de spaþiul de nume).

4. WSDL portType Reference Category System � este folosit pentru a reprezentalegãtura dintre un binding ºi un portType. I se permite unei entitãþi UDDI sã serefere la o altã entitate prin stocarea cheii sale ca valoare a atributuluikeyValue al lui keyReference (privitor la acest sistem de clasificare).

5. Protocol Category System � permite ca structuri tModel referitoare la protocoaledefinite de utilizator sã fie încorporate în abordarea descrisã în specificaþii.

6. Transport Category System � permite ca structuri tModel de transport specificatede utilizator sã poate fi folosite în acest context.

De asemenea, se mai poate recurge ºi la urmãtoarele tipuri de structuri tModel:

� SOAP Protocol tModel � pentru a reprezenta utilizarea SOAP ºi WSDL;� HTTP Protocol tModel � pentru a modela legãtura între WSDL ºi HTTP;� WSDL Address tModel � pentru cazul în care se folosesc documente WSDL.

Vom da o serie de detalii referitoare la legãtura dintre WSDL ºi UDDI 2.0(diferenþele faþã de versiunea 3 nu sunt semnificative).

Un element portType specific WSDL este reprezentat în cadrul UDDI de untModel. Acest tModel este clasificat folosind WSDL Entity Type Category System.Numele structurii tModel asociate lui portType va fi identic cu cel al lui portType.Acest aspect eludeazã cumva specificaþiile UDDI care prevãd cã numele unuitModel ar trebui sã fie un URI.

Când s-a luat aceastã decizie s-au propus urmãtoarele alternative:

� sã se foloseascã numele lui portType � varianta aleasã;� sã se recurgã la o combinaþie dintre portType ºi spaþiul de nume. Aceastã

opþiune ar fi fãcut mai dificilã cãutarea fie dupã spaþiul de nume, fie conformunui portType;

� sã se utilizeze un URI ºi numele local al elementelor XML, iar spaþiul denume sã fie plasat în sub-elementul categoryBag din tModel. Aceastã variantãface ºi mai dificilã cãutarea numelui unui portType, iar numele tModel-ului nuconþine nici o informaþie reprezentativã.

Page 161: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

161DESCOPERIREA SERVICIILOR

Spaþiul de nume al elementului portType este dat de keyedReference din marcatorulcategoryBag al structurii tModel privitoare la portType. Acest keyedReference determinãlegãtura cu sistemul de clasificare XML Namespace menþionat mai sus.

Elementul binding este reprezentat tot ca un tModel, dar de tip WSDLbinding tModel, pentru a-l distinge de alte categorii de structuri tModel. Sefoloseºte acelaºi sistem de clasificare ca ºi în cazul anterior, dar cu o valoarediferitã pentru keyValue. Numele tModel-ului este acelaºi cu cel cuprins debinding.

Elementul service al documentului WSDL este reprezentat de businessService.Dacã service desemneazã interfaþa unui serviciu Web prezent deja în cadrulregistrului UDDI, atunci structura businesService aferentã este adãugatã infor-maþiilor existente. În caz contrar, poate fi creatã o nouã intrare businessService.

Elementul port este reprezentat de bindingTemplate. Conþinutul relaþiei dintreun serviciu WSDL ºi porturile sale este oglindit aici de relaþia dintre businessServiceºi bindingTemplates.

Discuþia de mai sus se concretizeazã în figura urmãtoare.

Figura 4. Relaþia dintre elementele WSDL ºi cele UDDI

Publicarea ºi gãsirea descrierilor WSDL

O descriere WSDL completã a unui serviciu este o combinaþie între documentulde tip interfaþã a serviciului ºi documentul de tip implementare.

Cum interfaþa serviciului reprezintã o definiþie reutilizabilã a acestuia, ea estepublicatã într-un registru UDDI ca un tModel. Implementarea serviciului descrieo instanþã a acestuia. Fiecare instanþã este definitã folosind elementul WSDL

Page 162: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB162

service. Pentru a publica o structurã businessService este utilizat un element servicedintr-un document de tip implementare.

Figura 5 oferã o serie de detalii privind asocierea elementelor WSDL caelemente UDDI.

Figura 5. Corespondenþa dintre elementele WSDLºi intrãrile UDDI

Structura tModel corespunzãtoare interfeþei serviciului Web este publicatã defurnizorul acelei interfeþe de serviciu. O parte dintre elementele din tModel suntconstruite pe baza informaþiilor din descrierea WSDL aferentã. În tabelul urmãtorse definesc paºii creãrii unui tModel care pentru a fi valid ar trebui numit folosindtargetNamespace ºi ar trebui sã conþinã date pentru �umplerea� elementeloroverviewURL ºi categoryBag.

Page 163: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

163DESCOPERIREA SERVICIILOR

tModel UDDI

Interfaþa

WSDL a serviciului

Descriere

Obli-gatoriu

1

name

Atributul targetNamespace pentru definirea elementului

Numele pentru tModel este obþinut folosindu-se valoarea atributului targetNamespace din documentul WSDL. Este necesar un nume con-sistent, pentru ca un tModel sã fie loca-lizat folosindu-se doar informaþii din documentul de tip implementare a serviciului.

Da

2

description

Elementul documentation

Elementul description din tModel este restrâns la 256 de caractere. Dacã ele-mentul documentation nu existã, atunci trebuie utilizat numele atributului din elementul definitions.

Nu

3

overviewURL

URI-ul interfeþei serviciului ºi specificarea elementului binding

Localizarea documentului de tip inter-faþã 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.

Da

4

categoryBag

Elementul categoryBag trebuie sã conþinã cel puþin un sub-element keyedReference. Atributul keyName va avea valoarea uddi-org:types, iar keyValue va avea valoarea wsdlSpec.

Da

Documentul de mai jos reprezintã interfaþa unui serviciu Web. Valorile ce vorfi inserate într-un tModel apar cu caractere îngroºate:

<?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"> Definiþia unei interfeþe standard WSDL pentru un serviciu de tranzacþii de portocale. </documentation>

Page 164: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB164

<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>

Valoarea atributului targetNamespace va fi folositã ca nume pentru tModel,conþinutul elementului documentation va reprezenta descrierea structurii tModel, iaratributul name al elementului binding va fi utilizat sã descrie overviewURL.

Documentul UDDI privitor la tModel are forma urmãtoare:

<?xml version="1.0"?><tModel tModelKey=""> <name>http://www.portocale.info/

TranzactiiPortService interface</name>

Page 165: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

165DESCOPERIREA SERVICIILOR

<description xml:lang="ro"> Definiþia unei interfeþe standard WSDL pentru un serviciu de tranzacþii de portocale. </description>

<overviewDoc> <description xml:lang="ro"> Documentul WSDL descriind interfaþa serviciului </description> <overviewURL> http://www.portocale.info/TranzactiiPortService- interface.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þã aserviciului Web. El conþine, de asemenea, o referinþã directã la elementul bindingcu 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 regiºtrii UDDI ca o structurãbusinessService, având unul sau mai multe marcaje bindingTemplates. Aceastã publi-care este realizatã de furnizorul acelui serviciu.

Pentru fiecare element service specificat în documentul de implementare aserviciului va fi creatã câte o structurã businessService.

Lista de sub-elemente ale businessService care pot fi specificate pe bazaconþinutului documentului WSDL de implementare a serviciului cuprinde:

� name � are valoarea datã de atributul elementului service din documentulWSDL;

� description � foloseºte primele 256 de caractere ale elementului documentation,dacã existã.

Pentru fiecare port din cadrul elementului service se creeazã un nou elementbindingTemplate, conform detaliilor din tabelul urmãtor.

Page 166: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB166

bindingTemplate

DescriereObliga-

toriu

1 description Dacã elementul port conþine un sub-element documen-tation, descrierea conþine primele 256 de caractere aleelementului documentation

Nu

2 accessPoint Pentru o legare (binding) SOAP sau HTTP, accessPointare valoarea atributului location al elementului extensionasociat elementului port. Dacã elementul conþine unURL, atributul URLType va desemna protocolul dincadrul URL-ului. Dacã nu se foloseºte nici un URL,atributul URLType ar trebui folosit pentru a se cunoaºtetipul protocolului.

Da

3 tModelInstanceInfo

Va exista câte un element tModelInstanceInfo pentru fie-care tModel pe care-l referenþiazã. Astfel, va apãrea celpuþin un tModelInstanceInfo incluzând o referinþã directãla tModel-ul ce reprezintã documentul de interfaþã aserviciului.

Da

4 overviewURL Poate conþine o referinþã directã la documentul deimplementare a serviciului, folositã doar pentru afurniza o documentaþie uºor de înþeles (human-readable).Toate celelalte informaþii din acest document ar trebuisã fie accesibile printr-o entitate de date UDDI (UDDIdata entity). Suntem asiguraþi cã documentul publicateste acelaºi cu cel obþinut în urma operaþiei de cãutare.Dacã acest document cuprinde mai mult decât un ele-ment port, atunci acesta ar trebui sã conþinã o referinþãdirectã la atributul name al lui port. Nu este suficient sã sefoloseascã doar o referinþã la elementul binding dintModel, deoarece pot exista mai multe marcaje portreferind acelaºi binding.

Nu

Exemplul de mai jos reprezintã un document WSDL de implementare a unuiserviciu. Valorile indicate cu caractere îngroºate sunt obligatorii pentru creareaintrãrilor businessService ºi bindingTemplates.

<definitions name="TranzactiiPortService" targetNamespace= "http://www.portocale.info/TranzactiiPortService" xmlns:interface= "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/">

Page 167: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

167DESCOPERIREA SERVICIILOR

<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>

Atributul name al elementului service va fi folosit ca nume pentru businessService.Elementul documentation din interiorul elementului service este utilizat pentru adescrie structura businessService.

Atributul name al elementului port este anexat lui overviewURL, care conþine oreferinþã la documentul de implementare a serviciului. Atributul location al luiservice este folosit pentru �umplerea� marcatorului accessPoint din structurabindingTemplate.

Definiþia unei intrãri businessDefinition create pe baza documentului WSDL demai sus este furnizatã de exemplul urmãtor. Elementul categoryBag ar trebui sãconþinã unul sau mai mulþi marcatori keyedReference, folosiþi în clasificareascopurilor afacerilor utilizate pentru serviciul de faþã.

<businessService businessKey="..." serviceKey="..."> <name>TranzactiiPortService</name> <description xml:lang="en"> ... </description>

<bindingTemplates> <bindingTemplate bindingKey="..." serviceKey="..."> <description> ... </description> <accesssPoint URLType="http">

Page 168: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB168

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>

Atributul tModelKey are drept valoare un UUID pentru tModel-ul privitor ladocumentul de interfaþã a serviciului. Acest tModel poate fi localizat folosindu-seatributul namespace din cadrul elementului import. Marcatorul overviewURL repre-zintã locaþia documentului care implementeazã serviciul. El nu conþine o referinþãla elementul port, deoarece este unic pentru acest document.

Gãsirea descrierilor WSDL privitoare la interfaþa serviciilor se realizeazã dupãcum urmeazã. Dupã cum deja cunoaºtem, toate documentele WSDL referitoarela interfaþa serviciilor Web sunt publicate în regiºtrii UDDI sub formã de tModel.Fiecare structurã tModel e clasificatã într-o anumitã manierã via categoryBag.Operaþia find_tModel oferitã de API-ul UDDI poate fi folositã pentru a gãsi untModel clasificat. Localizarea tuturor descrierilor WSDL privitoare la interfaþaunui serviciu se realizeazã conform construcþiei urmãtoare:

<find_tModel generic="2.0" xmlns="urn:uddi-org:api"> <categoryBag> <keyedReference tModelKey="uuid:..." keyName="uddi-org:types" keyValue="wsdlSpec" /> </categoryBag></find_tModel>

Operaþia find_tModel va întoarce o listã de chei tModel. Folosindu-se metodaget_tModelDetail, este obþinutã o descriere particularã a interfeþei unui serviciu.Metoda get_tModelDetail va returna un element tModel precum cel prezentat încadrul capitolului de faþã.

Page 169: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

169DESCOPERIREA SERVICIILOR

Urmãtorul pas este sã se recurgã la elementul overviewURL pentru a se obþineconþinutul documentului WSDL de interfaþã a serviciului.

În plus, în cadrul categoryBag se mai pot adãuga elemente keyedReferencesuplimentare pentru a se limita mulþimea de structuri tModel întoarse ca rãspunsla aceastã cerere. Metoda find_tModel de mai sus poate fi folositã pentru a localizatoate serviciile de tip �TranzactiiPort� care folosesc WSDL.

<find_tModel generic="2.0" xmlns="urn:uddi-org:api"> <categoryBag> <keyedReference tModelKey="uuid:..." keyName="uddi-org:types" keyValue="wsdlSpec" /> <!-- inserãm un criteriu suplimentar de cãutare --> <keyedReference tModelKey="uuid:..." keyName="TranzactiiPort" keyValue="..." /> </categoryBag></find_tModel>

Gãsirea descrierilor WSDL privitoare la implementarea serviciilor Web seefectueazã conform etapelor descrise în continuare. O implementare a unuiserviciu este publicatã în regiºtrii UDDI ca o intrare businessService. AcestbusinessService va conþine unul sau mai multe elemente bindingTemplates.

Suplimentar, structurile businessService au asociate categorii de clasificare, atfelîncât sã poatã fi identificate ca descrieri bazate pe WSDL a serviciilor.

O soluþie pentru regãsirea descrierii unui serviciu este datã de operaþiafind_service.

O anumitã entitate businessEntity se poate folosi de mesajul urmãtor pentrulocalizarea unei structuri de tip businessService, incluzând implementarea unuiserviciu �TranzactiiPort�. În plus, pot fi adãugate ºi alte elemente keyedReferencesîn cadrul categoryBag, cu rol de filtrare a rãspunsului.

<find_service businessKey="..." generic="2.0" xmlns="urn:uddi-org:api"> <categoryBag> <keyedReference tModelKey="uuid:..." keyName="TranzactiiPort" keyValue="..." /> </categoryBag></find_service>

Metoda find_service poate fi de ajutor ºi pentru a localiza date de tip businessService,desemnând implementãri specifice ale interfeþei unui serviciu. Mesajul descrismai jos conþine un exemplu în care se cautã toate elementele businessService din

Page 170: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB170

cadrul marcajului businessEntity. Acest din urmã element referã implementareainterfeþei unui serviciu particular (de exemplu, privitor la tranzacþiile bancare).Cum interfaþa unui serviciu este reprezentatã de un tModel, se va folosi untModelBag pentru a menþiona cheia tModel corespunzãtoare interfeþei WSDL aserviciului considerat.

<find_service businessKey="..." generic="2.0" xmlns="urn:uddi-org:api"> <tModelBag> <!-- cheia tModel-ului pentru interfaþa serviciului Web --> <tModelKey>...</tModelKey> </tModelBag></find_service>

Metoda find_service va returna o listã de intrãri. Descrierea businessService poatefi obþinutã folosind metoda get_serviceDetail. Aceasta va întoarce o structurãbusinessService precum cea prezentatã mai sus. Dupã ce s-a obþinut un businessService,pentru invocarea serviciului Web gãsit se va selecta un anumit element bindingTemplateinclus în businessService. Elementul accessPoint din cadrul marcatorului bindingTemplatesemnificã tocmai punctul terminal al serviciului.

De asemenea, poate fi folosit elementul overviewURL, în vederea obþineriiconþinutului documentului WSDL referitor la implementarea serviciului, care larândul sãu poate oferi ºi alte detalii de interes.

Furnizãm în continuare maniera de gãsire a unei structuri bindingTemplate. Dacãmarcatorul businessService are mai mult de un element bindingTemplate, este dificil sãse determine care marcaj bindingTemplate trebuie efectiv folosit. Pentru a localizaelementul bindingTemplate ce ar trebui utilizat, vom recurge la operaþia find_binding.

Exemplul de mai jos recurge la find_binding pentru a obþine elementulbindingTemplate, referenþiind un anumit tModel. Acest tModel poate fi asociat unuielement binding particular din cadrul descrierii WSDL a interfeþei serviciului.

<find_binding serviceKey="..." generic="1.0" xmlns="urn:uddi-org:api"> <tModelBag> <!-- cheia corespunzãtoare interfeþei serviciului --> <tModelKey>...</tModelKey> </tModelBag></find_binding>

Se va obþine unul sau mai multe elemente bindingTemplate. Dupã accesareamarcajului bindingTemplate, punctul de destinaþie pentru serviciul Web este oferit

Page 171: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

171DESCOPERIREA SERVICIILOR

de elementul accessPoint. Dacã elementul bindingTemplate a fost creat pe baza unuidocument WSDL existent (privitor la implementarea serviciului), atunci overviewURLpoate oferi o referinþã la acest document. Acest document WSDL poate fiaccesat pentru a obþine ºi alte informaþii utile privitoare la serviciul Web,informaþii care nu au putut fi regãsite în regiºtrii UDDI.

Iatã un exemplu de structurã bindingTemplate întoarsã în urma interogãriidescrise anterior:

<bindingTemplate bindingKey=""serviceKey=""> <accesssPoint URLType="http"> http://www.portocale.info/TipTranzactiiPort </accessPoint> <tModelInstanceDetails> <!-- tModelKey include o cheie corespunzãtoare interfeþei serviciului --> <tModelInstanceInfo tModelKey="..."> <instanceDetails> <overviewURL>http://www.portocale.info/TranzactiiPortService.wsdl </overviewURL> </instanceDetails> </tModelInstanceInfo> </tModelInstanceDetails></bindingTemplate>

1.9. Crearea propriului registru UDDI folosind jUDDI

Dupã cum am vãzut mai sus, UDDI defineºte un protocol de descoperire aserviciilor Web (permiþând clienþilor sã regãseascã serviciile Web dorite), punândla dispoziþie ºi un format standard de descriere a serviciilor (care oferã clienþilordetaliile privitoare la funcþionalitãþile serviciilor Web gãsite).

Existã douã tipuri de regiºtri UDDI: regiºtrii publici ºi cei privaþi. În aceastãsecþiune vom detalia în principal maniera de manipulare a regiºtrilor privaþi cepot fi utili în cadrul unui mediu de tip enterprise. De asemenea, vom oferi o seriede amãnunte privitoare la un cadru de lucru folosit pentru a reprezenta structuriale regiºtrilor UDDI ºi pentru a implementa regiºtri UDDI privaþi. Este vorbade framework-ul jUDDI, disponibil în regim open source.

Descriere succintã a instrumentului jUDDI

Instrumentul jUDDI este implementat în Java ºi oferã compatibilitatea cu UDDIversiunea 2.0 pentru managementul regiºtrilor UDDI.

Pentru a putea crea propriul registru UDDI, trebuie instalate urmãtoarele aplicaþii:

Page 172: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB172

� Java 2 SDK � în exemplificãrile urmãtoare am folosit Java 2 SDK SE,versiunea 1.5.0_06;

� J2EE Build and Runtime Environment � s-a utilizat Java 2 Enterprise Edition (J2EE)1.4 oferit de Sun;

� Un server Web ºi/sau un container de servlet-uri � în acest caz s-a recurs laApache Tomcat, versiunea 5.5.12;

� Un cadru de lucru pentru procesarea mesajelor SOAP � s-a folosit ApacheAxis (compatibil cu jUDDI).

� Un mecanism de stocare a datelor � s-a utilizat serverul de baze de dateMySQL versiunea 5.0 (se poate recurge, de asemenea, ºi la alte soluþii,eventual comerciale: DB2, Sybase etc.);

� Un instrument de management al regiºtrilor UDDI � în cazul nostru, amadoptat jUDDI.

Aplicaþia jUDDI foloseºte Apache Axis pentru manipularea mesajelor SOAP.Axis defineºte un cadru de transport transparent, care permite folosirea diferitelorprotocoale. Pentru transferul mesajelor via HTTP, orice servlet derivat din clasaorg.apache.axis.transport.http.AxisServlet este un bun candidat.

În jUDDI existã disponibile trei servlet-uri ce extind clasa AxisServlet:

� org.apache.juddi.transport.axis.AdminServlet � pentru administrare;� org.apache.juddi.transport.axis.PublishServlet � pentru publicarea în regiºtri;� org.apache.juddi.transport.axis.InquiryServlet � pentru realizarea interogãrilor.

Aceste trei clase sunt înregistrate de jUDDI ca servlet-uri cu ajutorul unei aplicaþii--server ºi sunt folosite doar pentru a determina tipul cererilor care sunt efectuate.Procesarea de fapt este realizatã de cãtre clasa org.apache.juddi.transport.axis.AxisHandler.

Instrumentul jUDDI încapsuleazã structurile de date fundamentale UDDI(businessEntity, businessService, bindingTemplate ºi tModel) în clase. Acestea se gãsescîn pachetul org.apache.juddi.datatype sub urmãtoarele denumiri:

� org.apache.juddi.datatype.business.BusinessEntity;� org.apache.juddi.datatype.service.BusinessService;� org.apache.juddi.datatype.binding.BindingTemplate;� org.apache.juddi.datatype.tmodel.TModel.

Pentru a putea procesa cererile clienþilor, nu avem de fãcut decât sã recurgemla instanþele acestor clase, împreunã cu alte tipuri de date furnizate de mediuljUDDI.

Page 173: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

173DESCOPERIREA SERVICIILOR

Manipularea cererilor via jUDDI

jUDDI despacheteazã un mesaj de cerere cu ajutorul unui obiect numit AxisHandler.Clasa AxisHandler foloseºte serviciile clasei RegistryEngine pentru a efectua proce-sarea efectivã a cererii primite. Modul de departajare a tipurilor de cereri (inquiry,publish ºi admin) se realizeazã prin intermediul unui URI în cadrul AxisServlet.Framework-ul clasificã fiecare cerere în raport cu valoarea proprietãþii gãsitã înobiectul de cerere MessageContext pentru cheia transport.http.servlet.

De exemplu, o cerere de publicare de date în regiºtrii UDDI e desemnatã deun URI de genul http://localhost:8080/juddi/publish asociat servlet-ului responsabilcu aceasta: PublishServlet. Dupã ce a primit o cerere, un obiect al clasei RegistryEngineconverteºte cererea UDDI bazatã pe XML în obiecte Java (deserializare, unmarshalling).Se invocã obiectele Java ºi ulterior se converteºte rãspunsul (obiectele Java)într-un rãspuns în format XML (serializare, marshalling).

Similar, un URI de forma http://localhost:8080/juddi/inquiry corespunde unuiservlet de tip InquiryServlet.

Modul de autentificare

Framework-ul jUDDI recurge la org.apache.juddi.auth.AuthenticationFactory pentru acrea o instanþã Authenticator, cu scopul de a putea autentifica un client dat.AuthenticatorFactory este o implementare a modelului Factory ºi se foloseºte pentrua realiza o implementare pentru interfaþa org.apache.juddi.auth.Authenticator. Dacã sefoloseºte o valoare nulã, atunci AuthenticationFactory creeazã o implementareimplicitã pentru Authenticator � org.apache.juddi.auth.DefaultAuthenticator. Clasa Default-Authenticator nu aplicã nici o restricþie de acces, deci se permit toate cererile.

În general, sistemele construite pe baza jUDDI trebuie sã ofere o imple-mentare pentru interfaþa Authenticator, care sã realizeze procesul de autentificaredorit. Clasa care implementeazã Authentication este înregistratã printr-o intrare afiºierului de configurare juddi.properties.

Crearea regiºtrilor

Aplicaþia jUDDI se instaleazã ca o aplicaþie Web (fiºier .ear sau .war) ºi, încontextul 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 paºii care trebuie parcurºi pentru instalare. Pre-cizãm faptul cã, pentru ca instalarea sã reuºeascã pe maºina dumneavoastrãconform �reþetelor� furnizate mai jos, trebuie sã recurgeþi exact la versiunile deaplicaþii precizate. În cazul utilizãrii altor versiuni, vor fi necesare � eventual �configurãri diferite.

Page 174: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB174

Preluaþi de pe Web serverul Apache Tomcat (versiunea 5.5). Dupã ce l-aþiinstalat, testaþi funcþionarea lui la adresa http://localhost:8080.

Transferaþi apoi de pe situl Apache framework-ul jUDDI. Pentru exemplificãrilenoastre am utilizat juddi.war, versiunea 0.7.0.

Prin intermediul Tomcat Web Application Manager, încãrcaþi juddi.war (a se vedeafigura urmãtoare).

Figura 6. Interfaþa Web a programului de management al serverului Tomcat

În caz de succes, veþi obþine un rezultat precum cel din captura-ecran de maijos.

Figura 7. Inserarea cu succes a framework-ului jUDDI

Page 175: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

175DESCOPERIREA SERVICIILOR

Pentru a stabili fiºierul de jurnalizare corespunzãtor aplicaþiei jUDDI, vomedita log4j.properties (localizat, pentru Windows, în directorul c:\Tomcat5.5\webapps\juddi \conf \), astfel încât sã includã ºi linia:

log4j.appender.juddilog.File=C:/Tomcat5.5/logs/juddi.log

De asemenea, trebuie modificat ºi fiºierul c:\Tomcat5.5\webapps\juddi\WEB-INF\web.xml pentru a conþine ºi urmãtoarele:

<env-entry-name> log4j.propsFile</env-entry-name><env-entry-value> C:\Tomcat5.5\webapps\juddi\conf\log4j.properties</env-entry-value>

<env-entry-name> juddi.propsFile</env-entry-name><env-entry-value> C:\Tomcat5.5\webapps\juddi\conf\juddi.properties</env-entry-value>

Urmãtorul pas este sã instalaþi serverul MySQL (am lucrat cu versiunea5.0.18). Transferaþi apoi instrumentul MySQL Control Center, care este un clientfolosit pentru a crea ºi a interoga baza de date.

În acest moment, trebuie sã creãm baza de date folositã de jUDDI; va finumitã juddi. Autentificarea la server se va realiza prin utilizatorul �root� cuparola �adria�. Încãrcaþi fiºierul c:\Tomcat5.5\webapps\juddi\ddl\juddi_mysql.ddlîntr-o fereastrã SQL ºi executaþi comenzile SQL pe care le conþine (a se urmãrifigura de mai jos).

Pasul urmãtor este executarea urmãtoarei comenzi, care stabileºte numeleentitãþii care va publica date în regiºtrii privaþi UDDI:

INSERT INTO PUBLISHER (PUBLISHER_ID,PUBLISHER_NAME,ADMIN) VALUES ('juddi', 'Juddi user', 'false');

Page 176: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB176

Figura 8. Execuþia fiºierului de comenzi SQL în vederea creãrii tabelelorce urmeazã a fi folosite de jUDDI

Figura 9. Inserarea datelor privitoare la entitatea ce va publica date în regiºtrii privaþi

Page 177: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

177DESCOPERIREA SERVICIILOR

Mai trebuie sã obþineþi de pe Internet driver-ul MySQL JDBC, astfel încât sãse poatã accesa serverul MySQL. Preluaþi mysql-connector-java-3.0.17-stable-bin.jar ºicopiaþi-l în directorul c:\Tomcat5.5\common\lib\.

Configurarea ºi folosirea aplicaþiei jUDDI

Creaþi un fiºier cu numele juddi.xml în cadrul directorului c:\Tomcat5.5\conf\Catalina\localhost\. Drept conþinut, introduceþi urmãtoarele linii:

<Context path="/juddi" docBase="juddi" debug="5" reloadable="true" crossContext="true"> <Resource name="jdbc/juddiDB" auth="Container" type="javax.sql.DataSource" initialSize="30" maxActive="100" maxIdle="30" maxWait="10000" username="root" password="adria" driverClassName="com.mysql.jdbc.Driver" removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true" url="jdbc:mysql://localhost:3306/juddi" /></Context>

Astfel, am stabilit o serie de parametri referitori la conexiunea cu serverul debaze de date via driver-ul mai sus menþionat.

În cazul în care lucraþi cu Tomcat versiunea 4.1.24, acest fiºier are forma:

<Context path="/juddi" docBase="juddi" debug="5" reloadable="true" crossContext="true"> <Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_juddiDB_log" suffix=".txt" timestamp="true" /> <Resource name="jdbc/juddiDB" auth="Container" type="javax.sql.DataSource" /> <ResourceParams name="jdbc/juddiDB"> <parameter> <name>factory</name> <value> org.apache.commons.dbcp.BasicDataSourceFactory </value> </parameter> <parameter> <name>maxActive</name> <value>100</value>

Page 178: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB178

</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>

Sunteþi în acest moment pregãtiþi sã rulaþi jUDDI.Pentru a verifica modul de execuþie a instrumentului jUDDI, porniþi serverul

Web ºi introduceþi adresa http://localhost:8080/juddi/happyjuddi.jsp. Dacã obþineþiinformaþii similare celor din figura de mai jos, atunci din acest moment registruldumneavoastrã UDDI este pregãtit sã recepþioneze cereri.

Pachetul de instalare jUDDI include o serie de alte exemple utile pe care leputeþi folosi pentru a trimite cereri registrului.

Folosind succesiunea de paºi detaliatã anterior, puteþi utiliza jUDDI pentrucrearea altor regiºtri privaþi UDDI, care sã poatã deservi cereri de publicare,autentificare ºi interogare.

Nu ne rãmâne decât sã vã urãm succes în exploatarea registrului UDDI propriu!

Page 179: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

179DESCOPERIREA SERVICIILOR

Figura 10. Mesajele de stare obþinute în urma rulãrii aplicaþiei de diagnosticare jUDDI

2. WSIL (Web Service Inspection Language)

Iniþiativa WSIL (Web Service Inspection Language) � regãsitã ºi sub numeleWS-Inspection � defineºte modul în care se poate descoperi o descriere XML aunui serviciu Web aflat pe un server Web. Astfel, serviciile Web pot fi regãsite

Page 180: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB180

facil. Via WSIL, un furnizor de servicii poate sã-ºi facã disponibile serviciilepentru a putea fi descoperite ºi utilizate de cãtre consumatori.

Acest aspect este similar cu misiunea UDDI, dar WSIL se doreºte a fi o etapãsuperioarã UDDI în evoluþia procesului de regãsire a serviciilor Web.

Figura urmãtoare ilustreazã noile relaþii ce pot fi stabilite între consumatori,furnizori ºi regiºtrii centralizaþi UDDI. Prima diferenþã se materializeazã înfaptul cã o cerere de cãutare a unui serviciu Web nu se realizeazã direct asupraregiºtrilor centralizaþi UDDI. În schimb, cãutarea este efectuatã de cãtre consu-matori direct la furnizorul de servicii.

Conform acestui model, regiºtrii UDDI centralizaþi ºi nemoderaþi vor devenidescentralizaþi ºi moderaþi. De observat, de asemenea, cã nimeni nu împiedicãfurnizorii de servicii sã-ºi înregistreze serviciile în cadrul regiºtrilor UDDI ºi sãredirecteze gãsirea serviciului spre regiºtrii UDDI.

Figura 11. Furnizorii de servicii îºi fac serviciile cunoscute via WSIL

Page 181: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

181DESCOPERIREA SERVICIILOR

Trebuie sã observãm cã WSIL nu reprezintã un limbaj de descriere a serviciilorWeb, aceastã responsabilitate având-o în continuare WSDL. Limbajul WSIL estefolosit doar pentru a face publice serviciile Web.

Elementele limbajului WSIL aparþin spaþiului de nume desemnat de adresahttp://schemas.xmlsoap.org/ws/2001/10/inspection/.

Documentul WSIL minimal constã dintr-un element-rãdãcinã service, careconþine un element description. Elementul service are rol de prezentare a serviciilor.Documentele WSIL nu sunt folosite doar pentru descrierea serviciilor Web viaWSDL, astfel încât sã poatã fi utilizate ºi alte maniere de definire a serviciilor.

Specificaþiile WSIL definesc o serie de convenþii care sã permitã consu-matorilor sã localizeze documentele WSIL pe orice sit Web (vezi ºi figura 11).Aceste convenþii presupun existenþa unui nume prestabilit al documentuluiWSIL ºi o manierã de legãturã la un document WSIL. Numele prestabilit esteinspection.wsil. Un document cu un astfel de nume ar trebui plasat în punctele deintrare cele mai vizitate ale unui sit Web. De exemplu, dacã un astfel de puncteste http://www.magazin-portocale.info/, atunci documentul WSIL ar trebui localizatprin http://www.magazin-portocale.info/inspection.wsdl.

Însã foarte puþini furnizori ce recurg la WSIL vor oferi documentul WSIL laacest nivel. Putem sã ne gândim cã aceste documente WSIL pot fi regãsite destulde uºor cu ajutorul unor motoare de cãutare precum Google sau Yahoo!.

Având scopul de a permite furnizorilor sã-ºi organizeze serviciile într-omanierã ierarhicã, documentele WSIL pot fi interconectate. Aceasta se realizeazãprin prezenþa elementului link. Un document WSIL poate avea un numãr oricâtde mare de legãturi, generându-se astfel o întreagã reþea de documente WSIL.

Drept exemplificare, vom oferi un fragment din documentul WSIL pus ladispoziþie de situl XMethods, document localizat la adresa http://www.xmethods.net/inspection.wsil. Arborele asociat din figura 12 a fost generat cu ajutorul instru-mentului oXygen XML Editor.

În ciuda prezenþei regiºtrilor UDDI, se remarcã existenþa unui �gol� (gap)interpus între furnizorii de servicii ºi consumatori. Specificaþia WSIL propusã deIBM ºi Microsoft încearcã sã acopere acest gol, în timp ce UDDI se perfec-þioneazã ºi va deveni o soluþie convenabilã mai ales în contextul enterprise.

Page 182: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB182

Figura 12. Detalii privind un serviciu Web pus la dispoziþie de XMethodsºi descris prin WSIL

Referinþe

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, 2004Tanasã, ª., Olaru, C., Dezvoltarea aplicaþiilor Web folosind Java, Polirom, Iaºi, 2005Weerawarana, S. et al., Web Services Platform Architecture, Prentice Hall PTR, 2005

Page 183: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

183DESCOPERIREA SERVICIILOR

* * *, IBM�s UDDI Business Registry: http://www.uddi.ibm.com/* * *, Instrumentul jUDDI: http://ws.apache.org/juddi/* * *, Java Coffee-Break: http://www.javacoffeebreak.com/* * *, Microsoft�s UDDI Business Registry: http://uddi.microsoft.com/* * *, Serverul Apache: http://httpd.apache.org/* * *, Situl dedicat dezvoltatorilor MySQL: http://dev.mysql.com/* * *, Situl dedicat serverului Tomcat: http://jakarta.apache.org/tomcat/* * *, Situl dedicat serviciilor Web: http://www.webservices.org/* * *, Situl Sun privitor la Java: http://java.sun.com/* * *, Situl XML SOAP: http://www.xmlsoap.org/* * *, Source Forge: http://www.sourceforge.net/* * *, UDDI (Universal Description, Discovery, and Integration): http://www.uddi.org/* * *, WS-I (Web Services-Interoperability Organization): http://www.ws-i.org/* * *, XMethods: http://www.xmethods.net/

Page 184: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)
Page 185: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

Capitolul 6

Dezvoltarea ºi utilizarea serviciilor Web

�Dacã teoria mea nu corespunde faptelor, cu atâtmai rãu pentru fapte.�

(Georg Wilhelm Friedrich Hegel)

1. Dezvoltarea ºi invocarea de servicii Webfolosind instrumente open source

1.1. Introducere

În majoritatea cazurilor, serviciile Web funcþioneazã conform paradigmei client/server: serverul ruleazã permanent, unul sau mai mulþi clienþi trimit spre acestacereri SOAP printr-un protocol de transport (cel mai uzual, HTTP), iar serverulîntoarce un rãspuns.

În cazul serviciilor Web, standardele sunt esenþiale pentru asigurarea inter-ope-rabilitãþii. Aºa cum s-a vãzut în capitolele anterioare, codificarea conþinutuluimesajelor vehiculate (cererea ºi rãspunsul) prin SOAP adoptã formatul XML, iardescrierea serviciului Web se bazeazã pe limbajul WSDL. Eventual, pot fi ataºateopþional date codificate în stilul base64, folosind propunerea SwA (SOAP withAttachments), ori metoda standardizatã, recomandatã de Consorþiul Web � MTOM(Message Transmission Optimization Mechanism). Mecanismul de ataºare respectãbine-cunoscutele prevederi MIME (Multipurpose Internet Mail Extensions), largfolosite în cazul mesajelor de poºtã electronicã.

Trebuie sã remarcãm încã o datã cã nu existã nici o restricþie în alegerealimbajului de programare în care se vor implementa serviciul Web ºi posibilii luiclienþi (programe desktop, aplicaþii Web, alte servicii Web etc.). Indiferent celimbaj, instrument, platformã sunt folosite, în esenþã dezvoltarea ºi utilizareaserviciilor Web prezintã aceleaºi caracteristici ºi adoptã ºabloane de proiectaresimilare.

Unele instrumente SOAP implementeazã propriul server Web, folosind HTTP(de exemplu, SOAP::Lite sau Microsoft Visual Web Developer). Altele, precum

Page 186: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB186

extensia Soap pentru PHP sau biblioteca gSOAP, presupun instalarea în cadrulunui server Web particular, astfel încât daemon-ul HTTP va manevra mesajeleSOAP spre o componentã proxy, care realizeazã invocarea serviciului Web înmanierã transparentã pentru programator. O serie de instrumente SOAP suportãun mecanism de transport configurabil care pemite selecþia, la nivel de aplicaþie,a protocolului de transport. Modulul SOAP::Lite, de pildã, oferã suport pentruHTTP, FTP, SMTP sau Jabber.

Instrumentele SOAP furnizeazã o componentã proxy, menitã a procesa ºiinterpreta mesajul SOAP în vederea invocãrii codului aplicaþiei. Aceastãcomponentã trebuie sã aibã în responsabilitate recunoaºterea stilului de codi-ficare, translatarea datelor din format nativ � de exemplu obiecte Java sau.NET � în XML (ºi invers), procesarea antetului din mesajul SOAP cu atributulmustUnderstand="true" etc. Atunci când o componentã proxy manevreazã unmesaj SOAP, va trebui sã efectueze urmãtoarele:

� deserializarea mesajului, dacã este necesar, din format XML într-o formãadecvatã pentru a-l putea analiza;

� invocarea codului (a metodelor);� serializarea rãspunsului primit în XML ºi manevrarea lui în scopul trimiterii

acestuia la emiþãtor.

În ciuda diferenþelor de implementare, instrumentele pentru dezvoltarea deservicii Web prin SOAP urmeazã acelaºi 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 pentruPHP ºi Perl. Pentru început, vom construi un server ºi un client SOAP simpluîn PHP, utilizând extensia Soap disponibilã în versiunea 5 a acestui server deaplicaþii º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 Weboferind o interfaþã comodã pentru operaþiile uzuale realizate asupra resurselorunui sistem de fiºiere aflat de distanþã. Pentru aceasta, vom recurge la modululSOAP::Lite, unul dintre cele mai cunoscute instrumente de dezvoltare în limbajulPerl a serviciilor Web ºi a clienþilor aferenþi acestora.

1.2. Furnizarea stocurilor de portocale viaun serviciu Web scris în PHP 5

Misiunea pe care o avem de realizat este uºor de îndeplinit. Trebuie sã imple-mentãm un server SOAP care va oferi accesul la un serviciu Web, incluzând osingurã metodã � furnizeazaCantit(). Aceasta va avea ca parametru de intrare un

Page 187: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

187DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

ºir de caractere desemnând un sortiment de portocale ºi va returna cantitateaexistentã, dacã acel sortiment existã. Nu vom furniza o descriere WSDL asociatãserviciului, invocarea putându-se realiza explicit, dupã cum vom vedea mai jos.Codul-sursã al acestui serviciu simplu este dat în continuare:

<?phptry { // nu oferim nici o descriere WSDL, // stabilim URI-ul serviciului $server = new SoapServer(null, array('uri' => 'urn:portocale.info')); // adãugãm metodele implementate $server->addFunction('furnizeazaCantit'); // aºteptãm cereri SOAP $server->handle();} catch (SOAPFault $exception) { echo 'A apãrut o excepþie: ' . $exception;}

// funcþie care furnizeazã cantitatea// dintr-un sortiment de portocalefunction furnizeazaCantit ($numeSortiment) { // de obicei, aici vom efectua o interogare SQL // ori una XQuery switch ($numeSortiment) { case 'japoneze': return 33; case 'albastre': return 74; default : return 'inexistent'; }}?>

Primul argument al constructorului desemneazã adresa (URL-ul) documentuluiWSDL ce descrie serviciul, în acest caz fiind null. Spaþiul de nume prin care eidentificat serviciul dezvoltat este dat în situaþia de faþã de un URN � urn:portocale.info.Fiecare funcþie implementatã va fi adãugatã cu addFunction(). De asemenea, unuiserviciu i se poate asocia o clasã prin intermediul metodei setClass(). CererileSOAP vor fi rezolvate via handle(), care va avea în responsabilitate ºi (de)seria-lizarea datelor.

Deoarece extensia Soap este inclusã în distribuþia standard PHP 5, pentrurularea programului de mai sus nu va trebui instalat nimic suplimentar. Înexemplificãrile de faþã am recurs la PHP versiunea 5.0.4 sub diverse versiuni aleserverului Apache 2.0.

Page 188: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB188

1.3. Un client PHP pentru serviciul Webprivitor la portocale

Recurgând tot la extensia Soap, vom concepe un client care va invoca metodaexpusã de serviciul Web pentru o serie de sortimente de portocale. Liniile de codPHP sunt urmãtoarele:

try { $client = new SoapClient(null, array('location' => 'http://localhost/sxml/

oranges-server.php', 'uri' => 'urn:portocale.info')); // realizãm o suitã de invocãri ale metodei dorite foreach (array('albastre', 'japoneze', 'celeste') as $sortiment) { $rez = $client->__call('furnizeazaCantit', array($sortiment)); echo "<p>Stocul de portocale $sortiment este <strong>$rez</strong>.</p>"; }} catch (SOAPFault $exception) { echo 'A apãrut o excepþie: ' . $exception->faultstring;}

Deoarece nu avem la dispoziþie descrierea WSDL a serviciului, vom folosi__call() pentru invocarea metodei furnizeazaCantit(). Excepþiile ce pot survenisunt capturate graþie construcþiei try � catch incluse în PHP 5. Obiectul SOAPFaultîncapsuleazã informaþiile privitoare la un fault SOAP; în cazul de faþã am utilizatproprietatea faultstring pentru a afiºa mesajul de excepþie. Eºuarea unui apelSOAP poate fi verificatã ºi cu is_soap_fault(). Mesajele vehiculate vor respecta înmod implicit versiunea 1.1 a protocolului SOAP. Extensia Soap oferã posibilitateade a recurge însã ºi la SOAP 1.2.

În urma iteraþiilor realizate, vom obþine un rezultat precum cel din figura 1.Tipul rãspunsului primit este unul eterogen (fie întreg, fie string), în funcþiede existenþa sortimentului de portocale pentru care realizãm invocareametodei.

Page 189: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

189DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

Figura 1. Invocarea serviciului Web implementat în PHP 5

1.4. Un serviciu de manipulare a fiºierelor implementatîn Perl cu SOAP::Lite

Ne propunem în continuare sã implementãm un server SOAP, disponibil laportul 3333 via protocolul HTTP, care va încapsula funcþionalitãþile unui serviciuWeb, oferind diverse operaþii asupra fiºierelor existente pe server. Drept exempli-ficare, vom scrie urmãtoarele metode:

� List, care furnizeazã lista fiºierelor existente la nivel de server; nu necesitãparametri de intrare ºi întoarce o structurã de forma <file name="..." />pentru fiecare fiºier gãsit (vezi infra);

� CheckIfExists, ce verificã existenþa unui fiºier la nivel de server, având caparametru de intrare un ºir de caractere desemnând un nume de fiºier; vaîntoarce valoarea 1 dacã fiºierul existã ºi 0 dacã e inaccesibil (nu poate firegãsit ori nu existã suficiente drepturi de acces asupra lui);

� Rename, care redenumeºte un fiºier, necesitând doi parametri (numele vechi ºicel nou) de tip ºir de caractere; va întoarce un ºir de caractere: �success� în cazde succes ºi �error� în caz contrar.Codul-sursã al programului Perl este urmãtorul:

#!/usr/bin/perl -wuse strict;use SOAP::Transport::HTTP +debug => [qw(all)];

# nu dorim sã fim întrerupþi de semnale# precum 'Broken pipe' ori la acþionarea

Page 190: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB190

# combinaþiei de taste CTRL+C$SIG{PIPE} = $SIG{INT} = 'IGNORE';

# iniþializãm serverul, folosind un daemon HTTPmy $server = SOAP::Transport::HTTP::Daemon->new (

LocalAddr => 'localhost', # adresa localãLocalPort => 3333, # portul utilizatReuse => 1); # reutilizãm portul

# funcþionalitatea serverului este furnizatã# de clasa 'XMLFiles'$server->dispatch_to ('XMLFiles');

print 'Serverul SOAP ruleazã la ' . $server->url;# ne blocãm, aºteptând cereri din partea clienþilor$server->handle;

# clasa implementând funcþionalit. serviciului WebBEGIN {package XMLFiles;use SOAP::Lite;use base qw(SOAP::Server::Parameters);

sub List { # metoda de generare a listei # fiºierelor existente pe server my $self = shift; my $envelope = pop; my $files = ''; # returnãm rãspunsul drept frag. de doc. XML foreach my $file (glob('*')) {

$files .= "<file name=\"$file\" />"; } return SOAP::Data->type('xml' => $files);}

sub CheckIfExists { # metoda de verificare# a existenþei unui fiºier

my $self = shift; my $envelope = pop; # preluãm param. de intrare via o expresie XPath # (nu ºtim cum ar putea fi încapsulat) my $filename = $envelope->dataof('//filename'); # trimitem un 'fault' # dacã nu existã parametrul de intrare die SOAP::Fault->faultcode('Server.CheckIfExists') ->faultstring( 'Input parameter is missing') unless $filename;

Page 191: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

191DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

# furnizãm fiºierul în cauzã, dacã existã return (-e $filename->value) ? 1 : 0;}

sub Rename { # metoda de redenumire a unui fiºier my $self = shift; my $envelope = pop; # preluãm parametrii de intrare my $filename = $envelope->dataof('//filename'); my $newname = $envelope->dataof('//newname'); # eventual, semnalãm inexistenþa lor die SOAP::Fault->faultcode('Server.Rename') ->faultstring( 'Input filename parameter is missing') unless $filename; die SOAP::Fault->faultcode('Server.Rename') ->faultstring( 'Input newname parameter is missing') unless $newname; # returnãm rãspunsul return SOAP::Data->name('result' => (rename ($filename->value, $newname->value) ? 'success' : 'error'));}

# eventual, alte metode...}

Serverul va rula la infinit, ocupând portul 3333 al maºinii locale (vezi figura 2).Va pune la dispoziþie via SOAP 1.1 peste HTTP cele trei metode descrise maisus. Pentru fiecare metodã în parte, preluãm parametrii necesari. În cazul în careaceºtia nu sunt furnizaþi de client, se va întoarce un mesaj de tip fault SOAP,semnalându-se o situaþie de excepþie. Am dorit ca rãspunsul oferit sã fie de maimulte tipuri de date (întreg, ºir de caractere sau o listã de fiºiere marcatã înXML), pentru a se putea observa diferenþele de codificare.

Modulul SOAP::Perl apare în majoritatea distribuþiilor Perl actuale. Versiunileutilizate pentru testarea ºi rularea exemplelor din aceastã carte au fost 0.65 ºi0.68. În cazul în care modulul este indisponibil, poate fi preluat din CPAN(Comprehensive Perl Archive Network) � accesibil la http://search.cpan.org/ � ºi instalatconform urmãtorilor paºi:

(infoiasi)$ perl Makefile.PL(infoiasi)$ make(infoiasi)$ make test(infoiasi)$ make install

Page 192: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB192

Figura 2. Rularea serverului SOAP într-o fereastrã a unei console KDE

Pentru a putea realiza transferuri SOAP cu fiºiere ataºate (SOAP withAttachments) va trebui sã recurgem la modulul SOAP::MIME, care îmbunãtãþeºteo serie de aspecte ale SOAP::Lite. Mai trebuie remarcat faptul cã modululSOAP::Lite nu oferã suport pentru generarea automatã de descrieri WSDLcorespunzãtoare serviciilor Web implementate.

Pentru alte detalii privitoare la folosirea sesiunilor în cadrul serviciilor Web,a invocãrii unor servicii externe ºi a utilizãrii unor metode de autentificare încadrul serviciilor Web dezvoltate, cititorii interesaþi pot consulta documentaþiileºi exemplele incluse în arhiva de instalare a modulului SOAP::Lite.

1.5. Scrierea în Perl a clientului SOAP

În acest moment putem scrie un client Perl simplu care sã invoce metodeleserviciului Web implementat. Vom realiza o interacþiune de bazã cu utilizatorul,la nivelul liniei de comandã (prompt-ul interpretorului de comenzi, de obicei bashîn Linux). Codul-sursã al programului-client e furnizat mai jos:

#!/usr/bin/perl -w# folosim modulul SOAP::Lite cu opþiunea de depanareuse SOAP::Lite +debug => [qw(all)];

if (scalar(@ARGV) < 1) { print "Client de accesare a metodelor oferite de unserviciu Web\npentru accesarea sistemului de fiºiere de peserver.\n"; print "Sintaxa: $0 <fiºier_existent_pe_server>\n"; exit(1);}

Page 193: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

193DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

# ne conectãm la servermy $soap = SOAP::Lite ->uri('http://127.0.0.1:3333/XMLFiles/') # adresa spaþiului de nume ->proxy( 'http://127.0.0.1:3333/XMLFiles/xml-files.pl'); # locaþia serviciului

# împachetãm explicit parametrii,# folosind nume calificate# pentru parametrii metodei invocatemy @params = (SOAP::Data->name('filename', $ARGV[0]));

# verificãm dacã fiºierul existã pe server$response = $soap->call('CheckIfExists' => @params);

# verificãm dacã a apãrut o eroare (SOAP fault)if ($response->fault) {

die 'A apãrut o eroare: ' . $response->faultstring;}# dacã rezultatul primit e nul, fiºierul nu existãif (!$response->result) {

die 'Fiºier inaccesibil (nu existã pe server?)';}

# invocãm metoda de redenumire a fiºierului# adãugând ºi numele cel nou al acestuiapush (@params, SOAP::Data->name('newname', $ARGV[0] . '.renamed'));

# afiºãm rezultatul execuþiei metodeiprint 'Redenumire realizatã cu ' . $soap->call('Rename' => @params)->result;

Programul va verifica existenþa unui fiºier al cãrui nume este furnizat deutilizator în linia de comandã, va încerca sã-l redenumeascã (numele vechi va fisufixat cu .renamed), apoi va afiºa lista fiºierelor existente pe server (putemverifica astfel dacã redenumirea s-a efectuat).

În urma execuþiei acestui script, vom putea obþine un rezultat asemãnãtor cuurmãtorul (presupunem cã pe server existã fiºierul denumit portocale.txt):

(infoiasi)$ perl xml-files-client.pl portocale.txtFisierul exista.Redenumire realizata cu succes.Fisierele existente pe server:

Page 194: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB194

portocale.txt.renamedxml-files.plxml-files.pl~

Prima cerere efectuatã de programul-client este încapsulatã într-un mesajHTTP de forma de mai jos, în care se pot observa câmpurile-antet HTTP, tipulconþinutului (fiºier XML) ºi corpul mesajului SOAP (reprezintã invocarea metodeiCheckIfExists cu parametrul corespunzãtor furnizat tot sub forma de marcajeXML):

POST http://127.0.0.1:3333/XMLFiles/xml-files.pl HTTP/1.1Accept: text/xmlAccept: multipart/*Accept: application/soapContent-Length: 517Content-Type: text/xml; charset=utf-8SOAPAction: "http://127.0.0.1:3333/XMLFiles/#CheckIfExists"

<?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> <namesp1:CheckIfExists xmlns:namesp1="http://127.0.0.1:3333/XMLFiles/"> <filename xsi:type="xsd:string"> portocale.txt </filename> </namesp1:CheckIfExists></soap:Body></soap:Envelope>

Rãspunsul oferit de server este:

HTTP/1.1 200 OKDate: Fri, 04 Aug 2006 18:25:51 GMTServer: libwww-perl-daemon/1.36Content-Length: 523Content-Type: text/xml; charset=utf-8Client-Date: Fri, 04 Aug 2006 18:25:51 GMT

Page 195: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

195DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

Client-Peer: 127.0.0.1:3333Client-Response-Num: 1SOAPServer: 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>

Se poate remarca faptul cã valoarea rãspunsului furnizat (întregul 1) esteîncapsulatã în marcatorii XML din cadrul corpului plicului SOAP ce împacheteazãinformaþiile vehiculate între serviciu ºi clienþii sãi.

Lucrurile decurg similar pentru a doua cerere � corespunzãtoare invocãriimetodei Rename � ºi rãspunsul aferent.

Pentru a treia cerere, de invocare a metodei List, nu existã argumente deintrare, în cadrul corpului plicului SOAP apãrând doar:

<namesp3:List xsi:nil="true" xmlns:namesp3="http://127.0.0.1:3333/XMLFiles/" />

Rezultatul metodei reprezintã o structurã XML de genul:

<namesp4:ListResponse xmlns:namesp4="http://127.0.0.1:3333/XMLFiles/"> <file name="portocale.txt.renamed" /> <file name="xml-files.pl" /></namesp4:ListResponse>

Spaþiile de nume de forma namespN sunt generate în mod automat de cãtreSOAP::Lite pentru a indica apartenenþa fiecãrui element XML din cadrul mesa-jului SOAP vehiculat.

Page 196: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB196

În cazul în care clientul nu furnizeazã numele parametrului corect (deexemplu, în loc de filename se trimite file pentru metoda CheckIfExists), se vaobþine un mesaj de tip fault SOAP emis de serviciu (codul entitãþii emitente, ºirulexplicativ ºi adresa entitãþii care a cauzat excepþia):

...<soap:Body> <soap:Fault> <faultcode> soap:Server.CheckIfExists </faultcode> <faultstring> Input parameter is missing </faultstring> <faultactor> http://127.0.0.1:3333/ </faultactor> </soap:Fault></soap:Body>...

1.6. Invocarea serviciului de cãtre un client PHP

Am dori ca serviciul sã poatã fi invocat de o aplicaþie Web, astfel încâtinteracþiunea cu utilizatorul sã poatã fi realizatã prin intermediul unui browserWeb. Aceasta o vom realiza scriind un client PHP, inter-operabilitatea având locfãrã probleme, din moment ce mesajele sunt vehiculate via XML, indiferent deplatformã. Programul PHP recurge la biblioteca NuSOAP (versiunea 0.6.5) ºi areurmãtorul cod-sursã:

<?phprequire_once('lib/nusoap.php'); # utilizãm NuSOAP

// instanþierea unui client SOAP// pe baza descrierii serviciului Web$client = new soapclient( 'http://endirra.ro:3333/xml-files.pl');// preluãm posibilele erori$err = $client->getError();if ($err) {

// semnalãm eroareaecho '<h3>Eroare de iniþializare</h3><pre>'

. $err . '</pre>';}// stabilim parametrii de intrare ai metodei invocate

Page 197: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

197DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

$param = array('filename' => 'xml-files.pl'); # existã cu siguranþã# de încercat cu un fiºier inexistent:# $param = array('filename' => 'inexistent.xml');// stabilim spaþiul de nume folosit$namespace = 'http://127.0.0.1:3333/XMLFiles/';

// realizãm apelul$result = $client->call('CheckIfExists', array('parameters' => $param), $namespace, '', true);// verificãm dacã existã vreun faultif ($client->fault) {

echo '<h3>Fault</h3><pre>';print_r($result);echo '</pre>';

} else { // verificãm dacã sunt erori$err = $client->getError();if ($err) { echo '<h3>Eroare</h3><pre>' . $err . '</pre>';} else { // afiºãm rezultatul echo '<h3>Rezultat</h3>'; echo '<p>Fiºierul ' . ($result ?

'existã' : 'e inaccesibil') . '.</p>';}

}

// cererea, rãspunsul ºi informaþiile de depanareecho '<h3>Cerere</h3><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';echo '<h3>Rãspuns</h3><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';echo '<h3>Depanare</h3><pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';?>

Dupã cum se poate remarca, se instanþiazã un obiect $client al clasei soapclient()pusã la dispoziþie de biblioteca mai sus menþionatã. Constructorul necesitãadresa Web a serviciului dorit a fi invocat. Posibilele erori survenite pot ficaptate cu metoda getError(), iar fault-urile SOAP via proprietatea fault.

În acest caz am invocat doar metoda de verificare a existenþei unui fiºier,recurgând la metoda call(). Convenþia este ca parametrii transmiºi sã fie încapsulaþiîntr-un tablou (array).

Page 198: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB198

Un posibil rezultat este ilustrat de figura 3, în care se remarcã ºi afiºareacererii, a rãspunsului ºi a informaþiilor privitoare la depanare, direct în programulde navigare Web. Programul-client PHP ºi serverul SOAP scris în Perl au fosttestate pe platformele Linux ºi Windows. Navigatorul Mozilla Firefox carerealizeazã invocarea script-ului PHP ruleazã în Windows.

Figura 3. Rezultatele execuþiei programelor PHP ce invocã metodele CheckIfExistsºi List ale serviciului Web implementat în Perl

(au fost folosite navigatoarele Mozilla Firefox ºi Opera)

În cazul invocãrii metodei List, care întoarce drept rezultat un fragment dedocument XML, vom procesa datele obþinute prin intermediul extensiei Simple

Page 199: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

199DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

XML (disponibilã în PHP versiunea 5). Liniile de cod prezentând interes în acestcontext sunt urmãtoarele:

// realizãm apelul$result = $client->call('List', undefined, $namespace, '', true);$err = $client->getError();if ($err) { echo '<h3>Eroare</h3><pre>' . $err . '</pre>';} else { // afiºãm lista de fiºiere echo '<h3>Fiºierele existente pe server</h3><ul>'; // procesãm rãspunsul SOAP via Simple XML $xml = simplexml_load_string ($client->responseData); foreach ($xml->xpath("//file") as $file) { // afiºãm fiecare nume de fiºier echo '<li>' . $file['name'] . '</li>'; } echo '</ul>';}

Rezultatul obþinut este ilustrat tot de figura 3.

2. Inter-operabilitatea între diverse tehnologii,instrumente ºi limbaje de programare a serviciilor Web

2.1. Dezvoltarea de servicii Web în .NET Framework

În cadrul platformei .NET, un serviciu Web este considerat ca fiind un tipspecific de assembly (formã atomicã a unui modul de cod), tratat într-o manierãspecialã de cãtre mediu. Serviciile Web sunt conþinute de fiºiere cu extensia.asmx. Serverul Web Microsoft IIS (Internet Information Services) recunoaºte fiºierele.asmx ca fiind servicii Web ºi în mod automat exportã funcþiile assembly-uluireferenþiat.

Procesul de dezvoltare ºi exploatare a unui serviciu Web în .NET este(relativ) simplu: se scrie codul-sursã, se salveazã într-un fiºier .asmx, se exportãrespectivul fiºier într-un director virtual al serverului IIS ºi se invocã respectivulserviciu via un client.

Page 200: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB200

Un serviciu Web simplu implementat în C#

Sã începem cu un serviciu Web extrem de simplu. Conform tradiþiei, primulprogram scris trebuie sã fie unul care afiºeazã �Salut, lume!� (�Hello, world!�).Vom scrie un serviciu care sã furnizeze mesajul �Bunã X�, unde X reprezintã unºir de caractere introdus de utilizator (printr-un anumit client, desigur). Putemrecurge la orice editor de texte favorit pentru a crea fiºierul de cod C# cunumele salutari.asmx.

Liniile programului nostru sunt urmãtoarele:

<%@ WebService Language="C#" Class="Hello" %>using System.Web.Services;

[WebService(Namespace="urn:Hello")]public class Hello { [WebMethod] public string sayHello (string nume) { return "Buna " + nume; }}

Linia <%@ WebService Language=�C#� Class=�Hello� %> este o directivã careindicã mediului .NET sã exporte un serviciu Web, scris în limbajul C# ºiimplementat de clasa cu numele Hello.

Linia using (în acest caz, using System.Web.Services) realizeazã includerea assembly-urilornecesare (în cazul nostru, a claselor privitoare la serviciile Web).

Linia [WebService(Namespace=�urn:Hello�)] este opþionalã, dar ne permite sãspecificãm diferite atribute ataºate serviciului Web dezvoltat. În acest caz, amstabilit un spaþiu de nume explicit (altfel .NET l-ar fi ales pe cel implicit,desemnat de http://tempuri.org/).

[WebMethod] defineºte faptul cã metoda clasei Hello face parte din cadrulserviciului Web, fiind disponibilã posibililor clienþi. De asemenea, pot fispecificate anumite proprietaþi legate de operaþiile pe care le realizeazãserviciul.

Dupã ce am creat un astfel de fiºier, atunci când el este solicitat de un clientvia o cerere SOAP transportatã prin HTTP, modulul .NET runtime va compilacodul serviciului (dacã nu a fãcut-o deja), pentru a se putea invoca una dintremetodele dorite ale serviciului.

În fapt, .NET permite realizarea mai multor tipuri de cereri:

� cereri privitoare la interfaþa serviciului (ceea ce oferã acesta), generându-seautomat o descriere WSDL a acestuia;

Page 201: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

201DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

� cereri care se intereseazã în mod explicit de o metodã furnizatã de serviciulîn cauzã;

� cereri de invocare a unei operaþii (metode) furnizate de serviciul Web (viaSOAP 1.1 sau SOAP 2.0).

Fiºierul salutari.asmx va fi mutat în directorul public al serverului Web(pentru IIS, în mod implicit este c:\inetpub\wwwroot\), iar invocarea se varealiza via URI-ul http://localhost/salutari.asmx (am presupus cã IIS ruleazã pemaºina localã la portul 80). Un rezultat posibil e cel ilustrat de captura-ecranurmãtoare:

Figura 4. Interfaþa Web de interacþiune cu serviciul Web viaprogramul de navigare

Dând clic pe sayHello, vom putea parcurge o descriere detaliatã privitoare lamaniera de invocarea a metodei sayHello folosind cereri SOAP 1.1, SOAP 1.2 sauPOST (vezi figura 5).

Page 202: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB202

Figura 5. Furnizarea informaþiilor privitoare la forma cererii SOAP de invocarea metodei serviciului Web

Pentru a testa funcþionalitatea serviciul Web creat, introducem un nume înformularul Web disponibil în cadrul paginii ºi apãsãm butonul Invoke.

Page 203: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

203DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

Figura 6. Invocarea metodei sayHello

În urma rulãrii codului, vom obþine un rezultat precum cel din figura de maijos (rãspunsul întors este un document XML, aºa cum era ºi de aºteptat):

Figura 7. Rezultatul obþinut dupã execuþia metodei invocate

În cele ce urmeazã, vom implementa un client simplu care sã invoce serviciulWeb de mai sus din cadrul unui program C# interactiv. Fragmentul de cod carese ocupã cu invocarea propriu-zisã este urmãtorul:

using System;using System.Diagnostics;using System.Xml.Serialization;using System.Web.Services;using 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

Page 204: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB204

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 obþinut (tablou de obiecte) // în urma invocãrii metodei serviciului Web object[] rezult = this.Invoke ("sayHello", new object[]{nume}); // întoarcem primul element return ((string)(rezult [0]));}}}

Construcþia [System.Web.Services.WebServiceBindingAttribute�] stabileºte la com-pilare ca assembly-ul rezultat sã fie folosit pentru a invoca un serviciu Web. Cândacest assembly este compilat, .NET pune la dispoziþie un mecanism internfacilitând funcþionarea cererilor SOAP.

Linia System.Web.Services.Protocols.SoapHttpClientProtocol specificã protocolul carese doreºte a fi utilizat (în acest caz, SOAP peste HTTP).

În cadrul clasei s-a mai creat un proxy pentru operaþia sayHello ºi s-auspecificat diferite atribute privitoare la serviciul Web invocat. Detalii suntdisponibile în cadrul documentaþiilor ce însoþesc .NET Framework.

Programul-client recurge la Windows Forms ºi la rulare, în cazul unei compilãricu succes, va afiºa o fereastrã în care se solicitã utilizatorului sã introducã unnume. În urma apãsãrii butonului Invoke, vom obþine un rezultat precum cel dinfigura 8.

Când a fost apãsat butonul Invoke, s-a produs un eveniment tratat într-ometodã implementatã de client. În cadrul acestei metode se apeleazã sayHello dinclasa proxy care invocã respectiva operaþie de pe server, returnîndu-se rezultatulde mai sus.

Page 205: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

205DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

Figura 8. Rezultatul invocãrii serviciului Webdintr-un client interactiv

Invocarea de servicii Web dezvoltate în C# de cãtre clienþi concepuþiîn alte limbaje de programare

Ne propunem în continuare sã demonstrãm inter-operabilitatea între serviciileWeb create sub Windows � folosind mediul .NET Framework � ºi diverºi clienþiimplementaþi în C#, Perl ºi PHP, rulând în Linux ºi/sau Windows.

Pentru început vom dezvolta în C# un serviciu Web folosit pentru validarea,conform unei scheme XML, a documentelor XML existente pe server.

Editarea codului-sursã ºi exploatarea serviciului se vor realiza prin intermediulaplicaþiei, disponibile gratuit, WebMatrix. Existã douã variante, una pentruversiunea 1.1 ºi cealaltã pentru 2.0. WebMatrix include ºi un miniserver Web,permiþând verificarea funcþionalitãþii serviciilor dezvoltate. De asemenea, sepoate utiliza Microsoft Visual Web Developer Express � mediu de dezvoltare dispo-nibil, de asemenea, gratuit (vezi figura 9).

Serviciul va expune douã metode:

� CheckIfExists � verificã existenþa documentului XML dorit a fi validat;� Validate � realizeazã validarea propriu-zisã.

Page 206: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB206

Figura 9. Crearea unui serviciu Web via ºablonuloferit de Microsoft Visual Web Developer Express

Aceste metode sunt implementate în cadrul clasei purtând numeleXMLValidator. Aceastã soluþie de implementare a fost realizatã pentru .NETFramework 1.1; în versiunea 2.0, în loc de XMLValidatingReader (consideratã demo-datã) se va recurge la XMLReader. Lãsãm cititorul sã realizeze aceasta ca exerciþiu.

<%@ WebService language="C#" class="XMLValidator" %>using System;using System.Web.Services;using System.Xml;using System.Xml.Serialization;using System.Xml.Schema;using System.IO;

// clasa care implementeazã serviciul Web[WebService(Namespace= "http://www.infoiasi.ro/XMLValidator")]

Page 207: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

207DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

public class XMLValidator { static private int validationMessages; static private string result;

// folosim explicit 'SOAP RPC encoding', // pentru fiecare metodã [SoapRpcMethod] // metoda Web care verificã exist. unui fiºier XML [WebMethod] public bool CheckIfExists (string filename) { return File.Exists (filename); } // metoda Web de validare a unui fiºier XML [SoapRpcMethod] [WebMethod] public string Validate (string filename) { // cititorul ºi validatorul de documente XML XmlTextReader tr = null; XmlValidatingReader vr = null; // iniþial, nici o eroare validationMessages = 0; result = ""; // încercãm sã procesam documentul XML try { // instanþiem cititorul de conþinut XML tr = new XmlTextReader (filename); // instanþiem validatorul XML vr = new XmlValidatingReader (tr); // tipul implicit de validare // foloseºte XML Schema vr.ValidationType = ValidationType.Schema; // setãm o metodã de semnalare a evenimentelor // generate de validatorul XML vr.ValidationEventHandler += new ValidationEventHandler (ValidationHandler); while ( vr.Read () ) ; // nu facem nimic, doar citim documentul XML } // final de "try" catch ( Exception e ) { // returnãm mesajul de excepþie return result + e.Message; } finally {

if ( tr != null ) tr.Close ();

if ( vr != null ) vr.Close ();

}

Page 208: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB208

// întoarcem succes sau numãrul de erori return (validationMessages == 0 ? "valid" : "invalid (" + validationMessages + ")"); } // metodã de tratare a erorilor de validare private static void ValidationHandler ( object sender, ValidationEventArgs args) { result += args.Severity + "(" + args.Message + "). "; validationMessages++; }}

Maniera de editare ºi compilare a codului C# este ilustratã în figura de mai jos.

Figura 10. Construirea ºi depanarea codului serviciului Web în cadrul mediului de dezvoltareMicrosoft Visual Web Developer Express

Page 209: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

209DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

Mediul .NET pune la dispoziþie ºi o modalitate de generare a descrieriiserviciului Web implementat, adicã de accesare a reprezentãrii WSDL asociate.Astfel, putem inspecta comod � cu ajutorul unui instrument precum WSDLSOAP Analyser, integrat în deja cunoscutul editor oXygen, menþionat anterior încadrul cãrþii de faþã � informaþiile privitoare la metodele ºi signaturile acestora (ase vedea figura 11).

Figura 11. Obþinerea informaþiilor privitoare la metodele expusede un serviciu Web

Rularea serviciului Web implementat în .NET poate fi realizatã atât în cadrulunui server Web precum IIS, cât ºi în serverul Web oferit de mediul de dezvoltare.

Page 210: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB210

Alte exemple privind dezvoltarea de servicii Web sub platforma .NET suntdisponibile ºi în volumul lui Sabin Buraga (coord.), Situri Web la cheie. Soluþiiprofesionale de implementare, Polirom, Iaºi, 2004.

2.2. Un client C# pentru serviciul creat

O implementare C# minimalã a unui client disponibil în linie de comandã,având rolul de invocare a serviciului Web descris mai sus, este urmãtoarea:

using System;class XMLValidatorClient { public static void Main(string[] args) { if (args.Length == 0) {

Console.WriteLine("Sintaxa: xml-validator-client <document.xml>");

return; } try { Console.Write("Documentul '{0}' este... ", args[0]); // creãm o instanþã a clasei corespunzãtoare // serviciului Web XMLValidator validator = new XMLValidator();

// invocãm metoda de verificare a existenþei // fiºierului la nivel de server if (validator.CheckIfExists(args[0])) { // existã, deci putem realiza validarea string valid = validator.Validate(args[0]); // afiºãm ceea ce a întors metoda invocatã Console.WriteLine(valid + "."); } else Console.WriteLine( "inaccesibil (nu existã pe server?)."); } // final de 'try' catch (Exception e) { // a apãrut o excepþie Console.WriteLine("\nExceptie: " + e.Message); return; } }}

Numele fiºierului XML dorit a fi validat este preluat de la linia de comandã,fiind regãsit în ºirul de caractere args[0].

Page 211: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

211DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

Pentru ca programul sã funcþioneze, va trebui generatã o clasã intermediarã(proxy), având rol de facilitare a dialogului dintre maºina localã ºi serverul pe careva fi rulat serviciul Web. Aceasta se realizeazã prin comanda urmãtoare, avândca rezultat generarea unui fiºier cu numele XMLValidator.cs, pe baza descrieriiWSDL a serviciul dezvoltat:

"c:\Program Files\Microsoft.NET\SDK\v1.1\Bin\wsdl.exe"http://localhost:8080/xml-validator.asmx?WSDL

Calea spre programul wsdl.exe (pus la dispoziþie de .NET Framework) poatediferi, trebuind sã fie ajustatã în funcþie de situaþia concretã. Pentru versiunea.NET 2.0, se înlocuieºte �v1.1� cu �v2.0�. În cazul nostru, am presupus cãserviciul Web va putea fi invocat pe maºina localhost, la portul 8080).

Clientul C# ce valideazã documentul via serviciul Web de mai sus va trebuicompilat printr-o linie de genul:

c:\Windows\Microsoft.NET\Framework\v1.1.4322\csc /t:exe /r:System.Web.dll,System.XML.dll,System.Web.Services.dllXMLValidator.cs xml-validator-client.cs

Interacþiunea dintre un client ºi un server Web, via clasa proxy generatã, esteprezentatã în figura 12.

Figura 12. Interacþiunea dintre un client, clasa proxy ºi serviciul Web

Page 212: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB212

Un posibil rezultat este ilustrat de captura-ecran urmãtoare, în care se observãºi descrierea WSDL generatã automat de .NET Framework pentru serviciul Webdezvoltat.

Figura 13. Rãspunsul afiºat de clientul care a invocat serviciul Web

2.3. Accesarea dintr-un script Perl a serviciului Webimplementat în .NET

De asemenea, putem realiza un client conceput în limbajul Perl, apelând lamodulul SOAP::Lite. Codul acestuia e similar celui descris mai sus, cu excepþiafaptului cã valoarea parametrului proxy a constructorului este o adresã de genulhttp://winxp.infoiasi.ro:8080/xml-validator.asmx, iar numele metodelor invocate suntcele ale serviciului .NET implementat.

Page 213: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

213DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

Liniile care prezintã interes în contextul de faþã sunt:

# ne conectãm la servermy $soap = SOAP::Lite ->uri('http://127.0.0.1/XMLValidator/') # URI-ul spaþiului de nume ->proxy( 'http://127.0.0.1:8080/xml-validator2.asmx') # locaþia serviciului ->on_action(sub { join('', @_) });

my @params = (SOAP::Data->name('filename', $ARGV[0]));print "Documentul $ARGV[0] este... ";# verificãm dacã fiºierul XML existã pe serverif ($soap->call("CheckIfExists" => @params)->result) { # ...ºi invocãm metoda de validare my $valid = $soap->call("Validate" => @params)->result; print $valid . ".\n";}else { print "inaccesibil (nu existã pe server?).\n";}

2.4. Invocarea din PHP a serviciului Web

Similar, clientul PHP se bazeazã pe biblioteca NuSOAP ºi foloseºte descriereaWSDL a serviciului. Instanþierea clientului SOAP în acest caz are forma:

// instanþierea clientului SOAP// pe baza descrierii serviciului Web$client = new soapclient( 'http://localhost:8080/xml-validator.asmx?WSDL', true);

Dacã apelãm CheckIfExists cu un nume de fiºier inexistent, vom obþine mesajesimilare celor din figura 14.

Page 214: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB214

Figura 14. Rezultatul obþinut la invocarea serviciului Webimplementat în C# via un client PHP

Folosind extensia SOAP inclusã în PHP 5, vom putea scrie urmãtorulcod-sursã:

$doc = $_REQUEST['xml'];try { $client = new SoapClient( 'http://127.0.0.1:8080/xml-validator2.asmx?WSDL', array('trace' => 1)); // $rez = $client->CheckIfExists ($doc); $rez = $client->__call('CheckIfExists', array($doc));

Page 215: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

215DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

echo 'Cererea efectuatã:<br /><pre class="cod">' . htmlspecialchars($client->__getLastRequest(), ENT_QUOTES) . '</pre>'; echo 'Rãspunsul obþinut:<br /><pre class="cod">' . htmlspecialchars($client->__getLastResponse(), ENT_QUOTES) . '</pre>'; if ($rez == true) {

$rez = $client->Validate ($doc); echo "<p>Documentul $doc este $rez.</p>";

} else { echo "<p>Documentul $doc e inaccesibil

(nu existã pe server?)</p>"; }} catch (SOAPFault $exception) { echo 'A apãrut o excepþie: ' . $exception->faultstring;}

Numele documentului dorit a fi validat poate fi furnizat prin GET în ºirul deinterogare. În invocarea serviciului Web ne folosim de fiºierul WSDL asociatacestuia. Astfel, o metodã poate fi apelatã direct, ca metodã a obiectului $client,instanþã a clasei SoapClient. Dupã cum am vãzut anterior, o apelare de �nivelscãzut� se poate efectua via metoda __call(). În exemplul de faþã am afiºat ºicererea ºi rãspunsul SOAP, aºa cum se remarcã în figura urmãtoare.

Page 216: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB216

Figura 15. Rezultatul obþinut la invocarea serviciului Webvia un client ce recurge la extensia Soap din PHP 5

2.5. Invocarea de servicii Web externe

Dacã pânã în momentul de faþã am scris diverºi clienþi care invocau metode aleunor servicii Web proprii, e timpul sã descriem modalitatea de a obþine rezultatedin partea unor servicii Web externe, dezvoltate de terþe organizaþii. Nu vom mai

Page 217: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

217DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

avea acces la codul-sursã al implementãrii, ci doar la interfaþa serviciului � oferitãde documentul WSDL ce-l descrie.

Figura 16. Consultarea metodei getAllServiceNames()a serviciului de interogare disponibil pe situl XMethods

Page 218: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB218

Accesarea serviciului de interogare oferit de XMethods

Unul dintre siturile care pun la dispoziþie diverse servicii Web publice esteXMethods � www.xmethods.net. Pentru a accesa lista serviciilor Web oferite, vominvoca prin SOAP una dintre metodele serviciului Web de interogare oferit deorganizaþia XMethods. Consultând documentul WSDL de la adresa http://www.xmethods.net/interfaces/query.wsdl, observãm cã putem folosi metodagetAllServicesName(), care furnizeazã numele ºi identificatorii universali unici aituturor serviciilor Web înregistrate. Recurgând la instrumentul WSDL SOAPAnalyser deja amintit în cadrul lucrãrii de faþã, obþinem informaþiile din figura 16.

Clientul care apeleazã aceastã metodã este scris în limbajul Perl ºi areurmãtorul cod-sursã (firesc, utilizãm modulul SOAP::Lite):

use SOAP::Lite;

@params = ( ); # nu existã parametri de intrare

# apelãm metoda serviciului Web$response = SOAP::Lite

->proxy("http://www.xmethods.net/interfaces/query")->uri("http://www.xmethods.net/interfaces/query")->call('getAllServiceNames' => @params);

# semnalãm erorile SOAP, dacã existãdie "Fault: " . $response->faultcode . " " . $response->faultdetail . " " . $response->faultstring if $response->faultcode;

# afiºãm o parte dintre serviciile Web întoarseforeach $r ($response->dataof ('//name')) { if ($r->value =~ /^Co/) { # numele începe cu 'Co' print $r->value . "\n"; }}Cererea va avea urmãtoarea formã:POST http://www.xmethods.net/interfaces/query HTTP/1.1Accept: text/xmlAccept: multipart/*Accept: application/soapContent-Length: 453Content-Type: text/xml; charset=utf-8SOAPAction: "http://www.xmethods.net/interfaces/ query#getAllServiceNames"

Page 219: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

219DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

<?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> <getAllServiceNames xmlns="http://www.xmethods.net/interfaces/query" xsi:nil="true" /></soap:Body></soap:Envelope>

Serverul va întoarce un mesaj precum urmãtorul (observaþi codificarea SOAPa rãspunsului):

HTTP/1.1 200 OKConnection: closeDate: Sat, 12 Aug 2006 09:41:16 GMTServer: Apache/1.3.26 (Unix) Enhydra-Director/3 PHP/4.0.6 DAV/1.0.3 AuthNuSphere/1.0.0Content-Length: 43538Content-Type: text/xml; charset=UTF-8Servlet-Engine: Enhydra Application Server/3.1.1b1 (JSP 1.1; Servlet 2.2; Java 1.4.2_03; Linux 2.4.7-10smp i386; java.vendor=Sun Microsystems Inc.)

<?xml version='1.0' encoding='UTF-8'?><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/' xmlns:soapenc= 'http://schemas.xmlsoap.org/soap/encoding/' xmlns:n4= 'http://www.xmethods.net/interfaces/query.xsd'><soap:Body soap:encodingStyle= 'http://schemas.xmlsoap.org/soap/encoding/' xmlns:soap= 'http://schemas.xmlsoap.org/soap/envelope/'><n:getAllServiceNamesResponse xmlns:n='http://www.xmethods.net/interfaces/query'><Result soapenc:arrayType='n4:IDNamePair[476]'>

Page 220: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB220

<i> <id>uuid:F73777F6-1113-7D28-BE46-2A5E2B8C0313</id> <name>Weather by City</name> </i> <!-- încã 475 de intrãri --></Result></n:getAllServiceNamesResponse></soap:Body></soap:Envelope>

Se returneazã un document XML conþinând codificarea unui tablou deperechi (id, name) pentru fiecare serviciu disponibil. Deoarece sunt foarte multeintrãri, programul nostru nu va afiºa decât numele serviciilor care încep cucaracterele �Co�. Rezultatul rulãrii este ilustrat în continuare:

(infoiasi)$ perl servicii-xmethods.plCountry Information WebServiceConversionsCountCheat Countdown ServiceCongress Member DirectoryCode39 Bar CodeColdFusion Tip-of-the-DayCountryWebservice

Pentru a obþine informaþii referitoare la un anumit serviciu, vom putearecurge la metoda getServiceDetail(), care are ca parametru de intrare identi-ficatorul serviciului respectiv ºi care furnizeazã un rãspuns având structura dinfigura 17.

Implementarea programului care apeleazã getServiceDetail() folosind Perl sauoricare alt limbaj de programare (lucrurile decurg similar cu cele menþionate maisus) o lãsãm ca exerciþiu pentru cititor.

Page 221: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

221DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

Figura 17. Structura arborelui corespunzãtor documentului XML privitor la informaþiiledespre un serviciu Web oferit de XMethods

Invocarea serviciilor puse la dispoziþie de Google

Motorul de cãutare Google pune la dispoziþie o serie de servicii Web care pot fiutilizate în cadrul aplicaþiilor noastre via SOAP. Vom exemplifica mai jos cumse poate folosi un serviciu de cãutare ºi unul de verificare gramaticalã (spellchecking) dintr-o aplicaþie scrisã în Visual Basic .NET (adaptare dupã tutorialeledisponibile pe Web).

Primul pas este cel de creare a unui cont la Google ºi obþinerea unei chei cuajutorul cãreia se pot realiza maxim o mie de interogãri pe zi � detalii la http://www.google.com/apis/.

Urmãtoarea etapã presupune crearea unui proiect de tip Windows Applicationîn cadrul mediului de dezvoltare Visual Studio .NET. Vom adãuga o referinþã la

Page 222: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB222

serviciul oferit de Google, astfel încât sã avem acces la acesta (vezi figura 18, încare se pot remarca ºi metodele ce pot fi folosite).

Figura 18. Adãugarea unei referinþe Web spre serviciul Google(se foloseºte un document WSDL indicat de un URI)

Dupã introducerea URI-ului http://api.google.com/GoogleSearch.wsdl, apãsaþi butonul Add Reference, caredeterminã adãugarea acestei referinþe Web la proiec-tul nostru. În fereastra Solution Explorer, referinþa vafi redenumitã drept Google; a se urmãri figura alã-turatã.

Vom crea o interfaþã care va solicita de la uti-lizator un text folosit ca expresie de cãutare, serviciulGoogle returnând numãrul de rezultate (pagini Web)

gãsite. De asemenea, utilizatorul va putea introduce un ºir de caractere scris înlimba englezã, iar Google � via metoda doSpellingSuggestion() � va furniza termenulcorect în urma realizãrii operaþiei de spell checking.

Invocarea primei metode � adicã doGoogleSearch() � va avea loc la apãsareabutonului etichetat Numãrã pag. gãsite, conform codului de mai jos:

Page 223: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

223DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

Private Sub btn_Search_Click ( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NrPag.Click ' Cheia de licenþiere obþinutã de la Google Dim MyLicenseKey As String ' Instanþierea serviciului de cãutare Dim MyService As Google.GoogleSearchService = New _ Google.GoogleSearchService() ' Rezultatul obþinut în urma invocãrii Dim MyResult As Google.GoogleSearchResult MyLicenseKey = "mT2Mpq9QFHLchbCY2F6WYAvEY39I7mDO" ' Invocãm metoda MyResult = MyService.doGoogleSearch(MyLicenseKey, _ ExpresiaCautata.Text, 0, 1, False, "", _ False, "", "", "") ' Obþinem nr. de rezultate NrRez.Text = "Numarul de rezultate gãsite este:" & _ CStr(MyResult.estimatedTotalResultsCount)End Sub

Liniile responsabile cu apelarea celei de-a doua metode la apãsarea butonuluiSpell checking sunt urmãtoarele:

Private Sub btn_SpellChecking_Click ( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Spelling.Click Dim MyLicenseKey As String Dim MyService As Google.GoogleSearchService = New _ Google.GoogleSearchService() Dim MyResult As String MyLicenseKey = "mT2Mpq9QFHLchbCY2F6WYAvEY39I7mDO" MyResult = MyService.doSpellingSuggestion (MyLicenseKey, TextulDeVerificat.Text) TextCorect.Text = "Google afirmã cã e corect: " & _ MyResultEnd Sub

Un rezultat posibil e ilustrat de figura 19, în care se pot observa atâtrezultatele obþinute printr-o interogare manualã a motorului Google, cât ºi celeîntoarse de serviciul Web pus la dispoziþie.

Page 224: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB224

Figura 19. Rezultatele obþinute via serviciul Web oferit de Google

Observãm, aºadar, cu câtã uºurinþã se pot încorpora serviciile Web oferite deGoogle (precum cel de cãutare sau cel privitor la informaþii topografice � viaGoogle Maps), în aplicaþiile noastre. Utilitatea acestora poate fi foarte mare încrearea de aplicaþii informative sau de divertisment, care pot utiliza diverseresurse disponibile pe Web. De asemenea, serviciul de spell checking se poateintegra în cadrul altor programe sau aplicaþii Web. Alte utilizãri sunt celeprivitoare la implementarea unor modalitãþi de cãutare pe Web din linia decomandã sau widget-uri grafice, ori realizarea de statistici privind informaþiiledespre un anumit subiect de-a lungul timpului.

2.6. Folosirea instrumentului gSOAP pentru C/C++

Suita de unelte gSOAP are drept scop simplificarea dezvoltãrii de servicii Webprin SOAP ºi de implementare de clienþi pentru invocarea acestora în limbajeleC ºi C++. Se pune la dispoziþie un compilator cu rolul de generare a codului-sursãC/C++, pe baza unui fiºier antet. De asemenea, avem la dispoziþie ºi o bibliotecãde clase, plus diverse rutine menite sã codifice tipurile de date native C++ înXML. Suplimentar, gSOAP furnizeazã ºi un mecanism de garbage collection. Modelulde dezvoltare a serviciilor Web adoptat de gSOAP este cel clasic, bazat peparadigma RPC.

Page 225: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

225DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

Argumentul cã gSOAP este un instrument matur este dat de faptul cã IBMfoloseºte gSOAP pentru dezvoltarea de servicii Web destinate dispozitivelormobile (probabil, datoritã necesitãþii de utilizare minimã a memoriei ºi a uneiviteze mari de procesare), iar proiectul european GridLab l-a adoptat pentruconstruirea de servicii destinate sistemelor de tip grid (detalii ºi în capitolul 7). Înacest moment, gSOAP este dezvoltat în cadrul Source Forge, pornindu-se de laversiunea iniþialã oferitã de Universitatea din Florida.

Documentaþiile necesare ºi o suitã de exemple sunt disponibile în cadruldistribuþiei open source a pachetului gSOAP.

Vom detalia, ca exemplificare, maniera de dezvoltare a unui serviciu Webcare, primind un numãr, va verifica dacã acesta este prim. Vom crea trei fiºiere:

� nrprim.h, fiºier antet cu informaþii privind funcþiile RPC ce urmeazã a fiinvocate;

� nrprimserver.c, reprezentând codul serverului;� nrprimclient.c, reprezentând programul client.

Ca ºi în situaþiile de mai sus, vom asocia un spaþiu de nume XML serviciuluiWeb dezvoltat. În fiºierul antet se va face corespondenþa între spaþiul de numestabilit ºi prototipurile fiecãreia dintre funcþiile serviciului Web implementat.Codul acestui fiºier antet este urmãtorul:

//numele serviciului: nrprim//stilul de vehiculare a mesajelor: rpc//spaþiul de nume: http://localhost/nrprim.wsdl//URI-ul serviciului: http://localhost/nrprimserver.cgi/* funcþia oferitã de serviciul Web */int ns__nrprim (double numar, double *rezultat);

În cazul gSOAP, se foloseºte convenþia urmãtoare: toþi parametrii funcþiilorsunt consideraþi parametri de intrare, cu excepþia ultimului (care va conþinerezultatul). De asemenea, valoarea întoarsã este întotdeauna int, putând fi folositãpentru diagnosticarea eventualelor erori survenite.

Furnizãm mai jos codul C al serverului:

#include "soapH.h"#include "nrprim.nsmap"

int main(int argc, char **argv) { int m, s; /* descriptori de socket */ struct soap soap; /* include mesajele SOAP */ soap_init(&soap); /* iniþializãm... */

Page 226: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB226

if (argc < 2) /* oferim servicii ca un CGI */ soap_serve(&soap); else { /* ataºãm serverul la un port specificat în linia de comandã (argv[1]) */ m = soap_bind(&soap, NULL, atoi(argv[1]), 100); if (m < 0) { /* afiºãm eroarea survenitã */ soap_print_fault(&soap, stderr); exit(-1); } fprintf(stderr, "Conexiune reuºitã.\n"); while (1) { // acceptãm cereri din partea clienþilor 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;}

/* funcþia invocatã la apariþia cererii din partea unui client */int ns__nrprim (struct soap *soap, double numar, double *rezultat) { int contor = 2; int temp = (int) numar; while (contor < temp) { /* verif. dacã e prim */ if (temp % contor != 0) contor++; else { *rezultat = 0; break; } } if (contor == temp) *rezultat = 1; return SOAP_OK;}

Page 227: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

227DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

Mai trebuie sã descriem codul-sursã al clientului:

#include "soapH.h"#include "nrprim.nsmap"

/* URI-ul serviciului */const char server[] = "http://127.0.0.1/cgi-bin/nrprimserver.cgi";

int main(int argc, char **argv) { struct soap soap; double numar; /* numãrul solicitat */ double rezultat; /* rezultatul primit */ if (argc < 2) { fprintf(stderr, "Introduceþi un numãr.\n"); exit(0); } soap_init(&soap); /* iniþializare... */ numar = atoi(argv[1]); /* invocãm funcþia via SOAP */ soap_call_ns__nrprim (&soap, server, "", numar, &rezultat); /* verificãm dacã au apãrut erori */ if (soap.error) { soap_print_fault (&soap, stderr); exit(1); } else { if (rezultat == 0) printf("Aþi dat un numãr care nu este prim\n"); else printf("Aþi dat un numãr prim\n"); } /* finalizãm dialogul cu serverul */ soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return 0;}

Pentru a facilita compilarea diferitelor servicii Web, distribuþia gSOAP pune ladispoziþie un fiºier Makefile pe care puteþi sã-l ajustaþi dupã dorinþã. În fiºierulMakefile folosit de noi, se apeleazã compilatorul gSOAP RPC, numit soapcpp2, înmaniera urmãtoare (opþiunea �c este folositã pentru a se obþine diverselefiºiere-sursã necesare):

(infoiasi)$ ./soapcpp2 -c nrprim.h

Page 228: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB228

Similar manierei de dezvoltare a aplicaþiilor RPC clasice, vor rezulta o seriede fiºiere: soapStub.h, soapH.h, soapC.c, soapClient.c, soapServer.c etc.

În acest moment, codul va fi compilat ºi legat folosindu-se stdsoap2.c (respectiv,stdsoap2.cpp pentru C++ în loc de C). Eventual, executabilul rezultat va putea fiapoi instalat ca un script CGI.

Sã urmãrim în figura de mai jos testarea funcþionãrii serviciului:

Figura 20. Rularea programului-client dezvoltat cu gSOAP

2.7. Implementarea serviciilor Web în Java

Instrumentul Apache Axis2

Apache Axis îºi are originea în Apache SOAP, prima soluþie, bazatã pe SOAP 1.1,oferitã de fundaþia Apache pentru conceperea de servicii Web. Limbajele deprogramare care pot fi folosite sunt C++ ºi Java.

Cel mai recent efort, numit Axis2, reproiecteazã arhitectura Axis/Java ºiAxis/C++, procesarea realizându-se în stilul stateless (aceasta permite codului sãfie rulat în paralel, de fire de execuþie separate). De asemenea, se oferã ºi unmodel informaþional (information model) persistent, sistemul putând fi repornitfãrã pierderi de date. Arhitectura internã a Apache Axis2 este una modularã,

Page 229: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

229DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

constând din diverse componente, precum modulul de procesare XML (bazat peApache Xerces), procesorul de mesaje SOAP, modulul de exploatare a serviciilor(deployment), generatorul de documente WSDL, interfaþa de programare a clienþilorSOAP ºi modulul de transport al datelor.

Suplimentar, Apache Axis2 permite includerea de servicii Web �din zbor�,astfel încât servicii Web noi sã poatã fi rulate fãrã întreruperea execuþieisistemului. De asemenea, se pot realiza actualizãri (modificãri) ale unui serviciudeja existent, fãrã a opri sistemul (desigur, eventualele schimbãri produse potconduce la pierderea de informaþii).

Pentru a putea scrie o aplicaþie în Java folosind Axis2 aveþi nevoie deurmãtoarele componente software:

� Apache Geronimo � exemplele furnizate mai jos au fost rulate pe acest server,pe baza cãruia este construit ºi IBM WebSphere Community Edition. Desigur,puteþi recurge ºi la un alt server. Pentru a prelua Geronimo, vizitaþi adresahttp://geronimo.apache.org/downloads.html.

� Apache Axis2 (ori o altã implementare SOAP). Instrumentele puse la dispoziþiereduc timpul de dezvoltare a codului. Puteþi obþine Apache Axis2 de la adresahttp://ws.apache.org/axis2/download.cgi (remarcãm faptul cã distribuþia .war estefolositã pentru dezvoltarea de servicii Web, iar cea binarã vã ajutã la creareaclienþilor);

� Java 2 Standard Edition începând cu versiunea 1.4.

Pornind de la premisa cã uneori instalarea diferitelor instrumente �costã� maimult timp decât dezvoltarea propriu-zisã a aplicaþiei (deºi nu este cazul aici),vom prezenta în continuare paºii necesari realizãrii unui serviciu Web în Java,folosind componentele software enumerate mai sus.

Dupã ce aþi transferat Geronimo, trebuie doar sã dezarhivaþi serverul în oricaredirector doriþi (pentru prevenirea eventualelor probleme, evitaþi instalarea � încazul Windows � în directoarele Program Files sau Documents and Settings). Pentruexemplele urmãtoare, presupunem serverul Geronimo stocat în directorulc:\geronimo.

Puteþi apoi porni serverul, fie din linia de comandã, fie rulând fiºierulstartup.bat. În primul caz, introduceþi de la prompt-ul sistemului liniile:

cd \geronimo\binjava -jar server.jar

Testaþi rularea serverului, introducând adresa http://localhost:8080 în browser-ulpreferat. În caz de succes, veþi obþine informaþiile din figura de mai jos.

Page 230: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB230

Figura 21. Testarea rulãrii serverului Geronimo

Urmãtoarea etapã este instalarea instrumentului Apache Axis2. Folosiþi consolade administrare Geronimo (numele de utilizator ºi parola în mod implicit sunt�system�, respectiv �manager�) ºi selectaþi opþiunea Deploy New. Testaþi desfãºurareacu succes a operaþiunii, prin vizitarea adresei http://localhost:8080/axis2/.

Din acest moment putem crea propriul nostru serviciu Web. Indiferent cetehnologii folosiþi, existã douã abordari de dezvoltare: fie pornind de la docu-mentul WSDL ce descrie interfaþa serviciului (contract first approach), fie scriindcodul-sursã al implementãrii (code first approach). Prima metodã presupune bunacunoaºtere a specificaþiilor WSDL (a se revedea capitolul 3).

Mai simplu este sã concepem o clasã Java ºi apoi sã o transformãm în serviciuWeb. În abordarea Axis2, dupã scrierea codului clasei mai urmeazã sã precizãmaºa-numitul descriptor al serviciului, memorat în fiºierul services.xml, ºi sã creãmo arhivã de exploatare a aplicaþiei.

Ne propunem sã realizãm un serviciu simplu de salutare a utilizatorului:

import org.apache.axis2.context.ServiceContext;import org.apache.axis2.context.OperationContext;public class HelloJavaSoap { public String echoJavaSoap(String param) { return "Echooo... " + param; }}

Page 231: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

231DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

Am scris o clasã Java cu o singurã metodã publicã. Aceastã metodã primeºteun parametru de tip string ºi întoarce valoarea parametrului prefixatã de un text.

Urmeazã sã creãm documentul services.xml care indicã mediului cum sãconfigureze ºi sã expunã posibililor clienþi serviciul Web în cauzã:

<service name="HelloJavaSoap"> <description> Primul serviciu Web folosind Axis2 </description> <parameter name="ServiceClass" locked="false"> HelloJavaSoap </parameter> <operation name="echoJavaSoap"> <messageReceiver class= "org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> </operation></service>

Pentru a stabili corespondenþa între serviciu ºi clasa Java care îl imple-menteazã, am adãugat un atribut cu numele ServiceClass, a cãrui valoare reprezintãcalea spre locaþia unde se aflã memoratã implementarea. Elementul operationspecificã faptul cã metoda oferitã de serviciul Web este echoJavaSoap, mesajelefiind recepþionate via clasa pusã la dispoziþie de Apache Axis2. Dupã cum sepoate observa, se recurge la un transfer în stilul RPC.

Urmãtorul pas este sã creãm o arhivã cu extensia .aar (Axis2 Archive) careinclude codul compilat (fiºierul .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

Mai urmeazã sã încãrcãm serviciul prin interfaþa de administrare disponibilãla http://localhost:8080/axis2/axis2-admin/, selectând opþiunea Upload Service (urmã-riþi figura 22).

Page 232: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB232

Figura 22. Încãrcarea serviciului Web în vederea invocãrii ulterioare

Dupã aceasta, daþi clic pe legãtura Available Services pentru a obþine mesajeledin captura-ecran urmãtoare:

Figura 23. Lista serviciilor disponibile (aici, serviciul Web HelloJavaSoap)

Page 233: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

233DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

În cadrul distribuþiei Axis2, sunt disponibile o serie de exemple pe care lerecomandãm spre studiu. Ne oprim asupra unui program, numit DynamicInvoker,care reprezintã un client Java pentru invocarea serviciilor Web (cel anterior,serviciile Web externe prezentate în secþiunea 2.5 etc.) pe baza documentuluiWSDL asociat.

Pentru rularea acestui program, trebuie sã stabilim valoarea corespunzãtoarepentru variabila de mediu CLASSPATH, astfel încât sã cuprindã locaþia unuiprocesor XML (e.g., Apache Xerces) ºi toate fiºierele .jar din directorul lib. Dupãcompilarea codului, îl rulãm astfel:

java samples.client.DynamicInvoker http://localhost:8080/axis2/services/HelloJavaSoap?wsdl echoJavaSoap "avemportocale albastre!"

Vom obþine urmãtorul rãspuns (am omis anumite mesaje de avertismentprivitoare la lipsa suportului pentru jurnalizare log4j):

Reading WSDL document from 'http://localhost:8080/axis2/services/HelloJavaSoap?wsdl'Preparing Axis dynamic invocationExecuting operation echoJavaSoap with parameters:>echoJavaSoap>param0=avem portocale albastre!>echoJavaSoapResponse>return=Echooo... avem portocalealbastre!

Done!

Din cele prezentate mai sus, putem considera cã mediul Axis2 oferã unmecanism flexibil ºi rapid de dezvoltare a serviciilor Web. Ca alternative,menþionãm JWSDP (Java Web Services Developer Pack) pus la dispoziþie de companiaSun ºi noua versiune J2SE 1.6, care include suport nativ pentru crearea ºiinvocarea de servicii Web.

Importarea serviciilor Web în Java

Pe baza documentului WSDL ce descrie serviciul implementat în C# (a serevedea secþiunea 2.1), vom putea realiza aºa-numita importare a interfeþei lui înlimbajul Java. Aceastã acþiune poate fi realizatã uºor, graþie instrumentuluiwsimport pus la dispoziþie de Java 2 Standard Edition � versiunea 1.6 (la momentulscrierii acestei cãrþi, am folosit varianta J2SE 1.6 beta 2). Rulându-l cu urmãtoriiparametri daþi în linia de comandã, vom obþine în cadrul directorului xmlcodul-sursã Java al pachetului ro.infoiasi.xmlvalidator ce desemneazã interfaþaserviciului:

Page 234: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB234

c:\jdk1.6.0\bin>wsimport http://localhost:8080/xml-validator.asmx?WSDL -s .\xml -verbosero\infoiasi\xmlvalidator\CheckIfExists.javaro\infoiasi\xmlvalidator\CheckIfExistsResponse.javaro\infoiasi\xmlvalidator\ObjectFactory.javaro\infoiasi\xmlvalidator\Validate.javaro\infoiasi\xmlvalidator\ValidateResponse.javaro\infoiasi\xmlvalidator\XMLValidator.javaro\infoiasi\xmlvalidator\XMLValidatorSoap.javaro\infoiasi\xmlvalidator\package-info.java

Fiºierul XMLValidatorSoap.java conþine definiþiile metodelor � accesate viaSOAP � expuse de serviciul Web ºi are urmãtorul cod generat automat (din care,de altfel, se poate deduce ºi maniera de dezvoltare a serviciilor Web în J2SE 1.6):

package ro.infoiasi.xmlvalidator;import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebResult;import javax.jws.WebService;import javax.xml.ws.RequestWrapper;import javax.xml.ws.ResponseWrapper;

// Numele ºi spaþiul de nume al serviciului Web@WebService(name = "XMLValidatorSoap", targetNamespace = "http://www.infoiasi.ro/XMLValidator")public interface XMLValidatorSoap { // metoda care verificã existenþa fiºierului @WebMethod(operationName = "CheckIfExists", action = "http://www.infoiasi.ro/XMLValidator/CheckIfExists") @WebResult(name = "CheckIfExistsResult", targetNamespace = "http://www.infoiasi.ro/XMLValidator") // desemneazã clasa responsabilã cu încapsularea // cererii SOAP @RequestWrapper(localName = "CheckIfExists", targetNamespace = "http://www.infoiasi.ro/XMLValidator", className = "ro.infoiasi.xmlvalidator.CheckIfExists") // desemneazã clasa responsabilã cu încapsularea // rãspunsului SOAP @ResponseWrapper(localName = "CheckIfExistsResponse", targetNamespace = "http://www.infoiasi.ro/XMLValidator", className = "ro.infoiasi.xmlvalidator.CheckIfExistsResponse")

Page 235: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

235DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

public boolean checkIfExists( // meta-date pentru parametrul de intrare @WebParam(name = "filename", targetNamespace = "http://www.infoiasi.ro/XMLValidator") String filename); /* similar ºi pentru a doua metodã */}

Adnotãrile asociate serviciului Web sunt generate conform documentuluiWSDL ºi sunt disponibile în fiºierul XMLValidator.java:

@WebServiceClient(name = "XMLValidator", targetNamespace = "http://www.infoiasi.ro/XMLValidator", wsdlLocation = "http://localhost:8080/xml-validator.asmx?WSDL")public class XMLValidator extends Service { private final static URL XMLVALIDATOR_WSDL_LOCATION; static { URL url = null; // adresa documentului WSDL try { url = new URL( "http://localhost:8080/xml-validator.asmx?WSDL"); } catch (MalformedURLException e) { e.printStackTrace(); } XMLVALIDATOR_WSDL_LOCATION = url; } public XMLValidator(URL wsdlLocation, QName serviceName) { super(wsdlLocation, serviceName); } public XMLValidator() { super(XMLVALIDATOR_WSDL_LOCATION, new QName("http://www.infoiasi.ro/XMLValidator", "XMLValidator")); } // se defineºte punctul terminal al serviciului // (întoarce un obiect XMLValidatorSoap, // a cãrui clasã a fost datã mai sus) @WebEndpoint(name = "XMLValidatorSoap") public XMLValidatorSoap getXMLValidatorSoap() { return (XMLValidatorSoap)super.getPort(new QName("http://www.infoiasi.ro/XMLValidator", "XMLValidatorSoap"), XMLValidatorSoap.class); }}

Page 236: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB236

Se remarcã existenþa pachetului javax.xml.ws disponibil începând cu J2SE 1.6ºi J2EE 1.5, care oferã suportul necesar dezvoltãrii facile ºi invocãrii de serviciiWeb atât prin SOAP, cât ºi recurgând la paradigma REST. Acest pachet formeazãJAX-WS, interfaþa de programare de bazã a serviciilor Web.

Conform JAX-WS, un serviciu Web în rulare reprezintã o instanþã (obiect) aunei clase Java, adnotat prin javax.jws.WebService. Interfaþa expusã cãtre posibiliiclienþi este o interfaþã Java privitoare la punctul terminal al serviciului (SEI �Service Endpoint Inter face), care nu trebuie neapãrat specificatã de programator,deoarece ea poate fi suplinitã de clasa care implementeazã serviciul. Dupãscrierea codului ºi realizarea compilãrii, va putea fi creat un fiºier .war care va fiexploatat în cadrul unui server de aplicaþii precum Tomcat. În timpul invocãrii,serverul de aplicaþii va genera automat clasele responsabile cu schimbul demesaje cu posibilii clienþi.

Similar manierei folosite la .NET, cel mai simplu serviciu Web (de salutare autilizatorului) are codul urmãtor:

package salut;

import javax.jws.WebMethod;import javax.jws.WebService;

@WebService()public class Salut { // clasã implementând serviciul private String mesaj = new String("Salut, ");

// o singurã metodã @WebMethod() public String sayHello (String nume) { return mesaj + nume; }}

Corespunzãtor, clientul Java care invocã metoda de mai sus este compus dinurmãtoarele 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;

Page 237: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

237DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

public static void main(String[] args) { try { ClientSalut client = new ClientSalut(); client.invoca(args); }

catch(Exception e) { e.printStackTrace(); } } // încearcã sã invoce serviciul public void invoca(String[] args) { try { System.out.println("Vom invoca " + serviciu); Salut port = serviciu.getHelloPort(); String nume; // preluãm numele din linia de comandã nume = (args.length > 0) ? args[0] : "Portocal Escu"; String raspuns = port.sayHello(nume); System.out.println(raspuns); } catch(Exception e) { e.printStackTrace(); } }}

2.8. Suportul oferit de mediul Delphi pentru creareaºi utilizarea serviciilor Web

Dezvoltarea serviciului

La finalul acestui subcapitol vom prezenta maniera de implementare în Delphi(Object Pascal) a unui serviciu Web simplu. Codul-sursã a fost testat sub Delphi6 Enterprise Edition, care oferã suport pentru SOAP 1.1.

Pentru crearea serviciului Web, avem la dispoziþie un asistent (wizard) pecare-l putem apela prin intermediul operaþiei Other a opþiunii New din cadrulmeniului File. Selectând tab-ul WebServices, vom da clic pe Soap Server Application.A se urmãri figura de mai jos.

Page 238: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB238

Figura 24. Apelarea asistentului de crearea unui serviciu Web

Va apãrea o fereastrã în care trebuie sã alegem tipul de aplicaþie ce va figeneratã (vezi figura 25). Vom opta pentru realizarea unui executabil CGI careva putea fi uºor exploatat ulterior în cadrul serverului Apache. Drept alternative,ni se oferã posibilitatea sã implementãm serviciul ca modul Apache ori ca obibliotecã dinamicã executatã în cadrul unui server precum IIS.

Figura 25. Alegerea tipului de aplicaþie Webcare va încapsula serviciul dezvoltat

Page 239: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

239DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

Mediul Delphi va genera un unit, pecare-l vom salva sub denumireaSWebMod.pas, care va îngloba trei com-ponente:

� HTTPSoapDispatcher1 � dispecerulSOAP peste HTTP, responsabil cupreluarea cererilor ºi trimiterea rãs-punsului;

� HTTPSoapPascalInvoker1 � clasa respon-sabilã cu (de)serializarea mesajelorSOAP în obiecte Pascal;

� WSDLHTMLPublish1 � clasa care gene-reazã descrierea WSDL a serviciului.

Acest modul Web are structura ilustratã de figura alãturatã, iar codul lui sursãeste furnizat în continuare:

unit SWebMod;

interfaceuses SysUtils, Classes, HTTPApp, WSDLPub, SOAPPasInv, SOAPHTTPPasInv, SoapHTTPDisp, WebBrokerSOAP;type { clasa responsabilã cu publicarea serviciului } TSalutWebModule = class(TWebModule) { dispecerul SOAP peste HTTP } HTTPSoapDispatcher1: THTTPSoapDispatcher; { clasa responsabilã cu (de)serializarea mesajelor SOAP în obiecte Pascal } HTTPSoapPascalInvoker1: THTTPSoapPascalInvoker; { clasa care genereazã doc. WSDL al serviciului } WSDLHTMLPublish1: TWSDLHTMLPublish; end;

var SalutWebModule: TSalutWebModule;

implementation{$R *.DFM}end.

Page 240: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB240

Mai urmeazã sã scriem o clasã care va implementa efectiv serviciul Web dorit.Vom crea astfel unit-ul salut.pas, al cãrui cod este urmãtorul:

unit salut;

interfaceuses InvokeRegistry;type { o interfaþã invocabilã } ISalut = interface(IInvokable) ['{D7532EC7-EA7F-4610-ADE5-B3634BB0F343}'] function Salut: String; stdcall; function NumaraZile: Byte; stdcall; end; { o clasã implementând interfaþa } TSalut = class (TInvokableClass, ISalut) public { metodele expuse de serviciul Web } function Salut: String; stdcall; function NumaraZile: Byte; stdcall; end;

implementationuses 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 interfeþei ºi clasei } InvRegistry.RegisterInterface(TypeInfo(ISalut)); InvRegistry.RegisterInvokableClass(TSalut);end.

Dupã cum se observã, specificãm pentru început o interfaþã invocabilã, avânddouã metode ce vor fi expuse de cãtre serviciul Web de faþã. Acestei interfeþe ise asociazã un identificator universal unic, în maniera componentelor COM. Deasemenea, oferim ºi o implementare via o clasã invocabilã. Sunt definite douã

Page 241: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

241DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

funcþii, una care întoarce un mesaj (ºir de caractere) de salut, cealaltã oferindnumãrul de zile (un întreg de tip Byte) rãmase din momentul execuþiei pânã lafinalul anului 2006.

Cele douã unit-uri le includem în proiectul cu numele SalutWS.dpr ºi generãmfiºierul executabil. Pentru a putea fi efectiv utilizat, acesta din urmã trebuieplasat în directorul htdocs al serverului Apache pentru Windows (în cazul nostru,folosim distribuþia Apache2Triad). Mai trebuie sã configurãm serverul sã tratezefiºierele executabile (cele cu extensia .exe) ca programe CGI. Pentru aceasta vomedita fiºierul httpd.conf (localizat în directorul conf al serverului), inserând însecþiunea <IfModule mod_cgi.c>...</IfModule> liniile de mai jos:

AddHandler cgi-script .exeAddType application/x-httpd-cgi .exe

Putem testa funcþionalitatea serviciului folosind adresa http://localhost/SalutWS.exe/wsdl/ISalut într-un browser Web. Va trebuie sã obþinem fiºierul WSDL generatautomat de program (avizãm cititorul cã formatul WSDL nu respectã standardeleîn vigoare, ci o versiune mai veche a specificaþiei, actualmente consideratãdemodatã).

Un client Delphi pentru serviciul implementat

În continuare, vom detalia maniera de exploa-tare a serviciului printr-un client Delphi. Vomcrea un form pe care vom plasa un buton deexecuþie, la apãsarea cãruia sã se invoce metodaNumaraZile a serviciului de mai sus. De ase-menea, din tab-ul WebServices al barei de compo-nente (Component Palette), vom alege componentaHTTPRIO, responsabilã cu transferurile dedate aflate la distanþã via HTTP. În fereastraObject Inspector, va trebui sã editãm valorileurmãtoarelor proprietãþi asociate componenteiamintite (a se urmãri cele din figura alãturatã):

� WSDLLocation � reprezintã locaþia fiºieruluiWSDL asociat serviciului (putem introduceURL-ul http://localhost/SalutWS.exe/wsdl/ISalut);

� Service � desemneazã numele serviciului(mediul genereazã o listã de opþiuni pe

Page 242: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB242

baza locaþiei WSDL de mai sus, astfel încât vom selecta pentru situaþia de faþãunica intrare ISalutservice);

� Port � reprezintã punctul terminal al serviciului (ca ºi mai sus, din listageneratã, 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 dispoziþie deserviciu. Asistentul va solicita adresa Web ori numele de fiºier local al docu-mentului WSDL corespunzãtor serviciului importat. La apãsarea butonuluiGenerate va fi creat un unit, pe care-l denumim SalutImport.pas. Codul-sursã alacestuia este urmãtorul:

unit SalutImport;

interfaceuses Types, XSBuiltIns;type { interfaþa invocabilã } ISalut = interface(IInvokable) ['{AE775C10-3E55-41C4-8494-2A57E658F959}'] function Salut: WideString; stdcall; function NumaraZile: Byte; stdcall; end;

implementationuses InvokeRegistry;initialization { înregistrarea interfeþei } InvRegistry.RegisterInterface(TypeInfo(ISalut), 'urn:salut-ISalut', '');end.

Mai urmeazã sã scriem liniile care realizeazã efectiv invocarea, folosindu-nede interfaþa ISalut:

unit SalutClient;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Rio, SoapHTTPClient, StdCtrls;type { fereastra de dialog } TFormClient = class(TForm)

Page 243: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

243DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

buton: TButton; HTTPRIO: THTTPRIO; procedure butonClick(Sender: TObject); end;var FormClient: TFormClient;implementation{$R *.dfm}uses SalutImport;

{ procedura de tratare a apãsãrii butonului }procedure TFormClient.butonClick(Sender: TObject);var Salut: ISalut;begin try Salut := (HTTPRIO as ISalut); { afiºãm rezultatul primit de la metoda serviciului Web invocat } MessageDlg('Au mai rãmas ' + IntToStr(Salut.NumaraZile) + ' de zile.', mtInformation, [mbOk], 0); except on E: Exception do { tratãm erorile } MessageDlg('A apãrut o eroare:' + E.Message, mtError, [mbAbort], 0); end;end;end.

Dupã compilare, vom putea testa programul aºa cum se poate remarca dincaptura-ecran de mai jos:

Figura 25. Interfaþa-utilizator a clientului de invocare a serviciului Web

Page 244: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB244

Invocarea din PHP a serviciului implementat în Delphi

La finalul acestei secþiuni vom concepe un program PHP care va recurge laextensia Soap pentru apelarea metodelor serviciului de mai sus. Ca ºi în exempleleanterioare, codul-sursã este simplu:

$client = new SoapClient(null, array('location' => 'http://localhost/SalutWS.exe/soap/ISalut', 'uri' => 'urn:salut-ISalut')); $rez = $client->__call('Salut', array()); echo "<p>Am primit mesajul: <strong>$rez</strong></p>"; $zile = $client->__call('NumaraZile', array()); echo "<p>Au mai rãmas $zile de zile pânã la finalul anului.</p>";

Dupã cum se remarcã, serviciul Web este disponibil la adresa http://localhost/SalutWS.exe/soap/ISalut, spaþiul de nume fiind automat generat de mediul Delphi.

Un posibil rezultat poate fi urmãrit în figura 26.

Figura 26. Rezultatul obþinut dupã execuþia metodelor serviciului Web

Page 245: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

245DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

3. Invocarea serviciilor Web în contextul AJAX

3.1. Punerea problemei

Având la dispoziþie serviciul Web privitor la operaþii cu fiºiere (prezentat anteriorîn cadrul acestui capitol), am dori sã verificãm în mod asincron existenþa unuifiºier, pe baza numelui furnizat de utilizator via un formular electronic. GraþieAJAX (Asynchronous JavaScript And XML), aceasta se poate realiza fãrã a reîncãrcaîntreaga paginã Web. Pe baza unor date preluate de pe servere aflate la distanþã,se poate reactualiza în manierã dinamicã arborele DOM (Document Object Model)asociat documentului XHTML redat de programul de navigare.

Dupã o succintã prezentare a suitei de tehnologii AJAX, vom furniza detaliilede implementare a unui script PHP care va reprezenta puntea de legãturã întredocumentul Web încãrcat în browser ºi serviciul Web scris în Perl.

3.2. Caracteristici importante ale suitei de tehnologii AJAX

Componente

Termenul AJAX desemneazã o suitã de tehnologii deschise, încorporând urmã-toarele:

� diverse limbaje standardizate de prezentare a datelor, precum XHTML ºi CSS(Cascading Style Sheets);

� redarea ºi interacþiunea via standardul DOM;� interschimbul ºi manipularea de date prin XML ºi/sau XSLT (Extensible

Stylesheet Language Transformations);� transferul asincron de date via obiectul XMLHttpRequest;� procesarea prin limbajul ECMAScript/JavaScript.

Dacã aplicaþiile Web convenþionale erau construite având ca punct centralserverul, navigarea fiind bazatã pe încãrcarea de pagini Web (cu conþinuturistatice sau generate dinamic) solicitate serverului, în cazul AJAX aplicaþia rezidãchiar în cadrul paginii, procesarea având loc la nivelul clientului, iar o parte dindate sunt stocate tot de cãtre acesta. Astfel, avantajele majore aduse de AJAXsunt cele legate de eliminarea reîncãrcãrii paginilor, de facilitarea interacþiunii cuutilizatorul, de micºorarea timpilor morþi etc. Din punctul de vedere AJAX,întreaga aplicaþie se regãseºte la nivelul browser-ului, ceea ce poate avearepercursiuni nedorite privind sincronizarea serverului cu clientul. De cele mai

Page 246: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB246

multe ori este practic imposibil sã se cunoascã starea (comportamentul) pro-gramelor de pe server. Alte dezavantaje vizeazã dependenþa de tehnologiaJavaScript (implementatã în mod diferit de fiecare browser în parte), dificultateatestãrii ºi depanãrii aplicaþiilor, necesitatea folosirii navigatoarelor de ultimãgeneraþie, accesul oricui la codul-sursã (ceea ce poate cauza probleme desecuritate) ºi imposibilitatea, în unele situaþii, de a realiza bookmark-uri ori de afolosi mecanismul de istoric al navigãrii (history).

Succesul suitei de tehnologii AJAX provine din promovarea sa de cãtreaplicaþii 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 dispoziþie practic decãtre orice browser Web actual (a apãrut în premierã ca obiect ActiveX inclus înInternet Explorer 5, iar apoi a fost adoptat ºi de Mozilla 1.0 ºi Safari 1.2). Acestobiect permite realizarea de cereri HTTP (e.g., GET ºi POST) dintr-un programrulând la nivel de client (program de navigare) spre o aplicaþie 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 abordãri: reprezentãri HTML, JSON (JavaScriptObject Notation), CSV (Comma Separated Values) ori diverse metode de serializare.Atunci când se utilizeazã HTML ca mijloc de reprezentare a datelor, AJAX semai numeºte ºi AHAH (Aynchronous HTML and HTTP). JSON reprezintã un subsetal limbajului JavaScript (în fapt, al versiunii standardizate, cunoscutã sub numelede ECMAScript), avantajul fiind cã datele reprezentate în JSON sunt simpleºiruri de caractere ce pot fi convertite uºor în (tablouri de) obiecte JavaScript.Astfel dispare necesitatea procesãrii conþinutului XML obþinut de la server.

Principalele metode care vor fi folosite efectiv în contextul AJAX sunturmãtoarele:

� open() iniþiazã (deschide) o conexiune HTTP cu serverul, trimiþând o cerere(uzual, GET sau POST) cãtre acesta; aplicaþia de pe server cu care va avea locschimbul de date va fi desemnatã de un URI, dupã cum vom vedea mai jos;

� send() transmite date, în manierã asincronã, cãtre aplicaþia rulând pe server;� abort() abandoneazã transferul curent;� setRequestHeader() specificã diverse câmpuri ale antetului HTTP; de exemplu,

se poate stabili o anumitã valoare particularã pentru câmpul Content-Type,aspect util atunci când dorim sã manipulãm alte tipuri de conþinuturi, deexemplu JSON ori CSV.

Page 247: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

247DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

Proprietãþile de bazã ale obiectului sunt:

� readyState conþine codul de stare a transferului (e.g., valoarea 4 specificãfaptul cã transferul datelor s-a efectuat complet) � a se consulta ºi tabelulde mai jos;

Valoarea readyState

Stare Descriere

0

UNINITIATED

Obiectul XML a fost creat, dar procesul de încãr-care nu a fost încã pornit.

1

LOADING

Încãrcarea este în progres, dar analiza XML nu a început.

2

LOADED

Încãrcarea s-a terminat, însã arborele DOM nu a fost creat.

3

INTERACTIVE

Arborele DOM a fost generat, dar numai o parte dintre elemente au fost analizate.

4

COMPLETED

Documentul XML a fost complet încãrcat ºi ana-lizat.

� status reprezintã codul de stare HTTP întors de serverul Web; de exemplu,200 (Ok), 404 (Not Found), 500 (Server Internal Error);

� statusText desemneazã ºirul de caractere ce explicã în limbaj natural codul destare obþinut;

� onreadystatechange specificã funcþia ce va fi invocatã la modificãrile privindschimbarea stãrii de transfer a datelor (datele sunt transmise în manierãasincronã ºi deci programul de la nivel de client trebuie sã poatã fi notificatasupra schimbãrii evenimentelor care pot surveni pe parcursul transferului).

Utilizãri

Caracteristica importantã oferitã de AJAX este cea de a schimba doar anumitepãrþi ale paginii Web.

Una din tehnicile AJAX populare este ºi cea a indicãrii vizuale a faptului cãun fragment dintr-un document a fost modificat. Astfel, pe baza unei nuanþe deculoare, care dispare în timp, utilizatorului i se poate semnala cã un paragrafdintr-un text are conþinutul schimbat (actualizat). Uzual, se foloseºte galbenul;de aceea, acest ºablon de proiectare se mai numeºte ºi YFT (Yellow Fade Technique),generalizarea sa întitulându-se FAT (Fade Anything Technique).

O altã utilizare este cea a reîmprospãtãrii automate (eventual, periodice) aunei zone dintr-o paginã. De exemplu, atunci când a apãrut o nouã ºtirerecepþionatã via un emiþãtor Atom/RSS (Really Simple Syndication) ori s-a modificat

Page 248: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB248

o informaþie de interes pentru utilizator (curs valutar, temperaturã, scor la unmeci, voturi acordate unei piese muzicale etc.).

Tot prin intermediul AJAX, putem realiza un câmp interactiv cu auto-completarea datelor (auto-completion), în funcþie de cele introduse deja de cãtreutilizator. Astfel se emuleazã bine-cunoscutul control combo-box, oferindu-se olistã de sugestii în funcþie de caracterele tastate. Situl Google Suggest foloseºteintensiv aceastã tehnicã. În acest context, putem menþiona cã AJAX ne poatesluji ºi pentru validarea diverselor informaþii obþinute de la utilizator.

Altã facilitate uºor de implementat via AJAX este cea de a oferi posibilitateaefectuãrii de operaþii drag-and-drop asupra unor zone prestabilite ale paginii Web.În conjuncþie cu o bibliotecã JavaScript precum DOM-Drag, se poate astfelimplementa � la nivel de aplicaþie Web � un comportament similar uneiinteracþiuni convenþionale de tip MDI (Multiple Document Interface).

Diverse alte întrebuinþãri ale AJAX sunt dedicate realizãrii de efecte vizuale(unele dintre ele, sofisticate), similare interacþiunii cu utilizatorul în Mac OS Xsau Windows Vista.

Instrumente de dezvoltare

Actualmente sunt disponibile diverse cadre de lucru dedicate dezvoltãrii apli-caþiilor 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 manipu-larea facilã a arborilor DOM. Pe partea de server se poate recurge la tehnologiiprecum CGI, servere de aplicaþii (de exemplu, programe PHP sau servlet-uri) oriframework-uri dedicate � vezi mai jos.

Trebuie menþionat faptul cã o serie de companii deja au început sã punã ladispoziþie interfeþe de programare AJAX specializate, pentru ca dezvoltatorii sãintegreze facil conþinuturi provenite de pe diverse situri în cadrul paginilorproprii. Un exemplu notabil este Google AJAX Search API, prin care se poateavea acces la serviciul Web de cãutare direct la nivel de client, în stilul AJAX.

Page 249: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

249DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

Figura 27. O aplicaþie Web demonstrativã construitã cu biblioteca Dojo

folosind diverse tehnici AJAX

3.3. Invocarea asincronã a unui serviciu Web via AJAX

Folosirea efectivã a obiectului XMLHttpRequest ºi a unui intermediar scris în PHP

Vom considera scenariul: un utilizator doreºte sã verifice existenþa unui fiºieraflat pe un server, pentru aceasta trebuind sã completeze un formular care îi vasolicita numele fiºierului în cauzã. Prin intermediul AJAX, vom apela un programPHP ce va reprezenta un client pentru serviciul Web privitor la operaþii cufiºiere, detaliat în subcapitolul 1.

Page 250: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB250

La apariþia evenimentului de pierdere a focus-ului asupra câmpului de intro-ducere a numelui de fiºier, prin intermediul unui program JavaScript se va realizaun transfer asincron cãtre programul PHP rulând pe server, aplicaþie care vaîntoarce rãspunsul privind existenþa numelui de fiºier. În acest caz, utilizatorul vaprimi imediat feedback pozitiv, suplimentar având posibilitatea redenumirii fiºie-rului respectiv.

Formularul Web de interacþiune cu utilizatorul are urmãtoarea structurã:

<form action="redenumire.php" method="get"> Numele fiºierului : <input type="text" name="nume" title="Introduceþi un nume de fiºier" onblur= "javascript:verificaExist (this.value, '')" /> <span class="ascuns" id="fisierExistent"> Fiºierul existã. <input type="checkbox" value="da" name="redenumire" checked="checked" title="Bifaþi dacã doriþi redenumirea fiºierului" />Redenumim? </span> <br /><input type="submit" value="Executã" /></form>

În cadrul unui element <span> vom insera construcþiile XHTML ce vorconþine mesajul afiºat utilizatorului în cazul în care fiºierul existã, putându-sebifa opþiunea de redenumire a acelui fiºier. Iniþial, acest element va fi ascuns ºiva fi afiºat prin modificarea proprietãþii de stil display oferitã de CSS.

Clasele de proprietãþi CSS sunt specificate în antetul documentului XHTMLîn maniera de mai jos:

input[type="text"]:focus { background: #EEE; border-color: #000;}.exista { /* pentru semnalarea exist. fiºierului */ display: block; background: #CCF; border-width: 1px; border-style: dotted; padding: 0.2em; width: 233px;}.ascuns { /* pentru ascunderea mesajului */ display: none;}

Page 251: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

251DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

La apariþia evenimentului onblur va fi apelatã funcþia JavaScript verificaExist()care va avea ca responsabilitate efectuarea transferului asincron cãtre un programPHP rulând pe server ce va apela metoda de verificare a existenþei fiºierului,metodã implementatã de serviciul Web conceput în limbajul Perl. Atât cererea,cât ºi rezultatul obþinut vor fi marcate în XML.

Codul-sursã al funcþiei verificaExist() este urmãtorul:

function verificaExist (nume, raspuns) { // avem un rãspuns? if (raspuns != '') { // preluãm via metodele DOM // elementul cu id='fisierExistent' // pentru a afiºa mesajul dorit mesaj = document.getElementById ('fisierExistent'); // schimbãm stilul de afiºare (în caz de succes // vor fi aplicate proprietãþile CSS din // clasa 'exista', altfel textul va fi ascuns) mesaj.className = (raspuns == 1) ? 'exista' : 'ascuns'; } else { // nu e nici un rãspuns setat, vom verifica // trimiþând o cerere asincronã cãtre server incarcaXML ('/verifica_exist.php?nume=' + nume); }}

Cererea asincronã cãtre programul PHP va fi realizatã de funcþia incarcaXML()având codul dat în continuare:

var cerere; // cererea cãtre serverul Web// încarcã un document XML desemnat de 'url'function incarcaXML (url) { // verificãm existenþa obiectului XMLHttpRequest if (window.XMLHttpRequest) { // existã suport nativ (Mozilla Firefox) cerere = new XMLHttpRequest (); // se stabileºte funcþia de tratare // a stãrii încãrcãrii cerere.onreadystatechange = trateazaCererea; // preluãm documentul prin metoda GET cerere.open ("GET", url, true); cerere.send (null); } else if (window.ActiveXObject) { cerere = new ActiveXObject ("Microsoft.XMLHTTP"); // se poate folosi obiectul ActiveX din MSIE

Page 252: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB252

if (cerere) { // preluãm documentul prin metoda GET cerere.onreadystatechange = trateazaCererea; cerere.open ("GET", url, true); cerere.send (); } }}

Se verificã disponibilitatea obiectului XMLHttpRequest în cadrul navigatoruluiWeb, iar maniera de transfer se va realiza prin metoda GET a protocoluluiHTTP. Tratarea evenimentelor de transmisie asincronã a datelor are loc înfuncþia trateazaCererea() a cãrei implementare este furnizatã mai jos:

function trateazaCererea () { // verificãm dacã încãrcarea s-a terminat cu succes if (cerere.readyState == 4) { // verificãm dacã am obþinut codul de stare '200 Ok' if (cerere.status == 200) {

// procesãm datele recepþionate (preluãm via DOM // elementul-rãdãcinã al documumentului XML)

raspuns = cerere.responseXML.documentElement;metoda = raspuns.getElementsByTagName(

'metoda')[0].firstChild.data;rezultat = raspuns.getElementsByTagName(

'rezultat')[0].firstChild.data;// evaluãm metodaeval ( metoda + '(\'\', rezultat)');

} // se pot trata ºi alte coduri (404, 500 etc.) else {

alert ("A apãrut o problemã la transferul XML:\n" + cerere.statusText); } }}

Datele XML care vor fi recepþionate reprezintã un nume de metodã � înacest caz, verificaExist() � ºi rezultatul întors de aceasta. Aceste date vor fiprelucrate doar în caz de succes (codul de stare HTTP va fi 200).

Programul PHP ce verificã existenþa fiºierului pe baza numelui recepþionat dela utilizator via AJAX are urmãtorul cod-sursã:

<?phprequire_once('lib/nusoap.php');// trimitem tipul conþinutului

Page 253: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

253DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

header ('Content-type: text/xml');

// funcþie care verificã dacã existã un fiºierfunction verifica ($nume) { // instanþiem un client SOAP $client = new soapclient( 'http://endirra.ro:3333/xml-files.pl'); // preluãm posibilele erori $eroare = $client->getError(); if ($eroare) return 0; // stabilim parametrii de intrare ai metodei invocate $param = array('filename' => $nume); // stabilim spaþiul de nume folosit $spatiu_nume = 'http://127.0.0.1:3333/XMLFiles/'; // realizãm apelul $rezult = $client->call('CheckIfExists', array('parameters' => $param), $spatiu_nume, '', true); // verificãm dacã existã vreun fault if ($client->fault) return 0; // eroare la executie? $eroare = $client->getError(); if ($eroare) return 0; // întoarcem rezultatul oferit de metoda invocatã return $rezult;}// generãm conþinutul XMLecho '<?xml version="1.0" ?>';?><raspuns> <metoda>verificaExist</metoda> <rezultat> <?php echo verifica ($_REQUEST['nume']); ?> </rezultat></raspuns>

Trebuie invocatã metoda CheckIfExists implementatã de serviciul Web creat înPerl.

Programul PHP recurgând la funcþionalitãþile oferite de biblioteca NuSOAPdevine în acest moment client al serviciului, funcþionând ca un intermediar întrescript-ul JavaScript rulând în browser ºi serviciul Web executat pe un server aflatla distanþã. Cele trei categorii principale de entitãþi de calcul implicate în aceastãacþiune sunt ilustrate de figura 28.

Page 254: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB254

Figura 28. Relaþiile între programul JavaScript, script-ul PHPºi serviciul Web implementat în Perl

Tipul conþinutului generat va fi XML, aºteptat pe partea de client de cãtreprogramul JavaScript.

Figura urmãtoare reprezintã o capturã-ecran oferind mesajul obþinut deutilizator în cazul în care introduce un nume de fiºier existent, cu posibilitatearedenumirii acestuia.

Page 255: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

255DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

Figura 29. Mesajul obþinut în urma introducerii unui nume de fiºier existent

Apelând script-ul PHP în mod explicit � introducând în browser o adresã degenul http://endirra.ro/verifica_exist.php?filename=inexistent �, obþinem documentulXML ilustrat de figura 30. Acest document încapsuleazã de fapt rãspunsulprelucrat în cadrul programul JavaScript descris anterior.

Figura 30. Documentul XML furnizat de programul PHP de verificare a existenþei unui fiºier

Din cele descrise mai sus, se poate observa faptul cã script-ul PHP funcþioneazãca un intermediar (proxy), realizând inter-operabilitatea între programul JavaScriptrulat în cadrul browser-ului ºi serviciul Web Perl invocat pe un server diferit decel în care se executã codul PHP. Am ales modelul descris aici, deoarece serviciulWeb poate sã nu fie disponibil pe aceeaºi maºinã pe care ruleazã codul PHPinvocat prin obiectul XMLHttpRequest.

La apãsarea butonului de tip submit va fi apelat script-ul redenumire.php, care vatrebui sã invoce metoda de redenumire a fiºierului, metodã implementatã deserviciul Web. Scrierea acestui program rãmâne ca temã de acasã pentru cititorulinteresat.

3.4. Utilizarea bibliotecii Prototype

O soluþie alternativã la precedenta este aceea în care recurgem la bibliotecaPrototype, care pune la dispoziþie o suitã de clase ºi extensii DOM (Document ObjectModel) pentru facilitarea unei interacþiuni Web flexibile pe partea client, în

Page 256: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB256

JavaScript. Una dintre funcþionalitãþile pe care o vom utiliza se referã tocmaila implementarea unui mecanism robust, independent de navigator, de transferasincron de date în stilul AJAX. Astfel, pagina Web care solicitã utilizatoruluiun nume de fiºier pentru a verifica existenþa sa pe server are urmãtorulcod-sursã:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="ro" xml:lang="ro"><head><title>AJAX + SOAP</title><style type="text/css">.exista { /* pt. semnalarea existenþei fiºierului */ display: block; background: #CCF; border-width: 1px; border-style: dotted; padding: 0.2em; width: 233px;}.ascuns { /* pt. ascunderea mesajului */ display: none;}</style><!-- folosim biblioteca Protoype 1.4.0 --><script type="text/javascript" src="prototype.js"></script><script type="text/javascript">// lista de tratare a evenimentelor// de încãrcare asincronãvar globalHandlers = { // la crearea conexiunii cu serverul

onCreate: function () {// afiºãm un mesaj temporarElement.show ('asteptare');

}, // la apariþia unei erori

onFailure: function() {alert ('Eroare de transmitere.');

}, // la apariþia unei excepþii

onException: function() { alert ('A apãrut o excepþie.');

}};

Page 257: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

257DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

// funcþie care verificã existenþa// numelui de fiºier via AJAXfunction verificaExist () { // înregistrãm funcþiile de tratare a evenimentelor Ajax.Responders.register (globalHandlers); // instanþiem obiectul AJAX var obAjax = new Ajax.Request ( '/ajax/verifica_exist.php', // URI-ul invocat {

method: 'get',// parametrii transmiºi spre serverparameters: 'nume=' + $F('nume'),// metoda apelatã la terminarea transferuluionComplete: afiseaza

});}

// funcþie responsabilã cu afiºarea rezultatuluifunction afiseaza(rasp) { // ascundem mesajul temporar Element.hide ('asteptare'); // preluãm valoarea rezultatului // printr-o expresie regulatã, // deoarece rãspunsul e un ºir de caractere var pattern = new RegExp("\<rezultat\>1\<\/rezultat\>"); // modificãm clasa CSS corespunzãtoare // elementului <span> iniþial ascuns $('fisierExistent').className = (pattern.test(rasp.responseText)) ? 'exista' : 'ascuns';}</script></head><body><form action="redenumire.php" method="get"> Numele fiºierului : <input type="text" id="nume" title="Introduceþi un nume de fiºier" onblur="javascript:verificaExist ()" /> <span id="asteptare"

style="display:none;color:#990;font-style:italic"> Aºteptaþi, vã rugãm...</span>

<span class="ascuns" id="fisierExistent"> Fiºierul existã. <input type="checkbox" value="da" name="redenumire" checked="checked" title="Bifaþi dacã doriþi redenumirea

Page 258: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB258

fiºierului" />Redenumim? </span> <br /> <input type="submit" value="Executã" /></form></body></html>

Evenimentele privitoare la desfãºurarea transferului de date între client ºiserver pot fi tratate de funcþii definite de utilizator. În cazul de faþã, la creareaunui conexiuni cu serverul, vom afiºa un mesaj temporar ce semnaleazã utiliza-torului faptul cã trebuie sã aºtepte primirea rãspunsului (a se vedea figura 31).

Figura 31. Semnalarea unui mesaj de aºteptarea realizãrii unui transfer asincron via AJAX

Maniera de afiºare/ascundere a unui element � <span id="asteptare"> �este realizatã de metodele show(), respectiv hide() ale clasei Element definite debiblioteca Prototype. În caz de eroare (onFailure) sau de excepþie (onException), vomsemnala aceastã situaþie utilizatorului via funcþia JavaScript standard alert(). Ca ºiîn exemplul anterior, verificarea existenþei fiºierului se realizeazã în cadrul funcþieiverificaExist(). În aceastã situaþie, vom instanþia un obiect Ajax.Request ce repre-zintã cererea efectuatã de program cãtre server, dupã ce în prealabil am înregistratfuncþiile de tratare a evenimentelor de transfer via Ajax.Responders.register().Argumentele constructorului Ajax.Request() sunt, în mod firesc, adresa script-uluiPHP ce va fi invocat pe server (acelaºi program ca mai sus), metoda HTTPfolositã, parametrii de intrare (în cazul nostru, numele fiºierului) ºi funcþia ce vafi apelatã la finalizarea transferului asincron. Valoarea numelui de fiºier estepreluatã din formular prin intermediul construcþiei $F() specificate de Prototype.În acest mod, putem accesa comod câmpuri din formularele Web.

Dupã obþinerea rezultatului va fi executatã funcþia afiseaza(), care are dreptargument un obiect conþinând rãspunsul primit din partea serverului, în cazulnostru, un document XML. Proprietatea responseText reprezintã ºirul de caractererecepþionat din partea script-ului PHP, adicã documentul XML ilustrat în figura 30.Printr-o expresie regulatã simplã, preluãm valoarea elementului <rezultat>,pentru a schimba clasa CSS corespunzãtoare marcatorului <span> responsabilcu semnalarea existenþei fiºierului ºi inserãrii butonului de bifare a redenumirii

Page 259: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

259DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

acestuia. Construcþia $() este o scurtãturã pentru metoda getElementById() spe-cificatã de recomandarea DOM, fiind folositã pentru a selecta un anumit elementdin cadrul documentului XHTML; a se revedea ºi capitolul 2.

O capturã-ecran a dialogului între client ºi server este pusã la dispoziþie defigura 32, în care se poate remarca ºi interfaþa extensiei Firebug pentru navigatorulFirefox, folositã în situaþia de faþã pentru a lista apelurile AJAX realizate ºiposibilele erori survenite. Aceastã extensie poate fi utilizatã cu succes pentrudepanarea oricãror programe JavaScript.

Figura 32. Trasarea apelurilor AJAX via extensia Firebugpentru navigatorul Firefox

3.5. Invocarea directã, din JavaScript, a unui serviciu Web

În continuare, ne propunem sã invocãm direct un serviciu Web via metodaPOST. Singura restricþie este ca URI-ul folosit de obiectul XMLHttpRequestpentru trimiterea mesajului SOAP de cerere sã aibã acelaºi domeniu cu cel al

Page 260: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB260

serviciului (cu alte cuvinte, serviciul Web nu poate fi localizat decât pe maºina pecare rezidã ºi programul JavaScript ce recurge la AJAX).

Ca exemplificare, presupunem cã dorim sã aflãm stocul unui sortiment deportocale, recurgând la metoda furnizeazaSortiment() implementatã de serviciulWeb prezentat în cadrul secþiunii 1.2. Programul JavaScript folosit la invocareaserviciului Web are codul-sursã de mai jos (se poate observa cã structurageneralã a codului e similarã celei prezentate mai sus, cu deosebirea cã în acestcaz vom iniþia o cerere POST spre server, adresa indicatã fiind cea a serviciuluiWeb):

// adresa de apel al serviciului Webconst URISERV = 'http://localhost/sxml/oranges-server.php';// adresa de bazã a serviciului Webconst URIBSRV = 'http://localhost/sxml/';// spaþiul de nume al serviciului Webconst URISPN = 'urn:portocale.info';

// generãm mesajul SOAP de cerere// care va fi trimis spre serverfunction genMesaj (numeDoc) {// construim 'de mânã' mesajul SOAP de cererevar 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;}

// invocãm metoda de validarefunction invoca (numeDoc) {var mesaj = genMesaj (numeDoc);try { if (window.XMLHttpRequest) { // doar pentru Firefox cerere = new XMLHttpRequest (); } // stabileºte funcþia de tratare a stãrii încãrcãrii cerere.onreadystatechange = trateazaCererea;

Page 261: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

261DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

// trimitem cererea SOAP prin metoda POST cerere.open ("POST", URISERV, true); // stabilim tipul conþinutului cerere.setRequestHeader("Content-Type", "text/xml"); // stabilim valoarea câmpului SOAPAction cerere.setRequestHeader("SOAPAction", URIBSRV + 'furnizeazaCantit'); cerere.send (mesaj); document.getElementById("txtCerere").value = mesaj;}catch (except) {

alert ('A intervenit o excepþie: ' + except);}}

// funcþie care trateazã starea conexiunii cu serverulfunction trateazaCererea () {// transferul s-a efectuat completif (cerere.readyState == 4) { var raspuns = cerere.responseXML; // a apãrut o eroare? if (cerere.status != 200) { alert("A apãrut o eroare...\n" + cerere.statusText + cerere.getAllResponseHeaders()); return; } // furnizãm rãspunsul primit de la server document.getElementById("txtRaspuns").value = raspuns.getElementsByTagName( 'Body')[0].firstChild.firstChild.firstChild.data; return; }}

Mesajul ce va fi transmis cãtre server este �confecþionat� manual, construind înacest mod plicul SOAP. În caz de eroare la întoarcere rãspunsului, afiºãm ºianteturile HTTP primite de la server via getAllResponseHeaders(). Valoarea stocului deportocale reprezintã în fapt elementul strãnepot al elementului Body al rãspunsuluiSOAP (folosim proprietatea firstChild pusã la dispoziþie de modelul DOM).

Formularul XHTML care preia de la utilizator numele unui sortiment deportocale ºi afiºeazã rãspunsul primit, inclusiv structura cererii SOAP efectuate,are urmãtorul cod:

<form> Numele sortimentului : <input type="text" name="nume"

Page 262: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB262

title="Introduceti un sortiment de portocale" onblur="javascript:invoca (this.value)" /> <br /> <!-- conþine datele privitoare la cererea SOAP --> <textarea rows="10" cols="60" id="txtCerere"></textarea> <p>Stocul din sortimentul dorit este

<input type="text" id="txtRaspuns"></input>.</p></form>

Un posibil rezultat este disponibil în figura de mai jos.

Figura 33. Rezultatul primit de la o metodãa unui serviciu Web invocat direct via XMLHttpRequest

Page 263: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

263DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

3.6. Transferuri asincrone prin Atlas ASP.NET

La finalul acestui subcapitol vom prezenta succint cadrul de lucru Atlas ASP.NET,conceput special de Microsoft pentru realizarea de aplicaþii AJAX în contextulASP.NET versiunea 2.0, dar putând fi folosit ºi în conjuncþie cu alte tehno-logii de programare a aplicaþiilor Web, de exemplu PHP � a se vizita adresahttp://www.shankun.com/Atlas_Php_2.aspx. De asemenea, partea JavaScript faci-litând transferurile asincrone e compatibilã cu mai multe navigatoare, fãrã atrebui sã recurgem în mod necesar la Internet Explorer.

Pentru a utiliza Atlas, cunoºtinþele pe care trebuie sã le deþinã programatorulîn ceea ce priveºte tehnologia ASP.NET vor putea fi minimale.

Pentru redarea datelor la nivelul clientului, se oferã un set de controale deinterfaþã, în stilul ASP.NET, ale cãror proprietãþi pot fi stabilite fie declarativ(prin construcþii XML), fie prin intermediul codului JavaScript. Aceste controalevor rula în fapt pe server, mediul având în responsabilitate generarea de marcaje(plus programe JavaScript), în funcþie de browser-ul folosit. Funcþionalitatea esteîncapsulatã de un assembly numit Microsoft.Web.Atlas.dll.

O parte dintre controalele deja existente în ASP.NET sunt extinse pentru aoferi facilitãþi suplimentare, în stilul AJAX. De asemenea, câmpurile de tip textpot avea ataºat un mecanism de autocompletare a datelor (vezi exemplul de maijos), iar conþinutul unor zone din cadrul documentului Web pot fi reîmprospãtateperiodic (via UpdatePanel). Diverse elemente dintr-o paginã pot interacþiona prinintermediul tehnicilor drag-and-drop, putând fi astfel mutate/ascunse dinamic. Maimult decât atât, terþe componente pot îmbogãþi paleta controalelor existente;astfel, în Atlas pot fi incluse funcþionalitãþi noi.

Accesul la datele de pe server se realizeazã prin apeluri asincrone de metodeale unor servicii Web locale (codul acestora trebuie sã rezide pe aceeaºi maºinãpe care existã situl), conform modelului de securitate impus de JavaScript.Aceste servicii Web vor fi construite conform modalitãþilor oferite de ASP.NET.Mediul are rolul de a realiza transferul efectiv al datelor � codificate conformconvenþiei JSON între controalele interactive ºi server.

Invocarea serviciilor externe se poate realiza prin aºa-numita punte (bridge),cod inclus în fiºiere cu extensia .asbx, ce va facilita dialogul cu servicii rulând pealte calculatoare. Un astfel de exemplu de fapt l-am implementat mai sus, însecþiunea 3.3, dar printr-un intermediar scris în limbajul PHP.

Alte detalii privitoare la arhitectura ºi modul de programare sunt disponibileîn documentaþiile ºi exemplele oferite pe situl Atlas.

Drept exemplificare (o adaptare dupã una dintre soluþiile din tutorialeleoficiale), ne propunem sã punem utilizatorului la dispoziþie o facilitate de

Page 264: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB264

sugerare a numelor unor sortimente de portocale, pe baza caracterelor dejatestate de acesta. E vorba, aºadar, de asocierea unui mecanism de autocompletarede date pentru un câmp textual al unui formular Web. Datele privitoare lasortimentele de portocale vor fi furnizate de un serviciu Web, care le va preluadintr-un fiºier text (desigur, scenarii mai complexe vor putea recurge la interogãriSQL ori la preluarea informaþiilor din surse multiple).

Atlas impune ca serviciul Web utilizat sã aibã o unicã metodã ce va fi invocatãpe server, în manierã asincronã, la apariþia unui eveniment (apãsarea unui buton,introducerea unor caractere, la momente periodice de timp, la miºcarea cursoruluimouse-ului etc.). Aºadar, vom dezvolta un serviciu Web stocat de fiºierulPortocale.asmx. Pentru aceasta, vom folosi ºablonul �Atlas� Web Site pentru VisualWeb Developer Express (funcþioneazã ºi în Visual Studio .NET), pus la dispoziþieîn momentul instalãrii distribuþiei Atlas preluate de pe Web. Ulterior, vom ataºa(bind) acest serviciu unui control autoComplete dintr-o paginã ASP.NET.

Codul-sursã este urmãtorul � a se observa existenþa unei singure metode,denumitã furnizeazaSortimente.

<%@ WebService Language="C#" Class="Portocale.Portocale" %>using System;using System.IO;using System.Collections;using System.Web.Services;

namespace Portocale { [WebService(Namespace = "urn:portocale.info")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class Portocale : System.Web.Services.WebService { // lista sortimentelor încãrcate dintr-un fiºier private static string[] sortimente = null;

// furnizeazã o listã de sortimente ale cãror nume // sunt prefixate de un sir dat [WebMethod] public String[] furnizeazaSortimente (string prefixText, int count) { // 'prefixText' ºi 'count' sunt denumiri // standard ai parametrilor de intrare trimiºi // de controlul 'autoComplete' string prefix = prefixText; int lungMax = count; // încã nu existã, încãrcãm din fiºier

Page 265: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

265DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

if (sortimente == null) { String[] temp = File.ReadAllLines( Server.MapPath("~/sortim_portocale.txt")); // sortãm elementele pentru a putea realiza // cãutarea binarã Array.Sort(temp, new CaseInsensitiveComparer()); sortimente = temp; } // realizãm cãutarea º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++) { // verificãm dacã începe cu prefixul dat if (!sortimente[index + potriviri].StartsWith(prefix, StringComparison.CurrentCultureIgnoreCase)) { break; } } // copiem rezultatul obþinut 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. Primulparametru de intrare reprezintã prefixul, care trebuie sã se potriveascã fiecãruiadintre elementele listei de sortimente, iar al doilea specificã numãrul maxim desortimente ce vor fi întoarse. Datele vor fi sortate, iar cãutarea va fi realizatã prinmetoda cãutãrii binare, indiferent dacã literele sunt minuscule sau majuscule.

Page 266: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB266

Un posibil rezultat, cu prefixText = �a� ºi count = 10, este documentul XMLdat în continuare:

<?xml version="1.0" encoding="utf-8"?><ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:portocale.info"> <string>Acre</string> <string>Albastre</string> <string>Albe</string> <string>Argintii</string> <string>Aspre</string> <string>Aurii</string></ArrayOfString>

Va trebui sã scriem o paginã ASP.NET care sã ofere un formular Web undeutilizatorul sã fie îndemnat sã furnizeze un nume de sortiment de portocale. Laintroducerea mãcar a unui caracter, pe baza prefixului deja inserat în câmpulformularului, va trebui iniþiat un transfer asincron care sã invoce metodafurnizeazaSortimente(). Rezultatul acesteia va fi afiºat ca listã de sugestii într-un<div>, utilizatorul putând selecta unul dintre sortimentele apãrute.

Codul XHTML al formularului este urmãtorul:

<form id="formular" action="" runat="server"> <div>Introduceþi un sortiment: <input id="sortiment" type="text" /></div> <!-- va include elementele sugerate obþinute dupã invocarea asincronã a serviciului Web --> <div id="listaSortimente"></div></form>

Iniþial, marcatorul <div> cu id=�listaSortimente� va fi ascuns, fiind completatde cãtre Atlas la obþinerea listei de sortimente întoarse de serviciul Web.Elementului <input id="sortiment" type="text" /> va trebui sã-i ataºãm com-portamentul de autocompletare, stabilind de asemenea ºi metoda serviciului Webce va avea în responsabilitate returnarea listei de sugestii.

Vom adopta metoda declarativã, la finalul paginii inserând liniile de mai jos:

<script type="text/xml-script"> <page xmlns:script= "http://schemas.microsoft.com/xml-script/2005"> <components> <textBox id="sortiment"> <behaviors>

Page 267: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

267DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

<!-- se defineºte modul de autocompletare, prin apelul unei metode a unui serviciu Web --> <autoComplete completionList="listaSortimente" serviceURL="Portocale.asmx" serviceMethod="furnizeazaSortimente" minimumPrefixLength="1" completionSetCount="15" completionInterval="500" /> </behaviors> </textBox> </components> </page></script>

Se poate deduce uºor faptul cã pentru controlul de tip text cu id="sortiment"se asociazã un marcator XHTML ce va conþine rezultatul metodei serviciuluiWeb invocat, unde lungimea prefixului trebuie sã fie minimum 1 (aceastã valoareo va avea parametrul prefixText de mai sus), mulþimea elementelor sugerate va fide maxim 15 (parametrul count va avea asociatã aceastã valoare) ºi intervalul decompletare va fi de 500 de milisecunde.

Maniera efectivã de transfer asincron al datelor între client ºi server esterealizatã în mod transparent de cãtre Atlas. În captura-ecran de mai jos pot fiurmãrite informaþiile despre sortimentele sugerate la introducerea literei �A� decãtre utilizator, plus apelurile AJAX dintre paginã ºi serviciul Web. Puteþi remarcafaptul cã datele vehiculate sunt codificate în stilul JSON (în cazul nostru,parametrii de intrare sunt perechi nume-valoare incluse într-o listã, iar rezultatulobþinut reprezintã un tablou de ºiruri de caractere).

Din moment ce vom selecta unul dintre sortimente, acesta va fi automatintrodus ca text în cadrul câmpului formularului Web.

Dorim sã adãugãm ºi un buton etichetat �Alege�, la apãsarea cãruia sã fieinvocat � tot în manierã asincronã � un alt serviciu Web, care sã realizeze oanumitã acþiune (în acest caz, va întoarce un ºir de caractere ce va fi redat fãrãa se realiza reîncãrcarea întregului document). Astfel, putem reîmprospãtadiverse zone ale paginii, fie în mod explicit, fie periodic sau în funcþie de alþifactori.

Page 268: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB268

Figura 34. Folosirea unui control de tip autoComplete în Atlas ASP.NET

Pentru aceasta, va trebui sã mai concepem un serviciu Web � CantitPortocale.asmx �al cãrui cod C# simplu e dat în continuare (omitem construcþiile neesenþiale):

// afiºeazã sortimentul preluat de la client[WebMethod]public String listeazaSortiment (string query) { // preluãm parametrul string sortiment = Server.HtmlEncode(query); // dacã nu existã sau e vid, // întoarcem un mesaj de avertizare if (!String.IsNullOrEmpty(sortiment)) { return String.Format("Aþi ales sortimentul {0}!", sortiment); }

Page 269: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

269DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

else { return "Parametrul de intrare primit e vid..."; }}

Este disponibilã o singurã metodã care preia valoarea unui control ASP.NETvia obiectul Server ºi întoarce un ºir de caractere. Desigur, mai util pentruutilizator ar fi fost sã obþinã stocul de portocale din respectivul sortiment; acestaeste însã un exerciþiu uºor de implementat de cãtre cititor.

La formularul descris mai sus, vom adãuga urmãtoarele:

<!-- buton ce invocã un alt serviciu --><input id="alege" type="button" value="Alege" onclick="javascript:Invoca()" /><div id="rezultat"></div>

Dupã cum se remarcã, la apãsarea butonului va fi invocatã metodalisteazaSortiment(), de data aceasta via JavaScript. Rezultatul va fi conþinut de unelement <div>. Funcþia Invoca() are liniile de mai jos:

function Invoca() { // preluãm sortimentul var sortim = document.getElementById("sortiment"); // invocãm metoda Portocale.CantitPortocale.listeazaSortiment (sortim.value, TrateazaTransfer);}function TrateazaTransfer (rezultat) { // inserãm rezultatul în <div> document.getElementById("rezultat").innerHTML = rezultat;}

Cu getElementById() oferitã de DOM preluãm numele sortimentului ºi invocãmmetoda serviciului Web � se foloseºte forma SpatiuDeNume.ServiciuWeb.Metoda().Primul argument este tocmai parametrul de intrare al metodei, iar al doileadesemneazã funcþia JavaScript ce va fi apelatã la terminarea transferului. Nufacem decât sã inserãm în marcatorul <div> rezultatul obþinut de la server.

Ca mediul Atlas sã poatã realiza managementul transferului de date, în antetulpaginii trebuie sã introducem o referinþã la serviciul Web invocat:

<!-- face referinþã la serviciul Web invocat prin JavaScript în stilul AJAX --><atlas:ScriptManager runat="server" id="Atlas"> <services>

Page 270: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB270

<atlas:servicereference path="~/CantitPortocale.asmx" type="text/javascript" /> </services></atlas:ScriptManager>

La rulare, vom obþine un rezultat precum cel din figura 35.

Figura 35. Actualizarea conþinutului fãrã reîncãrcarea întregului document

Alte abordãri AJAX pentru .NET sunt AJAX.NET, MagicAjax.NET, JSON.NETºi xap4net.

Cele descrise mai sus pot fi realizate ºi în Java, prin intermediul framework-uluiDWR (Direct Web Remoting) sau via jMaki, SWATO ori Taconite. De asemenea,Google pune la dispoziþie GWT (Google Web Toolkit), scopul acestui instrumentfiind cel de a oferi suport pentru scrierea în Java de aplicaþii orientate spreAJAX. Pentru PHP, se poate recurge la pachetul HTML::AJAX, disponibil încolecþia PEAR, iar programatorii Perl pot utiliza extensiile Mason pentru AJAX.

Alte cadre de lucru oferã suport pentru AJAX în mai multe limbaje deprogramare, de menþionat fiind CPAINT (Cross-Platform Asynchronous InterfaceToolkit), JSON-RPC ºi Sajax. Nu trebuie uitat nici Ruby on Rails, unul dintre

Page 271: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

271DEZVOLTAREA ªI UTILIZAREA SERVICIILOR WEB

framework-urile de dezvoltare a aplicaþiilor Web pe partea de server foartecunoscute în acest moment, cu suport pentru AJAX.

În funcþie de preferinþe, de cerinþele problemei, de avantaje ºi/sau deplatformã, dezvoltatorul poate adopta una dintre soluþiile disponibile.

Referinþe

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, 2006Buraga, S., Tehnologii XML, Polirom, Iaºi, 2006: http://www.infoiasi.ro/~busaco/

books/xml/Buraga, S., Tehnologii Web, Matrix Rom, Bucureºti, 2001: http://www.infoiasi.ro/

~busaco/books/web.htmlBuraga, S., Ciobanu, G., Atelier de programare în reþele de calculatoare, Polirom, Iaºi, 2001:

http://www.infoiasi.ro/~lrc/Buraga, S. et al., Programare Web în bash ºi Perl, Polirom, Iaºi, 2002: http://www.infoiasi.ro/

~cgi/Buraga, S. (coord.), Situri Web la cheie. Soluþii profesionale de implementare, Polirom, Iaºi,

2004: http://www.infoiasi.ro/~busaco/books/webapps/Buraga, S. (coord.), Tendinþe actuale în proiectarea ºi dezvoltarea aplicaþiilor Web, Matrix Rom,

Bucureºti, 2006: http://www.infoiasi.ro/~busaco/books/nw05/Dospinescu, O., Dezvoltarea aplicaþiilor în Visual Basic .NET, Polirom, Iaºi, 2004Eernisse, M., A Simpler Ajax Path, OnLamp.com, 2005: http://www.onlamp.com/

pub/a/onlamp/2005/05/19/xmlhttprequest.htmlKulchenko, P., Ray, R., Programming Web Services with Perl, O�Reilly, 2002Mueller, J., Mining Google Web Services: Building Applications with the Google API, Sybex, 2004Pereira, S., Developer Notes for prototype.js: http://www.sergiopereira.com/articles/

prototype.js.htmlPerry, B., AJAX Hacks, O�Reilly, 2006Powell, T., Schneider, F., JavaScript 2.0: The Complete Reference (Second Edition), McGraw-Hill/

Osborne, 2004Swart, B., �Delphi 6 Web Services: SOAP�, The Delphi Magazine, Issue 72, August 2001:

http://www.thedelphimagazine.com/Samples/1273/article.htmlTanasã, ª., Olaru, C., Dezvoltarea aplicaþiilor Web folosind Java, Polirom, 2005Wood, K., Delphi Developer�s Guide to XML, Wordware Publishing, 2001Zakas, N., McPeak, J., Fawcett, J., Professional AJAX, Wrox Press, 2006Zametti, 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

Page 272: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB272

* * *, 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/* * *, O�Reilly 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/

Page 273: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

Capitolul 7

Retrospectivã ºi perspective

�Realitatea trebuie înþeleasã numai prin spargereaei în pãrþi cât mai mici.�

(René Descartes)

1. Procesul de dezvoltare a serviciilor Web

Recapitulând cele prezentate în capitolele anterioare, procesul de dezvoltare aserviciilor Web implicã trei categorii de activitãþi (a se urmãri ºi figura 1):

� oferirea de servicii, ceea ce presupune dezvoltarea propriu-zisã a serviciilor pusela dispoziþie într-un mediu de tip enterprise, plus expunerea unei documentaþii(descrieri) privitoare la interfaþa serviciilor; implementarea poate fi realizatãpe baza limbajelor de programare, cadrelor de lucru ºi platformelor actuale,iar descrierile sunt specificate via WSDL ºi alte metode adiþionale;

� organizarea (catalogarea) serviciilor Web conform unor criterii vizând tipul deafacere modelatã, localizarea ofertantului, industria consideratã etc; în acestsens, una dintre iniþiativele majore este reprezentatã de UDDI; prin inter-mediul UDDI, un ofertant de servicii poate fi uºor contactat de cãtre posibiliisolicitanþi (clienþi);

� solicitarea de servicii fie direct, atunci când interfaþa acestora este deja cunoscutã,fie indirect via UDDI; solicitantul îºi va proiecta aplicaþia doritã ºi va invocafuncþionalitãþile serviciilor conform documentului WSDL asociat fiecãruiserviciu în parte ori apelând la o interfaþã de programare (API) specificã.Schimbul de date între serviciu ºi client se va realiza � în mod uzual � prinintermediul SOAP, folosindu-se un protocol de transport oferit de Internet(cel mai frecvent, se recurge la HTTP). O alternativã la SOAP este datã demodelul REST, în care mesajele interschimbate, marcate de asemenea înXML, sunt transferate direct prin HTTP, fãrã a fi încapsulate în �plicuri�.

Page 274: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB274

Figura 1. Activitãþile desfãºurate în dezvoltarea serviciilor Web

Acest proces are loc în cadrul unui mediu orientat spre servicii, respectându-seprincipiile arhitecturale SOA (Service-Oriented Architecture) pe care le-am prezentatîn cadrul primului capitol al acestei lucrãri.

O aplicaþie Web proiectatã pe baza SOA poate fi compusã din diverse straturifuncþionale, conform celor ilustrate de figura 2.

Figura 2. Structura aplicaþiilor software axate pe SOA

Page 275: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

275RETROSPECTIVÃ ªI PERSPECTIVE

2. Alte iniþiative vizând serviciile Web

2.1. Privire de ansamblu

În ceea ce priveºte dezvoltarea de aplicaþii SOA în general ºi de servicii Web înparticular, tehnologiile SOAP, WSDL ºi UDDI nu sunt singulare, actualmentefiind disponibile o serie de specificaþii ºi iniþiative adiþionale privitoare la:

1. modul de adresare: WS-Addressing;2. inspecþie ºi descoperire: WS-Inspection, WS-Discovery;3. mesagerie: WS-ReliableMessaging, WS Attachments, WS-Routing etc.;4. securitate ºi autorizare: WS-Security, WS-Trust, WS-Policy ºi altele;5. procesarea tranzacþiilor: WS-Coordination, WS-Transaction;6. relaþia cu interfaþa-utilizator: WSRP (Web Services for Remote Portlets), WSIA

(Web Services for Interactive Applications);7. asigurarea inter-operabilitãþii ºi fluxului de activitãþi (workflow): BPEL (Business

Process Execution Language) ºi WS-Choreography.

Figura 3. Nivelurile de specificaþii adiþionale privitoare la serviciile Web

Page 276: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB276

Trebuie, de asemenea, menþionatã existenþa unei suite de specificaþii comple-mentare, concurente, care se intituleazã ebXML ºi care a fost în vogã în perioada2002-2005. Aceste specificaþii au fost date ulterior spre standardizare organizaþieiOASIS, semnatara multor documente privitoare la diverse aspecte legate deSOA ºi serviciile Web.

Vom descrie în continuare o parte dintre direcþiile de evoluþie a serviciilorWeb, cititorii interesaþi putând aprofunda aceste aspecte prin consultarea resur-selor bibliografice disponibile.

2.2. Adresarea serviciilor prin WS-Addressing

Iniþiativa WS-Addressing specificã modul de utilizare a unor mecanisme � inde-pendente de protocolul de transport folosit � destinate adresãrii serviciilor ºimesajelor. Specificaþia, propusã de IBM, defineºte elementele XML menite aidentifica punctele terminale ale serviciilor Web ºi maniera de asigurare asecuritãþii comunicaþiilor dintre aceste puncte terminale. Sistemele de mesagerie(messaging systems) pot realiza transportul mesajelor în cadrul unor reþele decomunicaþii � uzual, folosite în mediul enterprise � care pot include noduri deprocesare a datelor, precum firewall-uri sau porþi (gateways), indiferent de pro-tocoalele disponibile la nivel scãzut.

Din perspectiva WS-Addressing, modelul de descriere a serviciilor Web (i.e.,WSDL) este extins prin introducerea conceptului de referinþã la puncteleterminale (endpoint reference). Astfel, maniera în care se specificã adresa unuiserviciu Web este mai finã, deoarece nu implicã doar un URI (de exemplu, potfi specificate meta-date suplimentare ºi adresele mai multor documente WSDL).

Mesajele vehiculate pot fi identificate ºi corelate prin anteturile MessageID ºiRelatesTo, ceea ce deschide perspective interesante privind tranzacþiile ºi fluxurilede date. Sunt introduse ºi atribute precum To, From, ReplyTo ºi FaultTo, care potfi folosite de cãtre agenþii implicaþi în comunicare pentru a procesa un mesaj ºirãspunsurile aferente la acesta.

2.3. Descoperirea serviciilor

În capitolul 5 am discutat deja despre maniera de descoperire a serviciilor fie înmanierã centralizatã via UDDI, fie descentralizat prin WS-Inspection.

În cadrul acestei secþiuni, vom prezenta succint modul de descoperiredinamicã, specificat de WS-Discovery (propunere a corporaþiei Microsoft). În locde a se stoca informaþiile privitoare la servicii într-un catalog central, modelulWS-Discovery adoptã strategia folositã ºi de sistemele wireless: un serviciu Web îºi

Page 277: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

277RETROSPECTIVÃ ªI PERSPECTIVE

poate anunþa � via mesaje multicast � prezenþa, atunci când este �ataºat� infra-structurii Internet. Un procedeu similar are loc atunci când serviciul �pãrãseºte�reþeaua. Reþeaua este una constituitã ad hoc, compusã din entitãþi interesate deserviciul respectiv (i.e., clienþi care intenþioneazã sã invoce anumite operaþii).Limitarea traficului de mesaje poate avea loc prin constituirea unui aºa-numitproxy de descoperire (discovery proxy) care este implementat tot ca un serviciuWeb.

În afarã de mesajele de tip Hello (anunþ al prezenþei unui serviciu) ºi Bye(�plecarea� serviciului), sunt specificate ºi urmãtoarele douã operaþii:

� Probe � încearcã sã detecteze un anumit serviciu ori mulþime de servicii printransmiterea unui mesaj (multicast) cãtre un grup de calculatoare, rãspunsulfiind expediat direct solicitantului. Dacã reþeaua posedã un proxy de desco-perire, atunci metoda Probe va fi executatã direct de cãtre acesta;

� Resolve � intenþioneazã sã �rezolve� un serviciu, cãutarea efectuându-se dupãnumele acestuia, trimiþându-se un mesaj în întreaga reþea. Serviciul care sepotriveºte cu numele dat, va rãspunde solicitantului. Acest proces este similarcelui folosit de protocolul ARP (Address Resolution Protocol).

Un exemplu de mesaj SOAP care încapsuleazã o cerere Probe este furnizatmai jos (pentru localizare se foloseºte protocolul LDAP � Lightweight DirectoryAccess 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>

Page 278: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB278

Pe baza acestei iniþiative ºi a altora înrudite (precum WS-Eventing), poate ficonstituitã o infrastructurã de descoperire dinamicã sofisticatã, oferind suportpentru managementul serviciilor Web. Suplimentar, în conjuncþie cu UPnP(Universal Plug and Play), serviciile Web pot rula pe diverse tipuri de dispozitive,fiind regãsite în mod dinamic. De altfel, existã deja disponibil un ghid privitorla implementarea serviciilor Web pe calculatoare cu resurse limitate, precizându-seun profil minimal denumit WS-DP (Device Profile for Web Services).

2.4. Coordonarea serviciilor Web

Deoarece serviciile Web pot fi incluse într-o arhitecturã distribuitã complexã, sepune problema colaborãrii între diversele entitãþi software implicate pentru arezolva o anumitã problemã specificã (de exemplu, oferirea unei soluþii depetrecere a vacanþei de cãtre un sit de tip e-travel).

Orice colaborare presupune acceptarea unui contract (agreement). Pentrusistemele bazate pe transfer de mesaje � cazul serviciilor Web �, un contract, înforma cea mai simplã, presupune respectarea unui format comun de date (e.g.,specificat printr-o schemã XML), a unui stil de transmitere a mesajelor (unidirec-þional, cerere/rãspuns, notificare etc.) ºi a unei modalitãþi de descoperire aparticipanþilor la realizarea problemei. Aceasta implicã o activitate de coordonare.Cu cât interacþiunile dintre servicii sunt mai sofisticate, cu atât procesul decoordonare devine mai dificil. Modul de coordonare poate fi unul centralizat,implicând existenþa unui coordonator explicit cu rol de �ºef�, sau nu.

Iniþiativa WS-ReliableMessaging

Unul dintre aspecte importante este cel referitor la realizarea de comunicaþiifiabile. Necesitatea existenþei unui mecanism de asigurare a fiabilitãþii transferuluide date provine ºi din urmãtoarele presupuneri greºite pe care le au dezvoltatoriide aplicaþii privind un sistem distribuit (formulate de Peter Deutsch la începutulanilor �90 ai secolului trecut):

1. reþeaua este fiabilã (reliable);2. latenþa datelor este nulã;3. lãþimea de bandã e infinitã;4. reþeaua este sigurã (secure);5. topologia rãmâne neschimbatã;6. existã un singur administrator;7. costul transportului de date este zero;8. reþeaua este omogenã.

Page 279: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

279RETROSPECTIVÃ ªI PERSPECTIVE

În contextul serviciilor Web (exemple tipice de componente ale unui sistemdistribuit), se poate folosi specificaþia WS-ReliableMessaging, redactatã de cãtreIBM. Scopul acestui document este cel de a stabili un protocol care sã permitãlivrarea în siguranþã a mesajelor, chiar ºi în prezenþa unor erori (failures) alecomponentelor software, ale platformei utilizate ori ale reþelei.

Pe baza unor informaþii suplimentare ataºate în antetul mesajelor SOAP,datele pot fi grupate în secvenþe. Secvenþa de mesaje este stabilitã de cãtreexpeditor, iar ordinea trebuie sã fie respectatã atunci când secvenþa ajunge ladestinatar (nodul ultimateReceiver). Partenerii dialogului trebuie sã accepte con-tractul privitor la secvenþa de mesaje vehiculate. Iniþierea unei secvenþe are locprin operaþia CreateSequence, iar partenerul dialogului îºi va arãta disponibilitateaprintr-un rãspuns CreateSequenceResponse. Aceastã abordare nu necesitã prezenþaunui coordonator explicit. Fiabilitatea este asiguratã prin confirmarea fiecãruimesaj în parte via elementele Sequence, SequenceFault, SequenceAcknowledgement ºiAckRequested.

Liniile de mai jos reprezintã confirmarea mesajelor de la 1 la 7 ºi de la 9 la10 dintr-o secvenþã (mesajul 8 nu a fost confirmat încã):

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rm= "http://schemas.xmlsoap.org/ws/2005/02/rm"> <env:Header> ... <rm:SequenceAcknowledgment> <rm:Identifier> ... </rm:Identifier> <rm:AcknowledgmentRange Upper="7" Lower="1" /> <rm:AcknowledgmentRange Upper="10" Lower="9" /> </rm:SequenceAcknowledgment> </env:Header> <env:Body> ... </env:Body></env:Envelope>

Protocolul este neutru în ceea ce priveºte infrastructura de transport folositãefectiv. Transferul datelor trebuie sã respecte diverse precondiþii (una fiind, deexemplu, ordinea mesajelor vehiculate). La nivelul HTTP, o iniþiativã este HTTPR(Reliable HTTP).

Page 280: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB280

Coordonarea explicitã a serviciilor Web

O tranzacþie reprezintã un mecanism care asigurã cã toþi participanþii din cadrulunei aplicaþii vor obþine acelaºi rezultat, conform unui contract (agreement) mutualagreat. În mod tradiþional, o tranzacþie care are proprietãþile de mai jos (întâlnitesub denumirea de ACID � Atomicity, Consistency, Isolation, Durability) se numeºteatomicã:

� atomicitate � tranzacþia se încheie cu succes dacã toate acþiunile pe careaplicaþia trebuie sã se realizeze în cadrul tranzacþiei au putut avea loc; în cazcontrar, tranzacþia eºueazã ºi nici una dintre acþiuni nu va fi executatã(insuccesul unei singure operaþii va cauza invalidarea execuþiei tuturor acþiu-nilor din cadrul tranzacþiei);

� consistenþã � tranzacþiile vor produce întotdeauna rezultate consistente ºi vorpãstra transformãrile de stare ale aplicaþiei la terminare;

� izolare � stãrile intermediare ce apar în timpul desfãºurãrii unei tranzacþii vorfi invizibile pentru alte tranzacþii; tranzacþiile apar ca fiind executate secvenþial,chiar dacã sunt realizate în manierã concurentã; aceasta se poate realiza prin�încuierea� (locking) resurselor pe durata desfãºurãrii tranzacþiei, astfel încâtnici o altã tranzacþie sã nu aibã posibilitatea folosirii lor, evitându-se posibileleconflicte de acces;

� durabilitate � dupã ce o tranzacþie se finalizeazã cu succes, schimbãrilesurvenite pot fi gestionate pânã la apariþia unei erori catastrofale.

Un exemplu de tranzacþie este cel referitor la oferta unui serviciu de turism,care implicã existenþa unui agent (travel agent) având rolul de a rezerva bilete laavion (sau tren, autocar etc.), de a închiria diverse mijloace de transport ladestinaþie, de a rezerva o camerã la un hotel ºi, eventual, de a pune la dispoziþieºi alte servicii (e.g., angajarea unui ghid ori programarea unui tur de vizitare alocalitãþii respective). Eºuarea uneia dintre activitãþile ce compun tranzacþia (deexemplu, imposibilitatea gãsirii unei soluþii de cazare) conduce la abandonareaîntregului serviciu.

În contextul serviciilor Web, compunerea unuia sau mai multor serviciiconduce la constituirea aplicaþiilor tranzacþionale ale cãror componente sunt slabconectate ºi distribuite pe sisteme eterogene ºi independente. Astfel, uneleproprietãþi ale tranzacþiilor atomice pot fi aplicate, în diverse situaþii, mai puþinstrict.

Intervine necesitatea existenþei unui mecanism flexibil de coordonare, care sãpermitã colaborãri, fluxuri de lucru (workflow), procesare în timp real etc. În

Page 281: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

281RETROSPECTIVÃ ªI PERSPECTIVE

unele situaþii, aceastã coordonare trebuie realizatã explicit, interacþiunea avândloc uzual între doi participanþi (desigur, putem generaliza la un numãr oarecarede pãrþi componente). Coordonarea se poate desfãºura spontan � aºa cum seîntâmplã la un schimb sincronizat de mesaje de tip cerere/rãspuns (invocareaunui serviciu ºi obþinerea rezultatului) � sau printr-un coordonator. Pentruaceastã a doua situaþie, a fost propusã specificaþia WS-Coordination, având dreptiniþiatoare companiile BEA, IBM ºi Microsoft. Se precizeazã un cadru de lucruextensibil care sã ofere protocoale pentru coordonarea acþiunilor desfãºurate deaplicaþiile distribuite.

Specificaþia introduce conceptul de context de coordonare (Coordination Context),care apare într-un bloc antet SOAP ºi care identificã unic o activitate ce trebuiedesfãºuratã în comun. Pentru a iniþia o activitate executatã de mai multe servicii,un serviciu Web va expedia un context de coordonare la serviciile vizate.Contextul va conþine informaþiile necesare pentru ca o entitate sã decidã dacãdoreºte sã ia parte la activitatea preconizatã sau sã refuze propunerea. Acesteinformaþii depind de specificul activitãþii. Mulþimea tipurilor de coordonare estedeschisã, noile tipuri putând fi definite de o anumitã implementare, atât timp câttoþi participanþii le cunosc ºi consimt sã le foloseascã. Comportamentul unuianumit serviciu este expus prin intermediul unui proces de înregistrare (registration)transmis coordonatorului. Pe baza înregistrãrii, pentru a rezolva o problemã datãpoate fi invocat un întreg grup de servicii.

De asemenea, serviciul coordonator are astfel posibilitatea sã orchestrezeserviciile Web (vezi secþiunea 2.9) ºi/sau sã realizeze tranzacþii.

Interacþiunile de tip B2B (Business-to-Business) se pot desfãºura conformurmãtoarelor protocoale definite de WS-Coordination:

� tranzacþie atomicã (atomic transaction) � corespunde tranzacþiilor cu proprietãþileACID menþionate mai sus ºi e specificatã de WS-AtomicTransaction (vezi infra);

� intra-enterprise � în cadrul aceleaºi organizaþii (domeniu), tranzacþiile au locatomic de-a lungul variatelor aplicaþiilor interne;

� inter-enterprise � reprezintã activitatea de bazã desfãºuratã în context B2B,necesitând un grad mare de inter-operabilitate cu sistemele tranzacþionaleexistente;

� activitate de afaceri (business activity) � necesitã o flexibilitate sporitã a com-ponentelor sistemului faþã de cerinþele stricte ale tranzacþiilor atomice (ACID).Interacþiunile pot avea loc timp îndelungat, iar serviciile sunt de cele maimulte ori slab conectate. Restricþiile privind atomicitatea ºi izolarea suntrelaxate. Acest model are legãturã ºi cu maniera de realizare a proceselor deafaceri.

Page 282: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB282

Realizarea tranzacþiilor atomice

Pentru specificarea tranzacþiilor atomice în contextul serviciilor Web, existãdisponibilã iniþiativa WS-AtomicTransaction.

Iniþierea unei procesãri de date (vãzutã ca o unitate atomicã) are loc prinprotocolul numit Completion. Un serviciu Web înregistrat pentru Completion areabilitatea de a înºtiinþa coordonatorul atunci când iniþiazã o tranzacþie. Deasemenea, acest protocol defineºte forma mesajelor ce pot fi folosite pentru acomunica rezultatul final al tranzacþiei iniþiatorului acesteia.

Specificaþia WS-AtomicTransaction pune, de asemenea, la dispoziþie ºi protocolulnumit Two-Phase Commit. Toþi participanþii înregistraþi trebuie sã ia în comundecizia de a duce pânã la capãt (commit) o tranzacþie ori de a o abandona.Suplimentar, protocolul asigurã faptul cã toþi participanþii vor fi anunþaþi asuprarezultatului final. Sunt definite douã variante ale protocolului: una volatilã ºicealaltã durabilã. Protocolul volatil poate fi folosit de participanþi care deþinresurse volatile (e.g., cache), pe când cel durabil este destinat participanþilor avândresurse considerate durabile (precum baze de date ori fiºiere).

Inter-operabilitatea este asiguratã graþie folosirii protocolului SOAP. Politicilede efectuare a tranzacþiilor pot fi specificate prin intermediul WS-Policy, iaraspectele legate de securitate sunt lãsate în seama propunerilor WS-Security ºiWS-Trust, pe care le vom prezenta mai jos.

În conjuncþie cu WS-BusinessActivity, pot fi implementate tranzacþii care sedesfãºoarã timp îndelungat (de exemplu, procesãri complexe).

Managementul cozilor de mesaje

Deseori, mai ales în contextul transmiterii asincrone de mesaje, apare necesitateautilizãrii cozilor (queues) de tranzacþii durabile. Comunicarea între entitãþileparticipante are loc via cozi de mesaje (MQ � Message Queue). Aplicaþia careexpediazã datele le plaseazã � în maniera unei tranzacþii atomice (viaWS-AtomicTransaction) � într-o coadã. Mesajul se considerã stocat cu succes încadrul cozii doar dacã nu apare nici o excepþie de procesare (adicã tranzacþia nua eºuat).

Subsistemul de management al cozilor va avea misiunea de livrare a mesajuluiemis de expeditor cãtre destinatarul final. Acest proces poate fi desfãºurat la unmoment de timp diferit de cel al includerii mesajului în coadã. De asemenea,locaþia cozii de mesaje nu trebuie sã coincidã cu cea a expeditorului ori adestinatarului.

Page 283: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

283RETROSPECTIVÃ ªI PERSPECTIVE

Aplicaþia care preia mesajul din cadrul cozii va realiza acest lucru printr-otranzacþie atomicã, astfel încât datele vor fi livrate cu succes (ºi eliminate dincoadã) doar în cazul în care nu apar excepþii de procesare la nivelul destinatarului.

2.5. Accesarea resurselor serviciilor Web

În unele situaþii, schimbul de mesaje între un serviciu ºi clienþii sãi presupune undialog mai complex decât o simplã pereche cerere-rãspuns. De exemplu, potapãrea cazuri în care este nevoie de specificarea transferului unor interogãri debaze de date, fluxuri de informaþii multimedia, liste de enumerare a unor valori etc.

Deoarece HTTP este un protocol lipsit de stãri (stateless), nu se poate cunoaºtedacã diverse cereri succesive provin de la acelaºi client. Apare necesitatea de aprezerva anumite date de-a lungul mai multor accesãri înrudite ale unui serviciuWeb. Acest aspect se realizeazã prin intermediul sesiunilor, exact ca ºi în cazulaplicaþiilor Web convenþionale.

Pentru enumerarea datelor via mesaje succesive, se va stabili o sesiune prinoperaþia Enumerate, precizatã de specificaþia WS-Enumeration. De asemenea, acestdocument defineºte ºi modul de accesare a secvenþelor de date. Sesiunea estedeclaratã la nivel abstract prin intermediul unui context de enumerare (enumerationcontext), care reprezintã un cursor logic ce parcurge o secvenþã de informaþiioferite de o anumitã sursã de date (sistem de baze de date relaþionale, server debaze de date native XML etc.). Aceste date, reprezentate via XML Infoset, vor filivrate printr-o succesiune de mesaje SOAP.

Cea mai simplã operaþie este Pull, care permite ca o sursã de date, într-unanumit context de enumerare, sã producã o secvenþã de elemente XML (repre-zentate intern prin Infoset) încapsulate în corpul unui mesaj SOAP. Fiecareoperaþie Pull ce va urma va întoarce urmãtoarele N elemente din cadrul secvenþei.

Conform WS-Enumeration, se pun la dispoziþie ºi operaþiile:

� Renew � utilizatã sã extindã validitatea unui context de enumerare (reîm-prospãteazã o sesiune);

� GetStatus � oferã informaþii privitoare la un context de enumerare;� Release � elibereazã resursele deþinute în cadrul unei sesiuni ºi eliminã un

context de enumerare.

În caz de eroare (enumerarea s-a terminat neprevãzut), sursa de date vatransmite un mesaj de tip EnumerationEnd.

În conjuncþie cu specificaþia prezentatã mai sus, poate fi folositã WS-Transfer,care are în responsabilitate definirea operaþiilor de bazã privitoare la mana-gementul entitãþilor de date vehiculate via servicii Web.

Page 284: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB284

WS-Transfer defineºte resursa ca fiind orice entitate adresabilã de o referinþã aunui punct terminal, entitate ce oferã o reprezentare XML a datelor. Deasemenea, se introduce conceptul de fabricã (factory): un serviciu Web care poate�construi� o resursã având la dispoziþie reprezentarea ei XML.

Sunt specificate operaþii privitoare la crearea, actualizarea, obþinerea ºi ºter-gerea resurselor (operaþii de tip CRUD � Create, Retrieve, Update, Delete). Creareaunei resurse este realizatã de o fabricã, aceasta constituind resursa doritã ºistabilind reprezentarea sa iniþialã.

Ilustrãm în continuare modalitatea de creare a unei resurse privitoare laachiziþia unui sortiment de portocale:

<env:Envelope> <env:Header> <!-- acþiunea realizatã --> <wsa:Action> http://schemas.xmlsoap.org/ws/2004/09/transfer/Create </wsa:Action> ... </env:Header> <env:Body> <p:portocale p:xmlns="urn:portocale.info"> <p:achizitii> <p:tip>Portocale greceºti fãrã coajã</p:tip> <p:cod>P10-01-GR</p:cod> <p:cantit p:um="kg">3374</p:cantit> </p:achizitii> </p:portocale> </env:Body></env:Envelope>

Dacã transferul de date se desfãºoarã în mod asincron, posibilele evenimente,ce pot surveni pot fi tratate prin intermediul mecanismului oferit de WS-Eventing.Un serviciu Web (numit subscriber) îºi precizeazã lista evenimentelor asupracãrora este interesat (ºi va fi notificat), evenimente generate de alt serviciu Web(denumit event source). Sunt precizate ºi operaþiile ce pot fi efectuate asupraevenimentelor sau grupurilor de evenimente. De asemenea, pot exista ºi entitãþide tip broker de evenimente cu rolul de a agrega ori redistribui notificãri deevenimente.

La finalul acestei secþiuni, trebuie sã amintim ºi iniþiativa WS-Management, careoferã diverse facilitãþi referitoare la managementul serviciilor Web (inclusiv alresurselor transferate sau al evenimentelor de comunicare) pe baza protocoluluiSOAP.

Page 285: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

285RETROSPECTIVÃ ªI PERSPECTIVE

2.6. Accesarea meta-datelor asociate serviciilor

Pentru a facilita dezvoltarea ºi exploatarea serviciilor Web, fiecãrui astfel deserviciu i se pot asocia, prin intermediul meta-datelor, diverse descrieri adiþionale.Meta-datele sunt specificate într-un format uºor de procesat de cãtre calculator,oferind suport pentru automatizarea activitãþilor de implementare sau de regãsirea serviciilor. De asemenea, meta-datele pot fi de folos pentru creºterea graduluide inter-operabilitate a serviciilor.

Meta-datele descriu maniera schimbului de mesaje, funcþionalitãþile ºi cerinþele(requirements) asociate unui serviciu. Aceste cerinþe formeazã aºa-numita politicã(policy) de acces. Formatele de date ºi ºabloanele de interschimb de mesaje suntspecificate în cadrul documentelor WSDL, dupã cum am vãzut în capitolul 2.Politicile de acces sunt subiectul specificaþiei WS-Policy.

Întreg setul de meta-date formeazã aºa-numitul contract asociat serviciului,contract exprimat prin construcþii (elemente) XML Schema, WSDL ºi WS-Policy(a se vedea ºi figura 4).

Figura 4. Categoriile de meta-date care formeazã contractul asociat unui serviciu Web

Documentele WSDL nu sunt capabile sã ofere posibilelor entitãþi de calculsau dezvoltatorilor de aplicaþii informaþii privitoare la diverse caracteristicioperaþionale, de securitate sau referitoare la exploatarea serviciilor Web. Deexemplu, ar fi util de cunoscut dacã accesarea serviciului se realizeazã pe bazaunui sistem de autentificare obligatorie, ori dacã serviciul e disponibil doar întreanumite intervale de timp. Toate aceste meta-date pot fi exprimate via WS-Policype baza unui set extensibil de aserþiuni. Dacã WSDL se axeazã pe unele descrierifuncþionale asociate serviciilor Web, construcþiile WS-Policy permit ataºarea de

Page 286: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB286

descrieri non-funcþionale sau privitoare la asigurarea calitãþii serviciilor. Alteaspecte, precum cele referitoare la semantica serviciilor Web, vor putea fimodelate de cãtre alte prevederi (e.g., OWL-S). De asemenea, setul de politiciexprimate de WS-Policy nu vizeazã doar punctele terminale, aºa cum se întâmplãîn cazul WSDL.

Oferim drept exemplificare urmãtorul fragment de document XML careprecizeazã cã un serviciu Web nu va fi disponibil între orele 10 ºi 11 în ziua deduminicã a fiecãrei sãptãmâni (politica efectivã se exprimã printr-un vocabularXML definit de noi, aparþinând spaþiului de nume �s�):

<wsp:Policy> <wsp:All> <s:PlanificareRevizie> <s:Oprire s:ziua="Duminica" s:start="1000" s:final="1100" /> </s:PlanificareRevizie> </wsp:All></wsp:Policy>

Diversele politici de acces pot fi ataºate serviciilor prin intermediul WS-PA(WS-PolicyAttachment). Maniera de interschimb de meta-date este precizatã despecificaþia WS-MEX (WS-MetadataExchange), meta-datele putând fi specificateîn diverse aºa-numite dialecte (XML Schema, WSDL, WS-Policy etc.). Un exemplude cerere de furnizare a meta-datelor privitoare la politicile de acces esteurmãtorul:

<wsx:GetMetadata> <wsx:Dialect> http://schemas.xmlsoap.org/ws/2002/12/policy </wsx:Dialect></wsx:GetMetadata>

2.7. Securitatea serviciilor Web

Aspecte generale privind securitatea

Securitatea joacã un rol esenþial în dezvoltarea serviciilor Web. În mod general,aspectele privind securitatea datelor iau în consideraþie confidenþialitatea, auten-tificarea, autorizarea, integritatea, nerepudierea, intimitatea (privacy) ºi dispo-nibilitatea.

Confidenþialitatea se referã la imposibilitatea unei terþe entitãþi sã aibã acces ladatele vehiculate între doi receptori. O soluþie ar fi aceea a constituirii uneiconexiuni private între cele douã puncte terminale ale canalului de comunicaþie,

Page 287: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

287RETROSPECTIVÃ ªI PERSPECTIVE

datele circulând printr-un tunel oferit de o reþea privatã virtualã (VPN � VirtualPrivate Network). A doua soluþie este oferitã de criptarea datelor prin intermediulunei suite de tehnici, implementate de biblioteci specializate ºi/sau oferite demediile de dezvoltare existente.

În unele situaþii, precum cele din domeniul e-business, accesul la serviciul Webnu trebuie sã fie public, acordat oricui. Autentificarea presupune un mecanismcare permite utilizatorilor sã acceseze un serviciu dupã verificarea identitãþiiutilizatorului (în general, pe baza unui nume de cont ºi a unei parole furnizatede acel utilizator). De cele mai multe ori, serverul Web oferã suport pentruautentificãri de bazã sau bazate pe algoritmi de tip digest, precum MD5. În cazulserviciilor Web, existã însã iniþiative speciale, precum SAML (Security AssertionMarkup Language) � vezi infra.

Autorizarea este asociatã autentificãrii ºi specificã acþiunile (rolurile) pe care unutilizator poate sã le realizeze. Un utilizator autentificat poate sã nu fie în modimplicit ºi autorizat sã aibã acces la o anumitã resursã a sistemului. Sistemele deautorizare permit administratorului sã defineascã politici pentru controlul acce-sului la servicii. În mod tradiþional, se folosesc drepturi de acces (permisiuni) ºiliste de control al accesului (ACL � Access Control List), utilizatorii fiind clasificaþipe grupuri sau roluri. Prin intermediul controlului accesului bazat pe roluri(RBAC � Role-Based Access Control), sistemul de management al securitãþii poatefi mai uºor mulat pe structura organizaþiei. În ceea ce priveºte utilizatorul, înmod uzual se foloseºte o tehnicã de tip SSO (Single Sign-On), bazat pe existenþaunui singur procedeu de autentificare comunã pentru accesul la mai multeresurse (situri, servicii etc.).

Tehnicile de tip digest pot asigura ºi integritatea informaþiilor, fiind posibilãdetectarea oricãrei încercãri maliþioase de modificare a datelor transmise. Deasemenea, tot pentru realizarea integritãþii, pot fi folosite semnãturi digitale (a nuse confunda însã cu semnãturile electronice care se referã la totalitatea mijloacelorprin care o informaþie poate �purta� semnãtura proprietarului ei). Semnãturiledigitale pot fi stocate în format XML � ºi vehiculate, desigur, via mesaje SOAP �prin intermediul specificaþiei XML Signature.

Nerepudierea asigurã faptul cã expeditorul mesajului nu poate afirma cã nu l-atrimis. Pentru aceasta se folosesc certificate digitale, care stocheazã datele privindidentitatea unei entitãþi deþinãtoare a unui secret (o parolã, o serie a unei cãrþi decredit, a certificatului digital în sine etc.). Certificate digitale sunt disponibileîntr-un format precum X.500. Un certificat digital este emis de o autoritate decertificare (CA � Certification Authority), iar verificarea certificatelor se realizeazãde cãtre o autoritate de înregistrare a acestora (RA � Registration Authority). Cata-loagele de certificate, împreunã cu autoritãþile de certificare (CA) ºi înregistrare

Page 288: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB288

(RA) formeazã aºa-numita infrastructurã cu chei publice (PKI � Public Key Infrastructure).Oferirea de servicii PKI în contextul spaþiului Web se poate realiza via XKMS(XML Key Management Specification).

Disponibilitatea impune ca o anumitã resursã sã poatã fi accesatã la momentuloportun. Un serviciu Web indisponibil clienþilor sãi pur ºi simplu nu existã, ceeace are repercusiuni negative mai ales în contextul afacerilor electronice. Printrecauzele care pot eroda disponibilitatea se enumerã atacurile de refuz al serviciilor �DoS (Denial Of Service) sau DDoS (Distributed DoS). Atacurile distribuite suntdeosebit de periculoase pentru asigurarea disponibilitãþii serviciilor Web publice.

Intimitatea este deseori confundatã cu confidenþialitatea. Confidenþialitateapresupune imposibilitatea ca datele aflate în tranzit sã fie accesate de persoanerãu-voitoare, pe când intimitatea vizeazã drepturile ce trebuie respectate privindcaracterul (subiectul) datelor vehiculate. Multe dintre vulnerabilitãþile raportateîn domeniul comerþului electronic sunt de fapt breºe în sistemul de asigurare aintimitãþii utilizatorilor. Pentru datele transportate pe Internet sunt adoptate înmod unanim diverse tehnici de criptare, dar la nivel de server ar putea sã fiestocate necorespunzãtor (de exemplu, în clar) în cadrul unui sistem de stocarevulnerabil. Un atacator va avea astfel acces la seria cãrþii de credit a unui client,pe baza unei conexiuni directe cu serverul de baze de date sau a unui tehnici detip XSS (Cross-Site Scripting). Alte probleme vizând pierderea intimitãþii suntcauzate de configurarea necorespunzãtoare a sistemelor � detalii ºi în cartea luiSabin Buraga, Proiectarea siturilor Web (ediþia a doua), Polirom, Iaºi, 2005.

Niveluri de securitate

Vom face mai jos o scurtã trecere în revistã a cerinþelor de securitate pe caretrebuie sã le îndeplineascã serviciile Web.

Construirea unor servicii Web sigure (din punctul de vedere al securitãþii)trebuie sã ia în considerare aspecte ca:

� realizarea unui model (Web Services model) care are la bazã o analizã detaliatã afactorilor care ameninþã comunicarea ºi punctele terminale (endpoints) aleserviciilor Web;

� existenþa unui cadru de lucru (framework) facilitând securizarea resurselor, uºorintegrabil într-o arhitecturã orientatã spre servicii;

� asigurarea unui mecanism de autentificare ºi autorizare a pãrþilor care comu-nicã în cadrul sistemului constituit.

Majoritatea scenariilor de securitate sunt legate de securitate la nivel de reþea/transport, securitate la nivel de date ºi integritate la nivel de mesaj.

Page 289: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

289RETROSPECTIVÃ ªI PERSPECTIVE

La nivel de reþea, mijlocul de protecþie generalã împotriva incidentelor desecuritate se concretizeazã în aºa-numitul zid de protecþie (firewall). Deoareceserviciile Web folosesc în mod nativ protocolul HTTP, mesajele vehiculate vorputea traversa Internetul fãrã aportul filtrelor impuse de firewall-uri (acesta este,de fapt, ºi unul dintre avantajele serviciilor Web faþã de tehnologiile CORBA sauDCOM). Totuºi, firewall-urile vor fi de folos pentru stãvilirea altor tipuri deatacuri, de nivel inferior (e.g., inundãri cu pachete). De asemenea, la nivel dereþea poate fi folosit protocolul IPSec (IP Secure).

În ceea ce priveºte nivelul de transport, se recurge la SSL (Secure Sockets Layer)ºi la versiunea mai recentã, standardizatã, TLS (Transport Layer Security). Acesteprotocoale sunt folosite pentru autentificarea ºi confidenþialitatea mesajelorHTTP. Autentificarea se realizeazã via certificate digitale, iar confidenþialitateaprin criptare. Datele HTTP securizate via SSL/TLS fac obiectul specificaþieiHTTPS, portul folosit fiind 443, în loc de cel implicit � 80.

La nivel de aplicaþie, în primul rând se poate utiliza S/MIME (SecureMIME), soluþie pentru asigurarea confidenþialitãþii, integritãþii ºi nerepudieriiîn cazul mesajelor de poºtã electronicã. Dacã se adoptã o metodã de transferSOAP peste SMTP, atunci S/MIME poate fi atractiv ºi în cazul serviciilorWeb.

Pentru HTTP sau alte protocoale (e.g., Jabber), un prim deziderat este sã seofere o securitate persistentã a mesajelor SOAP transportate. Tehnologiileamintite mai sus vizeazã o securitate exterioarã. Includerea de informaþii privindsecuritatea în cadrul unui mesaj SOAP este subiectul specificaþiei WS-Security,actualmente standard OASIS. WS-Security defineºte metode speciale de inserarea datelor criptate sau a semnãturilor digitale în anteturile SOAP. În plus, se oferãsuport pentru includerea de jetoane (tokens) de securitate arbitrare. Alte detaliivor fi furnizate mai târziu în cadrul acestui capitol.

Securitatea în contextul XML

Confidenþialitatea este asiguratã via XML Encryption, specificaþie a ConsorþiuluiWeb, care oferã mijloacele pentru criptarea unor porþiuni din documentele XMLºi stocarea datelor criptate în format XML. XML Encryption poate fi benefic încontextul serviciilor Web, datoritã abilitãþii criptãrii doar a unor fragmente XML.Mesajele SOAP pot include informaþii care trebuie sã rãmânã publice (privitoarela dirijare, de exemplu), dar pot conþine ºi pãrþi criptate. Standardul XMLEncryption nu introduce noi algoritmi de criptare, putând fi folosiþi cei dejaconsacraþi, ci doar specificã anumite meta-date referitoare la aceºtia ºi la modulde utilizare într-un context dat.

Page 290: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB290

Un exemplu de criptare a informaþiilor privitoare la cartea de credit a unuiutilizator este urmãtorul (numele clientului e public, dar celelalte informaþiiprivate sunt criptate � în acest caz, se folosesc ºi semnãturi digitale):

<?xml version='1.0'?><plata xmlns='http://portocale.info/Plati'> <nume>Portocal Escu</nume> <EncryptedData Id='EData' xmlns='http://www.w3.org/2001/04/xmlenc#'> <EncryptionMethod Algorithm= 'http://www.w3.org/2001/04/xmlenc#aes128-cbc'/> <ds:KeyInfo xmlns:ds= 'http://www.w3.org/2000/09/xmldsig#'> <ds:RetrievalMethod URI='#EKey' Type= "http://www.w3.org/2001/04/xmlenc#EncryptedKey"> <ds:KeyName>SymmetricKey</ds:KeyName> </ds:RetrivalMethod> </ds:KeyInfo> <CipherData> <CipherValue>pj3io2sa25fF</CipherValue> </CipherData> </EncryptedData></plata>

Pentru rezolvarea integritãþii, avem la dispoziþie XML Signature, specificaþiecomunã a Consorþiului Web ºi a IETF (Internet Engineering Task Force). Ca mai sus,se oferã atât posibilitatea semnãrii digitale a unor porþiuni dintr-un documentXML, cât ºi exprimarea în XML a informaþiilor referitoare la semnãturiledigitale. Modul de integrare a elementelor XML Signature în cadrul mesajelorSOAP este detaliat de specificaþia WS-Security.

Problemele de autentificare ºi autorizare în contextul serviciilor Web seîncearcã a fi rezolvate de o suitã de tehnologii. Diverse declaraþii privitoare laanumite aspecte legate de securitate pot fi exprimate cu ajutorul SAML (SecurityAssertions Markup Language), standardizat de OASIS. Limbajul SAML poate fi defolos ºi pentru stocarea unor informaþii privitoare la utilizatorul final (e.g.,precizarea unei limite inferioare a unui depozit bancar în cazul unui serviciu decreditare). SAML este utilizat mai ales pentru a specifica informaþii referitoare laautentificare sau autorizare care s-au întâmplat în trecut, permiþând ca acesteinformaþii sã fie plasate într-un mesaj SOAP (de exemplu, �persoana P a fostautorizatã conform unor politici de acces A la momentul M�). Dacã destinatarulacelui mesaj are încredere în aserþiunea (assertion) semnalatã prin SAML, poatepermite utilizatorului sã aibã acces la serviciul Web dorit.

Page 291: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

291RETROSPECTIVÃ ªI PERSPECTIVE

Figura 5. Procesul de criptare/descriptare a mesajelor SOAP

Drept exemplificare, furnizãm urmãtorul fragment de document, care pre-cizeazã cã autentificarea utilizatorului blue.ory s-a realizat cu succes, pe bazametodei 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>

Page 292: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB292

Suplimentar, pentru a exprima regulile de control al accesului în termeniiXML, putem recurge la XACML (Extensible Access Control Markup Language).Decizia de autorizare modelatã printr-o aserþiune SAML poate fi bazatã peregulile stipulate via XACML. Regulile pot desemna politici de acces la resurse(citire, scriere, execuþie etc.) bazate pe diverse caracteristici ale entitãþii în cauzã(e.g., �lista clienþilor poate fi parcursã doar de membrii departamentului devânzãri�) sau ale protocolului (�invocarea serviciului Web se poate realiza numaivia HTTPS�). De asemenea, XACML poate fi folosit ºi la managementuldrepturilor digitale � DRM (Digital Rights Management).

Specificaþia XKMS (XML Key Management Specification) oferã suportul pentrugestiunea cheilor publice via XML. Astfel, în mod natural, serviciile PKI �recunoscute a fi dificil de implementat � pot fi puse la dispoziþie mai facil, graþieserviciilor Web. Recomandarea XKMS presupune existenþa a douã servicii Web:

� X-KRSS (XML Key Registration Service Specification) trebuie sã ofere suportpentru managementul ciclului de viaþã al acreditãrilor (credentials) asociatecheilor publice;

� X-KISS (XML Key Information Service Specification) expune metode de interogarepentru obþinerea ºi validarea cheilor publice.

Protocolul XKMS este în strânsã legãturã cu SOAP, fiind de tip cerere--rãspuns. De asemenea, se oferã facilitãþi pentru procesãri asincrone ºi formulareade cereri compuse. Via XKMS, complexitatea vireazã de la client la intrastructurã,codul de implementat fiind mult mai simplu.

Securizarea serviciilor Web. Tehnologii ºi standarde

Tehnologiile prezentate mai sus nu se focalizeazã în principal asupra securitãþiiserviciilor Web, ci iau în consideraþie ºi securitatea datelor XML.

Pentru securizarea mesajelor SOAP a fost redactat un set de specificaþiipurtând numele WS-Security, efort comun al corporaþiilor IBM ºi Microsoft,actualmente standardizat de OASIS. Aspectele de securitate nu mai vizeazã înmod obligatoriu protocolul folosit (e.g., HTTP cu TLS), ci se situeazã la nivelulmesajelor, în termeni de asigurare a integritãþii, confidenþialitãþii ºi autentificãrii.WS-Security include ºi alte specificaþii, precum WS-Trust (pentru asigurareaîncrederii), WS-SecurityPolicy (privitoare la politici de acces sigur) ºi WS-Privacy(pentru asigurarea intimitãþii). La un nivel superior, se aflã WS-SecureConversation(având în vedere siguranþa conversaþiilor între serviciile Web), WS-Federation(vizând gruparea serviciilor într-o federaþie partajând aceleaºi politici de securi-tate) ºi WS-Authorization (oferind suport pentru metode de autorizare sofisticate).

Page 293: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

293RETROSPECTIVÃ ªI PERSPECTIVE

Figura 6. Diversele aspecte privind securitatea serviciilor Web sunt specificate pe niveluri

WS-Trust defineºte modul de stabilire a relaþiilor de încredere într-un sistem.Aceste relaþii pot avea loc direct sau prin intermediari (brokeri). Intermedierearelaþiilor de încredere se realizeazã printr-un proxy de încredere (trust proxy). Deasemenea, se permit mecanisme pentru delegare (delegation) ºi impersonalizare(impersonation).

Prevederile WS-SecurityPolicy pot fi utilizate pentru formularea unor politici desecuritate pe baza limbajului WS-Policy.

WS-Privacy foloseºte WS-SecurityPolicy, WS-Security ºi WS-Trust pentru a realizaschimburi de mesaje conform unor reguli de asigurare a intimitãþii.

Specificaþia WS-SecureConversation permite ca un solicitant ºi un ofertant deservicii Web sã stabileascã un context de autentificare mutualã prin mesajeSOAP.

WS-Federation duce securitatea la nivel de federaþie de servicii Web, unde�federaþie� presupune inter-operabilitatea diverselor strategii ºi specificaþii desecuritate folosite de o suitã de servicii Web, care formeazã un domeniu deîncredere. WS-Federation poate fi folosit ºi în contextul EASI (Enterprise ApplicationSecurity Integration).

WS-Authorization poate fi considerat complementar XACML, descriind manierade specificare ºi de management al politicilor de acces la serviciile Web.

Din punct de vedere tehnic, WS-Security presupune existenþa într-un mesajSOAP a unui bloc antet Security care trebuie sã aibã prevãzut atributul mustUnderstandcu valoarea true:

<Envelope> <Header> ... <Security role="http://www.portocale.info/Plati" mustUnderstand="true">

Page 294: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB294

... </Security> ... </Header> ...</Envelope>

Dacã un nod SOAP este incapabil sã proceseze blocul privitor la securitateamesajului, atunci mesajul va fi distrus. Deoarece un mesaj poate include maimulte blocuri Security, vom indica prin atributul role cãrui serviciu Web îi suntadresate informaþiile de securitate din fiecare bloc în parte. Conþinutul propriu-zisal elementului Security va consta din jetoane (tokens) de securitate, precumUsernameToken (referitor la autentificare prin SAML ori alte tehnici) ºiBinarySecurityToken (privitor la diverse date criptate, exprimate cu XML Signature,XML Encryption sau altfel).

De asemenea, se precizeazã ºi diverse scenarii de manipulare a erorilorsurvenite via elementul Fault oferit de SOAP.

Actualmente, unul dintre cele mai versatile instrumente care suportã WS-Securityeste extensia WSE (Web Services Enhancements) versiunea 3.0 pentru .NET Framework.De exemplu, criptarea unui mesaj SOAP prin folosirea unui certificat digital înformat X.509 (care trebuie sã se gãseascã pe fiecare calculator al clientului cesolicitã o informaþie confidenþialã de la serviciul Web) poate fi realizatã astfel:

X509SecurityToken certificat = FurnizeazaCertificat();// adãugãm jetonul privitor la certificatserviciu.RequestSoapContext.Security.Tokens.Add (certificat);// inserãm un element EncryptedDataserviciu.RequestSoapContext.Security.Elements.Add( new EncryptedData(certificat));

Menþionãm cã WSE nu oferã doar facilitãþi în ceea ce priveºte securitateaserviciilor Web, ci ºi pentru adresare (WS-Addressing) ºi ataºare de alte informaþiila mesajele SOAP (WS-Attachments). Sunt puse la dispoziþie ºi diverse instrumenteutile ce pot fi integrate fãrã probleme în Visual Studio .NET. De asemenea, WSEfaciliteazã exploatarea serviciilor Web create în .NET ºi prin intermediul unorprotocoale diferite de HTTP.

Page 295: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

295RETROSPECTIVÃ ªI PERSPECTIVE

2.8. Asigurarea inter-operabilitãþii

Inter-operabilitatea vizeazã existenþa unei suite de tehnici ºi instrumente carepermit aplicaþiilor software (în cazul nostru, serviciile Web ºi clienþii aferenþi) sãcomunice indiferent de tehnologiile ºi platformele folosite. Mai mult decât atât,aplicaþiile pot partaja datele indiferent de manierele de reprezentare, de acces ºide tehnologia folositã la momentul rulãrii pentru managementul acestor date. Deasemenea, inter-operabilitatea presupune posibilitatea formãrii unei platformevirtuale de calcul, pe baza sistemelor de operare, mediilor de rulare (runtime) ºicomponentelor software trecute, prezente ºi viitoare.

Tehnologiile actuale menite a oferi sprijin pentru realizarea inter-operabilitãþiisunt WSIT (Web Services Interoperability Technology), JWSDP (Java Web ServicesDeveloper Pack), WSE (Web Services Enhancements) ºi WCF (Windows CommunicationFoundation). La momentul scrierii acestui material, JWSDP se aflã la versiunea 2.Dupã cum am menþionat în secþiunea anterioarã, WSE reprezintã o extensieoferitã de Microsoft pentru dezvoltarea de servicii Web securizate ºi inter-operabile pe platforma .NET, actualmente fiind disponibilã versiunea 3.0. WSEare la bazã specificaþii standardizate, precum WS-Security, WS-Addressing, WS-Policyºi WS-I. WCF � cunoscut anterior ºi sub numele Indigo � desemneazã una dintrecomponentele fundamentale ale noului sistem Windows Vista, menitã a oferi oinfrastructurã pentru comunicarea prin mesaje între diverse componente.

O iniþiativã importantã de standardizare referitoare la inter-operabilitateaserviciilor Web este WS-I (Web Service Interoperability), detalii fiind disponibile lahttp://www.ws-i.org.

Principalele avantaje ale inter-operabilitãþii sunt cele privind asigurarea inde-pendenþei de platformã, evoluþia bazatã pe standarde deschise ºi utilizareafamiliei XML. Printre slãbiciuni se numãrã problemele de performanþã, difi-cultatea gestionãrii per ansamblu a stãrii sistemului, problemele cauzate deincompatibilitatea datelor (data mismatch) din cauza interpretãrilor diferite alestandardelor implementate de diverºi ofertanþi. De asemenea, nu întotdeaunapoate fi folosit modelul cerere/rãspuns, mai ales în cazul unor aplicaþii caretrebuie sã fie executate în timp-real sau care necesitã transferuri de fluxuri deinformaþii (streaming).

Aspectele importante pe care trebuie sã le avem în vedere când concepemservicii Web care sã asigure o inter-operabilitate solidã se referã la:

� tipurile de date ºi schemele XML proiectate ºi folosite în cadrul documentelorWSDL (se recomandã ca, înainte de implementarea propriu-zisã a serviciului,sã se realizeze o analizã ºi proiectare corespunzãtoare a schemelor XML

Page 296: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB296

privitoare la mesajele vehiculate între serviciile Web ºi posibilii lor clienþi; deasemenea, o atenþie deosebitã trebuie acordatã documentului WSDL dedescriere a serviciului, deoarece este unicul mijloc prin care un dezvoltatorextern are acces la funcþionalitãþile serviciului în cauzã);

� alinierea la standardele în vigoare (mai ales la WS-I, prezentat mai jos);� controlul versiunilor (versioning);� compatibilitatea cu variantele anterioare ale instrumentelor folosite (de exemplu,

JWSDP 1.x/2.x versus WSE 2.0/3.0 sau WCF).

Etapa de proiectare vizeazã alegerea tipurilor de date, scrierea schemelorXML ºi stabilirea modului de tratare a erorilor. Primul pas este cel de definire aschemei XML, construcþiile folosite fiind cât mai simple posibil (a se evitaaspectele avansate privitoare la reprezentarea datelor via XML Schema). Tot aici,trebuie sã avem în vedere profilele de inter-operabilitate WS-I. Nu trebuie sãpresupunem cã tipurile de date vor fi verificate de clienþi, cã versiunea SOAPfolositã de diversele implementãri este ºi va rãmâne aceeaºi, cã transferurile dedate vor fi realizate doar în manierã sincronã. De asemenea, este posibil cainstrumentele utilizate sã nu fie compatibile între ele.

În faza de dezvoltare trebuie avute în vedere aspecte privind comunicaþiileasincrone, partajarea datelor/sesiunilor, mecanismul de mesagerie folosit ºisecuritatea.

La momentul exploatãrii în practicã, principalele probleme sunt cele legate deperformanþã ºi scalabilitate.

Inter-operabilitatea poate fi asiguratã ºi prin interpunerea unei componentede tip wrapper, care transformã mesajele clientului în formatul înþeles de cãtreserviciu ºi invers. Acest wrapper poate fi situat la nivel de server, la nivel de clientsau într-un strat intermediar. Existã situaþii în care se folosesc douã componentewrapper, una pe maºina clientului, cealaltã pe server. Soluþiile care permit realizareaacestui �pod� (bridging) de conectare a douã aplicaþii incompatibile folosesc fietehnologiile Java, fie .NET (via .NET Remoting).

Alternativ, inter-operabilitatea poate fi obþinutã graþie sistemelor messaging,folosind punþi de interconectare, adaptori, mesaje SOAP ori sisteme de mesagerieclasicã SMTP/POP/IMAP. În acest caz, comunicaþiile pot fi ºi asincrone.

Pentru aplicaþii compuse (composite applications), Sun propune o arhitecturãdenumitã �magistrala de servicii enterprise� � ESB (Enterprise Service Bus), constituitãdin componente pentru managementul ºi orchestrarea sofisticatã a tuturoractivitãþilor din cadrul unei organizaþii, asigurându-se inclusiv inter-operabilitatea.În viziunea Sun, ESB reprezintã o etapã evolutivã superioarã SOA, oferindu-sesuport pentru existenþa componentelor hibride, a unui management centralizat

Page 297: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

297RETROSPECTIVÃ ªI PERSPECTIVE

ºi a unor entitãþi middleware orientate spre mesaje. De asemenea, prin ESB seînlesneºte asigurarea scalabilitãþii.

Figura 7. Componentele ESB

În ce priveºte aplicaþiile compozite, ele sunt constituite din servicii reutilizabile,putând fi create uºor, frecvent ºi la cerere, conform cerinþelor afacerilor între-prinse. Aspectele statice, mai riguroase, ale aplicaþiei sunt separate de celedinamice, în evoluþie, conforme cu preferinþele utilizatorilor. Dacã Java poate filimbajul folosit la implementarea aplicaþiilor, compunerea serviciilor poate firealizatã prin BPEL4WS; a se urmãri cele discutate în secþiunea de mai jos.

Aliniate arhitecturii ESB, sunt disponibile atât produse comerciale � oferitede BEA, Cape Clear, IBM, Oracle ori Sun �, cât ºi aplicaþii open source � deexemplu, Celtix (IONA), FUSE (LogicBlase), Open ESB (Sun), Synapse (Apache)ºi ServiceMix (Apache).

Direcþiile de viitor vizeazã � ori, de fapt, viseazã? � unificarea platformelorJ2EE (Java 2 Enterprise Edition) ºi .NET. Astfel, pot fi adoptate extensii J2EE caresã permitã aplicaþiilor .NET sã ruleze pe un anumit server de aplicaþii Java. Deasemenea, poate fi constituit un strat de translatare la momentul compilãrii acodului din limbajul intermediar MSIL în secvenþe de bytecode Java ºi vice-versa.În acest mod, sistemul de operare poate gãzdui o unicã maºinã virtualã capabilãsã �înþeleagã� ambele tehnologii (instrucþiuni de nivel scãzut, sistem de tipuri dedate, componente etc.). Aplicaþiile .NET pot �consuma� resurse Java, în mod

Page 298: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB298

direct, ºi invers. Aceste maniere de inter-operabilitate sunt deja suportate deaplicaþii precum JBoss, Tomcat, WebLogic ºi WebSphere. De asemenea, VisualMainWin pentru J2EE reprezintã un plug-in Visual Studio care permite dez-voltatorilor sã scrie programe C# sau VB.NET (inclusiv servicii Web) care suntconvertite automat dupã compilare în bytecode Java.

Pe o idee oarecum similarã se bazeazã ºi noua versiune Perl 6, via maºinavirtualã Parrot, aflatã în plinã dezvoltare.

În ceea ce priveºte Java, noile versiuni J2SE 1.6 ºi J2EE 1.5 pun un accentpronunþat asupra asigurãrii inter-operabilitãþii. Un exemplu este ºi GlassFish,disponibil gratuit pentru utilizare, parte a proiectului Tango, al cãrui scop esteoferirea unei suite de tehnologii Web viitoare care sã permitã inter-operabilitateadintre aplicaþiile Java ºi cele WCF, pe baza strategiilor WSIT (Web ServicesInteroperability Technology) stipulate de corporaþia Sun.

Profilul WS-I de bazã

Pentru a nivela posibilele diferenþe între implementãrile oferite de diverselemedii de dezvoltare a serviciilor Web, organizaþia WS-I a redactat un prim profil �denumit profilul de bazã (WS-I Basic Profile) � la care trebuie sã se alinieze toateimplementãrile actuale. În prezent este în vigoare versiunea 1.1 a acestui profil.Una dintre prevederile majore ale profilului este aceea a interzicerii codificãrii înstilul RPC a mesajelor SOAP.

Pentru a indica faptul cã o implementare este conformã cu profilul de bazã,de cele mai multe ori se recurge la specificatori (meta-date) precum cei daþi maijos (aici, pentru .NET):

[WebService][WebServiceBinding( ConformsTo = WsiProfiles.BasicProfile1_1)]public class Serviciu : System.Web.Services.WebService{ // implementare}

În viitor, WS-I ar putea standardiza ºi alte profile privitoare la diverseleaspecte ale inter-operabilitãþii serviciilor Web.

2.9. Serviciile Web în contextul proceselor de afaceri

Este de necontestat faptul cã serviciile Web ºi arhitectura orientatã spre servicii audevenit paradigma obiºnuitã pentru proiectarea ºi implementarea colaborãrilor lanivel de afaceri în cadrul ºi dincolo de graniþele unei organizaþii. Funcþionalitãþile

Page 299: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

299RETROSPECTIVÃ ªI PERSPECTIVE

sunt oferite prin intermediul interfeþelor standardizate ale serviciilor Web.Serviciile puse la dispoziþie de diferite organizaþii, eventual regãsite graþie UDDI,pot fi interconectate în vederea realizãrii de operaþii (relativ mai) complexe.Astfel, grupuri de servicii considerate atomice constituie aºa-numitele serviciicompozite (composite Web services).

Colaborãrile inter- sau intra-organizaþionale necesitã în multe cazuri interac-þiuni de duratã, conduse de modele explicite de procese de afaceri. Modelareaproceselor de afaceri se regãseºte ºi sub termenii de model al fluxului deactivitãþi (workflow), orchestrare sau coregrafie.

Existã deja o suitã de limbaje XML de modelare a proceselor de afaceri,distingându-se WSCI (Web Service Choreography Interface), BPML (Business ProcessModeling Language) ºi BPEL4WS (Business Process Execution Language for Web Services).Aceste abordãri iau în consideraþie atât manierele de comunicare între diverseleentitãþi software implicate, cât ºi workflow-urile desfãºurate într-un sistem.

Vom discuta în continuare câteva dintre aspectele definitorii ale BPEL4WS.Acest limbaj are ca strãmoºi WSFL (Web Services Flow Language) oferit de IBM ºipropunerea XLANG iniþiatã de Microsoft. Dacã primul modela un flux deactivitãþi ca un graf orientat specificat de construcþii XML, al doilea avea unpunct de vedere apropiat de scrierea în pseudo-cod a algoritmilor.

Un proces reprezintã orice colecþie de activitãþi care conduc la realizarea unuianumit obiectiv (de exemplu, procesarea unei comenzi ori cereri de platã,angajarea unui nou programator într-o companie sau trimiterea unei propuneride invenþie spre aprobare).

În viziunea BPEL4WS, procesele pot fi abstracte sau executabile. Celeabstracte desemneazã un protocol specificând tipul mesajelor interschimbate dediverse entitãþi, fãrã a se oferi detalii privitoare la comportamentul acestora.Procesele executabile definesc:

� o ordine de execuþie a activitãþilor constituiente;� partenerii implicaþi;� mesajele vehiculate între parteneri;� mecanismele de rezolvare a excepþiilor/erorilor.

La rândul ei, o activitate � parte componentã a unui proces � poate fi simplã(primitive) sau structuratã (structured). Tipurile de activitãþi simple sunt urmãtoarele:

� invoke � invocarea unei operaþii oferite de un serviciu Web ºi descrise de undocument WSDL;

� receive � aºteptarea unui mesaj provenind de la o sursã externã;� reply � trimiterea unui mesaj-replicã unei surse externe;

Page 300: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB300

� wait � oprirea activitãþii un anumit timp;� assign � copierea datelor dintr-o variabilã în alta;� throw � indicarea erorilor survenite într-o execuþie;� terminate � terminarea unei instanþe de serviciu;� empty � desemneazã activitatea vidã.

Figura 8. Reprezentarea graficã a unui workflow desfãºurat în cazul iniþierii unei comenzi dinpartea unui cumpãrãtor online ce doreºte sã achiziþioneze un sortiment de portocale

Operaþiile complexe pot fi modelate prin activitãþi structurate. Astfel, pot fispecificate structuri foarte similare celor puse la dispoziþie de limbajele deprogramare:

Page 301: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

301RETROSPECTIVÃ ªI PERSPECTIVE

� sequence � defineºte o ordine de execuþie, secvenþialã;� switch � desemneazã o alternativã (conditional routing);� while � permite bucle de execuþii;� pick � stabileºte condiþii de alegere bazate pe evenimente (e.g., onAlarm,

onMessage etc.);� flow � permite execuþia în paralel (parallel routing);� scope � grupeazã activitãþi ce vor fi tratate de acelaºi handler de excepþii.

Varianta 2.0, mai recentã, a limbajului introduce noi tipuri de activitãþi(if-then-else, forEach, repeatUntil, validate etc.) ºi transformãri ale valorilor variabilelorprin XSLT. De asemenea, este aliniatã la prevederile în vigoare privind inter--operabilitatea.

Procesul de verificare a stocului de portocale poate fi modelat astfel (estevorba de o comunicare sincronizatã):

<process name="verifStocPorto"> <sequence> <!-- dorim sã aflãm cantitatea disponibilã de portocale --> <invoke partner="stocuri" inputVariable="portocale" outPutVariable="cantit"> </invoke> <flow> <!-- alte activitãþi care nu depind de 'cantit' --> <sequence>...</sequence> <!-- obþinem cantitatea --> <receive partner="stocuri" variable="cantit"></receive> </flow> </sequence></process>

Desigur, activitãþile structurate pot fi imbricate. În cazul activitãþilor care facparte din aceeaºi activitate de tip flow, ordinea de execuþie poate fi controlatã vialinks � legãturi ce permit definirea dependenþelor între douã activitãþi (activitateadestinaþie poate începe doar atunci când activitatea sursã s-a încheiat). Astfel seformeazã un digraf aciclic de activitãþi, cu condiþii de tranziþie de la o activitatela alta (transition conditions) ºi condiþii de unificare (join conditions).

Vom exemplifica douã dintre ºabloanele de realizare a workflow-urilor: alegereaexclusivã (exclusive choice) ºi confluenþa simplã (simple merge).

Page 302: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB302

Alegerea exclusivã presupune, pe baza luãrii unei decizii, alegerea unei singuresoluþii dintr-o alternativã. De exemplu, managerul unui magazin virtual va finotificat dacã stocul de portocale este pe sfârºite (cantitatea disponibilã este maimicã de 33 de kilograme), altfel nu. Schematic, aceasta poate fi exprimatã prinliniile:

<switch> <case condition="#cantitMinima"> <!-- notificãm managerul --> </case> <case condition="..."> ... </case></switch>

Confluenþa simplã precizeazã un punct din procesul workflow în care sereunesc douã sau mai multe ramuri de activitãþi alternative, fãrã a necesitasincronizare (se presupune însã cã ramurile alternative nu se executã niciodatã înparalel). De exemplu, dupã ce plata a fost efectuatã sau creditul a fost aprobat,produsul comandat poate fi expediat clientului.

Actualmente sunt disponibile diverse sisteme de management al fluxurilor deactivitãþi � WFMS (WorkFlow Management System) �, majoritatea oferind suportpentru BPEL4WS ori alte propuneri complementare. Ca exemple notabilemenþionãm instrumentele oferite de BEA, Microsoft, Oracle ºi Sun, care funcþio-neazã pe platforme precum .NET, J2EE sau JBI (Java Business Integration).

Ca alternativã la ESB (care oferã suport ºi pentru workflow-uri), corporaþiaMicrosoft are în vedere constituirea a ceea ce numeºte Windows WorkflowFoundation, integratã cu tehnologiile Microsoft, dar a cãrei arhitecturã se bazeazãpe modelul unui procesor (engine) BPEL. La nivel de utilizator final, workflow-urilepot fi definite grafic direct în Office, iar dezvoltatorii vor avea la dispoziþiediverse aplicaþii precum Visual Studio Team System. Actualmente, fluxurile deactivitãþi sunt folosite în cadrul serverului BizTalk ºi a noii fundaþii de servicii decomunicare WCF (Windows Communication Foundation).

2.10. Servicii Web pentru grid

Orchestrarea ºi coordonarea sunt esenþiale ºi în cadrul sistemelor de tip grid, încare serviciile Web joacã un rol important. Conceptul de grid desemneazã oentitate oferind servicii de calcul sau acces la date ºi fiind compusã dintr-o seriede computere privite ca o gazdã Internet unicã. Dacã iniþial au reprezentat opropunere de infrastructurã de calcul distribuit pe scarã largã destinatã proiectelorºtiinþifice ºi industriale, tehnologiile grid au oferit ulterior suport pentru cãutarea

Page 303: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

303RETROSPECTIVÃ ªI PERSPECTIVE

ºi regãsirea informaþiilor, indiferent de localizarea lor fizicã. Într-un sistem grid,serviciile pot fi dinamice ºi volatile, constituite ad-hoc, disponibile pe scarã largãºi pe termen îndelungat.

O implementare de referinþã a arhitecturii ºi protocoalelor grid este Globus,actualmente ajunsã la versiunea 4. Instrumentele de dezvoltare formeazã GlobusToolkit, disponibile în general pentru sistemele UNIX/Linux. Interfeþele deprogramare formeazã aºa-numitul CoG (Commodity Grid) toolkit, fiind disponibilepentru limbaje precum Java, Perl ori Python, cu suport ºi pentru CORBA, .NET ºiservicii Web. Standardizarea tehnologiilor grid este supervizatã de Global Grid Forum.

În prezent, atenþia este focalizatã asupra constituirii unei arhitecturi orientatespre servicii grid, recurgându-se la tehnologiile Web actuale. Astfel, în cadrulmodelul arhitectural OGSA (Open Grid Service Architecture) serviciile Web suntextinse pentru a putea specifica funcþionalitãþi de bazã ºi specializate pentrusisteme de tip grid. Arhitectura OGSA este compusã din infrastructura OGSI, osuitã de interfeþe ºi de modele.

OGSI (Open Grid Services Infrastructure) se aflã la convergenþa dintre grid ºiserviciile Web, definind mecanismele de bazã pentru managementul instanþelorde servicii grid (transferul de mesaje, menþinerea ciclului de viaþã etc.). OGSIextinde WSDL pentru a oferi servicii dependente de stare (stateful) � utile pentrugestionarea stãrii globale a sistemului �, moºtenirea interfeþelor serviciilor,notificarea asincronã a schimbãrilor de stare, specificarea referinþelor la instanþede servicii ºi altele. De asemenea, sunt definite mecanismele prin care clienþii potavea acces la serviciile grid-ului.

Figura 9. Menþinerea stãrii fiecãrei instanþe de serviciu Web existent într-un grid

Page 304: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB304

Interfeþele (OGSA Platform Interfaces) reprezintã diverse servicii (interfeþe +comportamente asociate) care nu sunt definite în cadrul OGSI. Se vizeazã astfelun nivel superior de servicii, precum accesul ºi integrarea datelor, înregistrarea ºimanagementul resurselor, asigurarea securitãþii, jurnalizarea distribuitã, orchestra-rea serviciilor etc.

Modelele (OGSA Platform Models) sunt o combinaþie de interfeþe ºi scheme dedate utile la reprezentarea entitãþilor � e.g., un server de stocare � care suntincluse într-un sistem grid.

Maniera de ataºare a serviciilor la infrastructura de transport Internet,specificarea gazdelor, serviciile specifice unui domeniu de activitate nu facsubiectul specificaþiilor OGSA, putând fi definite fie de anumite profile, fie deterþe organizaþii.

În plus, OGSA defineºte WS-Agreement, prin intermediul cãreia se specificãmodul în care serviciile grid sunt gestionate conform scopurilor unor organizaþiisau cerinþelor aplicaþiilor ce trebuie rulate pe grid, pe baza unor contracte(agreements) prestabilite sau realizate dinamic.

În legãturã cu OGSA, trebuie semnalatã ºi iniþiativa WSRF (Web ServicesResource Framework), o familie de specificaþii vizând accesarea resurselor prinservicii Web, în manierã stateful.

O altã direcþie este DAIS (Data Access and Integration Services) prin care suntdescrise mecanismele de acces la date la nivel înalt, ascunzându-se detaliileprivitoare la integrarea datelor stocate în surse multiple, având reprezentãri diferite.

Implementãrile OGSA se axeazã asupra tehnologiilor Java ºi .NET. Unuldintre proiectele interesante de dezvoltare este WSRF.NET, bazat pe specificaþiileWSRF ºi implementat în C# sub .NET Framework.

Accesul la resursele unui grid poate fi facilitat de existenþa unui portal,deseori oferind o interfaþã Web. În acest context, menþionãm iniþiativele WSRP(Web Services for Remote Portlets) ºi WSIA (Web Services for Interactive Applications).

3. SOA în contextul noului Web

Din cele prezentate mai sus, putem deduce cã în cadrul SOA pot exista maimulte roluri pe care un dezvoltator Web poate sã le joace. În primul rând, cel deimplementator de servicii, activitate care presupune crearea ºi publicarea imple-mentãrilor serviciilor rezultate. O a doua ipostazã o reprezintã consumatorul deservicii, a cãrui misiune � circumscrisã celei a dezvoltatorului de servicii � estede a concepe aplicaþii-client menite a invoca suite de servicii. Un rol nou îl deþinedezvoltatorul de compuneri de servicii care proiecteazã, genereazã ºi publicã o

Page 305: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

305RETROSPECTIVÃ ªI PERSPECTIVE

clasã de servicii compuse din alte servicii. Cel de-al patrulea tip vizeazã asamblareaserviciilor înrudite în vederea exploatãrii (deployment) efective ºi a managementuluioperaþiilor.

Modelul de creare a aplicaþiilor ºi sistemelor utilizând SOA este descris de ospecificaþie intitulatã SCA (Service Component Architecture), propusã la finalul anului2005 de o serie de companii. Conform SCA, se oferã o modalitate neutrã � dinpunctul de vedere al platformei ºi limbajului de programare � pentru repre-zentarea serviciilor care pot fi rulate pe o varietate de medii. Aceste servicii potfi compuse, implementate de o paletã largã de framework-uri ºi containere (e.g.,EJB � Enterprise Java Beans). La nivel de implementare, proiectul Apache Tuscanyoferã suport pentru SCA, în limbajele C++ ºi Java. De asemenea, poate fimenþionat ºi Eclipse STP (SOA Tools Project).

Dacã SOA permite adoptarea unei abordãri sistematice de compunere dina-micã a serviciilor conform cerinþelor industriei, noua direcþie de evoluþie aspaþiului WWW � denumitã Data Web sau Web 2.0 � exprimã dorinþa de existenþãa unui mecanism flexibil de integrare ad-hoc a resurselor, fãrã constrângeri. Modulde utilizare a Web-ului actual se bazeazã pe modele de interacþiune bogatã(aspect posibil via tehnologii ca RSS, Atom ºi AJAX) ºi pe crearea de reþelesociale slab-conectate (a se vedea fenomenul blogging, corelat cu existenþa taxo-nomiilor create de grupuri de persoane � folksonomies � ºi a aplicaþiilor colaborativede tip wiki). Web-ul este vãzut ca o platformã ºi nu numai ca depozit de date, în carecomunitãþi de utilizatori genereazã conþinut util (pe baza inteligenþei colective).

În acest context, apare tipul de aplicaþie Web hibridã (aºa-numitul mash-up)care reprezintã un sit Web ori o aplicaþie Web ce combinã în mod agil conþinuturiprovenite din mai multe surse, în vederea oferirii unei interacþiuni complexe.Sursele sunt în mod uzual RSS feed-uri asociate blog-urilor sau wiki-urilor ºiservicii Web exploatate prin SOAP ori prin REST. Pentru a facilita aceastãintegrare, numeroºi ofertanþi de servicii Web � începând cu Google ºi Amazonºi continuând cu eBay, Yahoo! ºi multe alte companii � au pus la dispoziþieAPI-uri specializate.

Mai mult decât atât, existã iniþiative pentru asocierea de descrieri semanticeserviciilor Web, în contextul direcþiei de evoluþie spre Web-ul semantic � detalii înlucrãrile lui Sabin Buraga, Tehnologii XML, Polirom, Iaºi, 2006 ºi Sabin Buraga,Semantic Web, Matrix Rom, Bucureºti, 2004.

Printre problemele actuale care trebuie rezolvate numãrã cele legate deneconcordanþe semantice între servicii la nivel de:

� conþinut � de exemplu, un serviciu Web care furnizeazã localizarea uneiresurse multimedia (e.g., un film) întoarce adresa numericã (IP) a serverului destocare, deºi solicitantul doreºte URI-ul acelei resurse;

Page 306: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB306

� atribut � se solicitã tipul MIME video/mpeg, dar serviciul furnizeazã tipulgeneric Video;

� unitãþi de mãsurã � serviciul solicitã ca datã de intrare dimensiunea unui fiºieraudio în octeþi, dar i se trimite un numãr reprezentând dimensiunea în MB;

� mesaj � clientul solicitant poate furniza rezoluþia unei imagini ca perechelãþime-înãlþime, însã serviciul Web doreºte numãrul total de pixeli alocaþi.

Pentru descrierea semanticã ºi invocarea corespunzãtoare a serviciilor Web,eforturile sunt concentrate asupra adoptãrii unor specificaþii de nivel înalt,capabile sã descrie proprietãþi ºi funcþionalitãþi într-o formã procesabilã decalculator. Astfel, s-a propus un cadru de lucru destinat serviciilor Web descrisesemantic � SWSF (Semantic Web Services Framework), care înglobeazã o suitã depropuneri precum OWL-S ºi SWSO (Semantic Web Services Ontology). O altãiniþiativã demnã de interes este WSMO (Web Service Modeling Ontology).

Conceptual, un serviciu va fi privit ca un proces, cãruia � prin proprietãþi �îi vor fi asociate datele de intrare/ieºire ºi, eventual, diverºi parametri de control.Un alt concept important este cel de profil, incluzând meta-date necesaredescoperirii, selecþiei ºi potrivirii semantice (matchmaking) de servicii. Modelul deprocesare vede un serviciu ca fiind atomic ori compus, aspect util în ceea cepriveºte compunerea, execuþia ºi monitorizarea serviciilor Web. Ultima com-ponentã de interes priveºte infrastructura (grounding), desemnând cum poate fiexecutat serviciul ºi extinzând WSDL. Implementarea efectivã nu are importanþãîn acest context.

La finalul acestei secþiuni, furnizãm maniera de descriere semanticã a uneiinstanþe de serviciu Web de furnizare a cantitãþii disponibile dintr-un sortimentde portocale (omitem declaraþiile spaþiilor de nume ºi a modului de specificareabstractã a unor resurse):

<!-- serviciul Web descris --><s:Service ID="FurnizorPortocale"> <!-- prezintã un profil --> <s:presents resource="#profil_Furnizor"/> <!-- este descris de un proces --> <s:describedBy resource="#proces_Furnizor"/> <!-- se bazeazã pe o descriere-suport --> <s:supports resource="#desc_Furnizor"/></s:Service><!-- profilul unui serviciu --><p:Profile ID="profil_Furnizor"> <s:presentedBy resource="#FurnizorPortocale"/> <!-- are asociat un proces -->

Page 307: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

307RETROSPECTIVÃ ªI PERSPECTIVE

<p:has_process resource="#proces_Furnizor" /> <!-- posedã un nume --> <p:serviceName>FurnizeazaPortocale</p:serviceName> <!-- are o intrare --> <p:hasInput resource="#intrare" /> <!-- ...ºi o ieºire (rezultat) --> <p:hasOutput resource="#rezultat" /></p:Profile><!-- procesul atomic reprezentând serviciul Web --><a:AtomicProcess ID="proces_Furnizor"> <s:describes resource="#FurnizorPortocale" /> <!-- descrierea datelor de intrare --> <a:hasInput> <a:Input ID="intrare"> <!-- de la intrare se aºteaptã un ºir de caractere --> <a:parameterType>xsd:string</a:parameterType> <!-- semantic, reprezintã o categorie de sortiment --> <a:semanticType resource="Sortiment" /> </a:Input> </a:hasInput> <!-- descrierea datelor de ieºire --> <a:hasOutput> <a:Output ID="rezultat"> <!-- rezultatul întors va fi un întreg --> <a:parameterType>xsd:integer</a:parameterType> <!-- conceptual, reprezintã o cantitate --> <a:semanticType resource="Cantitate" /> </a:Output> </a:hasOutput></a:AtomicProcess>

Dupã cum se poate remarca, principalele avantaje aduse de aceste specificaþiiconceptuale sunt cele privind automatizarea descoperirii, selectãrii, invocãrii,compunerii ºi monitorizãrii execuþiei serviciilor Web.

Referinþe

Abbas, A., Grid Computing: A Practical Guide to Technology and Applications, Charles RiverMedia, 2004

Acostãchioaie, D., Securitatea sistemelor Linux, Polirom, Iaºi, 2003Albin, S., The Art of Software Architecture: Design Methods and Techniques, Wiley & Sons,

2003

Page 308: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

SERVICII WEB308

Buraga, S., Tehnologii XML, Polirom, Iaºi, 2006: http://www.infoiasi.ro/~busaco/books/xml/

Buraga, S., Proiectarea siturilor Web (ediþia a doua), Polirom, Iaºi, 2005: http://www.infoiasi.ro/~design/

Buraga, S., Semantic Web, Matrix Rom, Bucureºti, 2004: http://www.infoiasi.ro/~sweb/Buraga, S. (coord.), Tendinþe actuale în proiectarea ºi dezvoltarea aplicaþiilor Web, Matrix Rom,

Bucureºti, 2006: http://www.infoiasi.ro/~busaco/books/nw05/Cabrera, L.F., Kurt, C., Web Services Architecture and Its Specifications, Microsoft Press, 2005Coyle, F., XML, Web Services, and the Data Revolution, Addison-Wesley, 2002Dierks, T., Allen., C., The TLS Protocol Version 1.0, RFC 2246, Internet Engineering Task

Force (IETF), 1999: http://www.ietf.org/rfc/rfc2246.txtEastlake, D., Reagle, J. (eds.), XML Encryption Syntax and Processing, W3C Recom-

mendation, Boston, 2002: http://www.w3.org/TR/xmlenc-core/Eastlake, D., Reagle, J., Solo, D. (eds.), XML-Signature Syntax and Processing, W3C

Recommendation, Boston, 2002: http://www.w3.org/TR/xmldsig-core/Erl, T., Service-Oriented Architecture: Concepts, Technology, and Design, Prentice Hall PTR,

2005Fisher, M. et al., Java EE and .NET Interoperability, Prentice Hall, 2006Guruge, A., Web Services: Theory and Practice, Digital Press, 2004Hallam-Baker, P., Mysore, S. (eds.), XML Key Management Specification (XKMS 2.0), W3C

Recommendation, Boston, 2005: http://www.w3.org/TR/xkms2/Hartman, B. et al., Mastering Web Services Security, Wiley Publishing, 2003Hundhausen, R., Working with Microsoft Visual Studio 2005 Team System, Microsoft Press,

2006Joseph, K., Fellenstein, C., Grid Computing, Prentice Hall, 2003Kavantzas, N. et al. (eds.), Web Services Choreography Description Language (WS-CDL)Version

1.0, W3C Candidate Recommendation, Boston, 2005: http://www.w3.org/TR/ws-cdl-10/

Mahmoud, Q., Service-Oriented Architecture (SOA) and Web Services: The Road to EnterpriseApplication Integration (EAI), Sun, 2005: http://java.sun.com/developer/technical/WebServices/soa/

McLaren, C. (ed.), Security and Privacy Considerations for the OASIS Security Assertion MarkupLanguage (SAML), OASIS Standard, 2002: http://www.oasis-open.org/committees/security/docs/

O�Neill, M. et al., Web Services Security, McGraw-Hill/Osborne, 2003Von Laszewski, G., Wagstrom, P., �Gestalt of the Grid�, în Hariri, S., Parashar, M.

(eds.), Tools and Environments for Parallel and Distributed Computing, Wiley Publishing,2004

Weerawarana, S. et al., Web Services Platform Architecture, Prentice Hall PTR, 2005* * *, Apache Tuscany: http://incubator.apache.org/tuscany/* * *, Business Process Execution Language for Web Services: http://www.oasis-open.org/

committees/tc-home.php/wg_abbrev=wspel* * *, Eclipse SOA Tools Project: http://www.eclipse.org/stp/* * *, Global Grid Forum: http://www.globalgridforum.org/

Page 309: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

309RETROSPECTIVÃ ªI PERSPECTIVE

* * *, Globus: http://www.globus.org/* * *, IBM�s DeveloperWorks Web Services: http://www-136.ibm.com/developerworks/

webservices* * *, Iniþiativa Electronic Business XML: http://www.ebxml.org/* * *, Iniþiativa 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/* * *, Soluþiile 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/

Page 310: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)
Page 311: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

Acronime

A2A � Application to ApplicationACID � Atomicity, Consistency, Isolation, DurabilityACL � Access Control ListAHAH � Asynchronous HTML and HTTPAJAX � Asynchronous JavaScript and XMLALE � AJAX Linking and EmbeddingANSI � American National Standards InstituteAMI � Application Messaging InterfaceAPI � Application Programming InterfaceASAP � Asynchronous Service Access ProtocolASCII � American Standard Code for Information InterchangeASF � Apache Software FoundationASP � Active Server Pages/Application Service ProviderAT � Atomic TransactionAWS � Amazon Web ServicesB2B � Business to BusinessB2Bi � Business to Business IntegrationBASH � Bourne Again SHellBSD � Berkeley Software/Standard DistributionBPEL � Business Process Execution LanguageBPEL4WS � Business Process Execution Language for Web ServicesBPM � Business Process ManagementBTP � Business Transaction ProtocolCA � Certification AuthorityCC � Creative CommonsCC/PP � Composite Capability/Preference ProfilesCGI � Common Gateway InterfaceCLR � Common Language Run-timeCMS � Content Management SystemCoG � Commodity GridCOM � Common Object ModelCORBA � Common Object Request Broker Architecture

Page 312: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

ACRONIME312

CPAN � Comprehensive Perl Archive NetworkCRUD � Create, Retrieve, Update, DeleteC/S � Client/ServerCSS � Cascading Style SheetsCVS � Control Versioning SystemDAIS � Data Access and Integration ServicesDAO � Data Access ObjectDBMS � DataBase Management SystemDCOM � Distributed COMDDoS � Distributed Denial of ServiceDHTML � Dynamic HTMLDIME � Direct Internet Message EncapsulationDOM � Document Object ModelDoS � Denial of ServiceDRM � Distributed Resource Management, Digital Rights ManagementDSML � Directory Services Markup LanguageDSSO � Desktop Single Sign-OnDTD � Document Type DefinitionDWR � Direct Web RemotingE4X � ECMAScript for XMLEAI � Enterprise Application IntegrationEASI � Enterprise Application Security IntegrationebXML � Electronic Business XMLECMA � European Computer Manufacturers AssociationEIS � Enterprise Information SystemEJB � Enterprise JavaBeanESB � Enterprise Service BusFAT � File Allocation Table, Fade Anything TechniqueFTP � File Transfer ProtocolGCC � GNU Compiler CollectionGGF � Global Grid ForumGNU � Gnu is Not UnixGPL � GNU General Public LicenseGSH � Grid Service HandlerGUID � Globally Unique IDentifierGWT � Google Web ToolkitHTML � HyperText Markup LanguageHTTP � HyperText Transfer Protocoli8n � InternationalizationIDE � Integrated Development EnvironmentIDL � Interface Definition LanguageIDN � International Domain NamesIE � Internet Explorer

Page 313: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

313ACRONIME

IETF � Internet Engineering Task ForceIIS � Internet Information ServicesIL � Intermediate LanguageIRI � Internationalized Resource IdentifierIP � Internet ProtocolIPSec � Internet Protocol SecurityIPv6 � Internet Protocol version 6ISO � International Standards OrganizationJ2EE � Java 2 Platform, Enterprise EditionJ2SE � Java 2 Platform, Micro EditionJ2SE � Java 2 Platform, Standard EditionJAAS � Java Authentication and Authorization ServiceJAX � Java APIs for XMLJAXB � Java Architecture for XML BindingJAXP � Java API for XML ProcessingJAX-RPC � Java API for XML-based RPCJAX-WS � Java APIs for XML Web ServicesJBI � Java Business IntegrationJCP � Java Community ProcessJDBC � Java DataBase ConnectivityJDK � Java Development KitJIT � Just-In-TimeJMS � Java Message ServiceJRE � Java Run-time EnvironmentJS � JavaScriptJSF � JavaServer FacesJSON � JavaScript Object NotationJSP � JavaServer PagesJSR � Java Specification Repository/RequestJSRS � JavaScript Remote ScriptingJVM � Java Virtual MachineJWSDP � Web Services Developer PackLAMP � Linux-Apache-MySQL-Perl/PHP/PythonMDI � Multiple Document InterfaceMEP � Message Exchange PatternMIME � Multipurpose Internet Mail ExtensionsMQ � Message QueueMSDN � MicroSoft Developer NetworkMTOM - Message Transmission Optimization MechanismMVC � Model-View-ControllerMXML � Maximum Experience Markup LanguageNAICS � North American Industry Classification SystemOASIS � Organization of the Advancement of Structured Information Standards

Page 314: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

ACRONIME314

ODBC � Open DataBase ConnectivityOMG � Object Management GroupOOP � Object Oriented Programming/ParadigmORM � Object-Relational MappingOS � Operating SystemOWL � Web Ontology LanguageP2P � Peer-to-PeerPDF � Portable Document FormatPEAR � PHP Extensions and Add-ons RepositoryPERL � Practical Extraction and Report LanguagePHP � PHP: Hypertext PreprocessorPOD � Process-On-DemandPOJO � Plain Old Java ObjectPOX � Plain Old XMLPSVI � Post-Schema Validation InfosetRA � Registration AuthorityRAI � RSS Abstraction InterfaceRBAC � Role-Based Access ControlRDF � Resource Description FormatRDFS � RDF SchemaREST � REpresentational State TransferRoR � Ruby on RailsQoS � Quality of ServiceRAD � Rapid Application DevelopmentRFC � Request For CommentsRIA � Rich Internet ApplicationRMI � Remote Method InvocationRPC � Remote Procedure CallRSS � Rich/RDF Site Summary, Really Simple SyndicationSAAJ � SOAP with Attachments API for JavaSAML � Security Assertion Markup LanguageSAX � Simple API for XMLSCA � Service Component ArchitectureSDI � Single Document InterfaceSDK � Software Development KitSDL � Service Development LanguageSDO � Service Data ObjectsSEI � Service Endpoint InterfaceSIG � Special Interest GroupSLA � Service Level AgreementSMTP � Simple Mail Transfer ProtocolSOA � Service-Oriented ArchitectureSOAD � Service-Oriented Analysis and Design

Page 315: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

315ACRONIME

SOAP � Simple Object Access ProtocolSOM � Service-Oriented ModelSOMA � Service-Oriented Modelling and ArchitectureSPI � Service Provider InterfaceSQL � Structured Query LanguageSRMP � SOAP Reliable Messaging ProtocolSSI � Server-Side IncludesSSL � Secure Sockets LayerSSO � Single Sign-OnSW � Semantic WebSwA � SOAP with AttachmentsSWS � Semantic Web ServiceSWSF � Semantic Web Services FrameworkTCP � Transmission Control ProtocolTLS � Transport Layer SecurityTR � Technical ReportUA � User Agent (Web)UBL � Universal Business LanguageUBR � UDDI Business RegistryUDDI � Universal Description, Discovery, and IntegrationUDP � User Datagram ProtocolUI � User InterfaceUML � Unified Modeling LanguageUPnP � Universal Plug and PlayURI � Uniform Resource IdentifierURL � Uniform Resource LocatorURN � Uniform Resource NameUTF � Unicode Transformation FormatUUID � Universal Unique IDentifierVB � Visual BasicVM � Virtual MachineVPN � Virtual Private NetworkW3C � World Wide Web ConsortiumWAP � Wireless Application ProtocolWCF � Windows Communications FoundationWDDX � Web Distributed Data ExchangeWML � Wireless Markup LanguageWS � Web ServiceWSA � Web Service Architecture/AddressingWSC � Web Service ChoreographyWSCI � Web Service Choreography InterfaceWSDL � Web Services Description LanguageWSDM � Web Service Distributed Management

Page 316: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

ACRONIME316

WS-DP � Device Profile for Web ServicesWSE � Web Services EnhancementsWSF � Web Services FrameworkWSFL � Web Services Flow LanguageWS-I � Web Services InteroperabilityWSIA � Web Services for Interactive ApplicationsWSIL � Web Service Inspection LanguageWSIT � Web Services Interoperability TechnologyWSMO � Web Service Modeling OntologyWSO � Web Services OrchestrationWS-PA � WS-Policy AttachmentWSRF � Web Services Resource FrameworkWSRP � Web Services for Remote PortalsWSS � Web Service SecurityWSTK � Web Services ToolkitWSXL � Web Services Experience LanguageWWW � World Wide WebXAML � Extensible Application Markup LanguageXACML � Extensible Access Control Markup LanguageXHTML � Extensible HyperText Markup LanguageX-KISS � XML Key Information Service SpecificationXKMS � XML Key Management SpecificationX-KRSS � XML Key Registration Service SpecificationXML � Extensible Markup LanguageXMLNS � XML NameSpaceXMLP � Extensible Markup Language ProtocolXP � Extreme ProgrammingXSD � XML Schema Definition/DatatypesXSL � Extensible Stylesheet LanguageXSLT � XSL TransformationXSS � Cross-Site Scripting

Page 317: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

Bibliografie generalã

Abbas, A., Grid Computing: A Practical Guide to Technology and Applications, Charles RiverMedia, 2004

Anghel, T., Programarea în PHP. Ghid practic, Polirom, Iaºi, 2005Asleson, R., Schutta, N., Foundations of AJAX, Apress, 2006Buraga, S., Tehnologii XML, Polirom, Iaºi, 2006: http://www.infoiasi.ro/~busaco/

books/xml/Buraga, S.,Proiectarea siturilor Web (ediþia a doua), Polirom, Iaºi, 2005: http://www.infoiasi.ro/

~design/Buraga, S., Semantic Web, Matrix Rom, Bucureºti, 2004: http://www.infoiasi.ro/~sweb/Buraga, S. (coord.), Tendinþe actuale în proiectarea ºi dezvoltarea aplicaþiilor Web, Matrix Rom,

Bucureºti, 2006: http://www.infoiasi.ro/~busaco/books/nw05/Buraga, S. (coord.), Situri Web la cheie. Soluþii profesionale de implementare, Polirom, Iaºi,

2004: http://www.infoiasi.ro/~busaco/books/webapps/Cabrera, L.F., Kurt, C., Web Services Architecture and Its Specifications, Microsoft Press,

2005Daconta, M., Obrst, L., Smith, K., The Semantic Web: A Guide to the Future of XML, Web

Services, and Knowledge Management, John Wiley & Sons, 2003Daum, B., Merten, U., System Architecture with XML, Elsevier Science, 2003Erl, T., Service-Oriented Architecture: Concepts, Technology, and Design, Prentice Hall PTR,

2005Geroimenko, V., Dictionary of XML Technologies and the Semantic Web, Springer-Verlag,

2004Guruge, A., Web Services: Theory and Practice, Digital Press, 2004Hartman, B. et al., Mastering Web Services Security, Wiley Publishing, 2003Harold, E., XML 1.1 Bible (3rd Edition), Wiley Publishing, 2004Kulchenko, P., Ray, R., Programming Web Services with Perl, O�Reilly, 2002Linthicum, D., Enterprise Application Integration, Addison-Wesley, 1999Myerson, J., The Complete Book of Middleware, Auerbach Publications, 2002Mueller, J., Mining Google Web Services: Building Applications with the Google API, Sybex, 2004Newcomer, E., Lomow, G., Understanding SOA with Web Services, Addison-Wesley, 2004O�Neill, M. et al., Web Services Security, McGraw-Hill/Osborne, 2003Perry, B., AJAX Hacks, O�Reilly, 2006

Page 318: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

BIBLIOGRAFIE GENERALÃ318

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, 2004Shiflett, C., HTTP Developer�s Handbook, Sams Press, 2003Si Shi, N., Murthy, V.K., Architectural Issues of Web-Enabled Electronic Business, Idea Group

Publishing, 2003Sklar, D., Trachtenberg, A., PHP Cookbook, O�Reilly, 2002Tanasã, ª., Olaru, C., Andrei, ª., Java de la 0 la expert, Polirom, Iaºi, 2003Tidwell, D., Snell, J., Kulchenko, P., Programming Web Services with SOAP, O�Reilly, 2001Topley, K., Java Web Services in Nutshell, O�Reilly, 2003Waltz, E., Knowledge Management in the Intelligence Enterprise, Artech House, 2003Weerawarana, S. et al., Web Services Platform Architecture, Prentice Hall PTR, 2005Zakas, N., McPeak, J., Fawcett, J., Professional AJAX, Wrox Press, 2006Zeldman, J., Designing with Web Standards, New Riders Press, 2003* * *, Apache XML: http://www.apache.com/* * *, API-urile puse la dispoziþie de Google: http://www.google.com/apis/* * *, Apple Developer Connection: http://developer.apple.com/* * *, ASP.NET: http://www.asp.net/* * *, Café con Lèche: http://www.cafeconleche.org/* * *, Code Project: http://www.codeproject.com/* * *, Developers.net: http://www.developers.net/* * *, Dezvoltarea de aplicaþii SOAP pentru Pocket PC: http://www.pocketsoap.com/* * *, ebXML: http://www.ebxml.org/* * *, Fundaþia Mozilla: http://www.mozilla.org/* * *, IBM Developer�s Site: http://www.ibm.com/developer/* * *, Iniþiativa 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 specificaþiilor privitoare la limbajele bazate pe XML: http://xml.coverpages.org/* * *, Microsoft Developers Network: http://msdn.microsoft.com/* * *, Mozilla Developer Center: http://developer.mozilla.org/* * *, O�Reilly OnLAMP: http://www.onlamp.com/* * *, O�Reilly OnDotNET: http://www.ondotnet.com/* * *, O�Reilly OnJava: http://www.onjava.com/* * *, Organizaþia 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/

Page 319: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

319BIBLIOGRAFIE GENERALÃ

* * *, Perl XML: http://www.perlxml.com/* * *, PHP Builder: http://www.phpbuilder.com/* * *, PHP Classes: http://www.classes.net/* * *, PHP Developer: http://www.phpdeveloper.org/* * *, Portal dedicat serviciilor Web: http://www.webservices.org/* * *, Rapoartele tehnice ale Consorþiului Web: http://www.w3.org/TR/* * *, Resurse privind programare pe partea de server: http://www.devshed.com/Server_Side/* * *, Situl .NET 247: http://www.dotnet247.com/* * *, Situl dedicat dezvoltatorilor Java: http://developer.java.sun.com/* * *, Situl dezvoltatorilor .NET: http://www.gotdotnet.com/* * *, Situl lui Paul Prescod: http://www.prescod.net/* * *, Situl privitor la ºabloanele de proiectare a aplicaþiilor AJAX: http://www.ajaxpatterns.org/* * *, Situl proiectului Mono: http://www.mono-project.com/* * *, SOA Web Services Journal: http://webservices.sys-con.com/* * *, SOAP Software: http://www.soapware.org/* * *, Source Forge: http://www.sourceforge.net/* * *, Sun XML Developer Connection: http://www.sun.com/software/xml/developers/* * *, The Open Sourcery: http://theopensourcery.com/* * *, WebReference: http://www.webreference.com/* * *, Wikipedia: http://www.wikipedia.org/* * *, XFront: http://www.xfront.com/* * *, XMethods: http://www.xmethods.net/* * *, XML 101: http://www.xml101.com/* * *, XML.com: http://xml.com/* * *, XML.org: http://www.xml.org/* * *, XML Software: http://www.xmlsoftware.com/* * *, XML Standards Library: http://xmlstds.xemantics.com/* * *, ZVON: http://www.zvon.org/

Page 320: L. Alboaie, S. Buraga: "Servicii Web. Concepte de bază și implementări" (2006)

Bun de tipar: octombrie 2006. Apãrut: 2006Editura Polirom, B-dul Carol I nr. 4 � P.O. Box 266

700506, Iaºi, Tel. & Fax (0232) 21.41.00 ; (0232) 21.41.11;(0232) 21.74.40 (difuzare); E-mail: [email protected]

Bucureºti, B-dul I.C. Brãtianu nr. 6, et. 7, ap. 33,O.P. 37 � P.O. Box 1-728, 030174

Tel.: (021) 313.89.78; E-mail: [email protected]

Tiparul executat la S.C. LUMINA TIPO s.r.l.str. Luigi Galvani nr. 20 bis, sect. 2, Bucureºti

Tel./Fax: 211.32.60, 212.29.27, E-mail: [email protected]

Coperta: Radu RãileanuTehnoredactor: Gabriela Gheþãu

www.polirom.ro

Sabin Buraga

Proiectarea siturilor Web.Design ºi funcþionalitate(cartea include CD) (ediþia a II-a)

Lucrarea realizeazã mai mult decât o introducere îndomeniul Web, ilustrând potenþialul acestuia de adezvolta aplicaþii puternice din domenii cum ar fi infor-marea ºi documentarea, realitatea virtualã, e-business.Cititorul va putea înþelege ºi exploata posibilitãþile oferitede noile tehnologii în ceea ce priveºte gãsirea de informaþii,demararea de afaceri online ºi proiectarea eficientã asiturilor Web.

Principalele noutãþi aduse de ediþia a II-a: Strategii deoptimizare a siturilor (SEO � Search Engine Optimization) � Utilizabilitatea, ergonomia ºiaccesibilitatea siturilor Web � Securitatea în spaþiul Web � Forumuri, blog-uri, situri wiki ºiportaluri � E-branding, e-government, e-learning � Prin XML, spre Web-ul semantic

Conþinutul CD-ului: Studii de caz ºi exemple � Documentaþii (tutoriale, manuale, specificaþii) înlimbile românã ºi englezã � Curs de tehnologii Web � 14 prezentãri ºi demonstraþii (în limbaromânã) � Aplicaþii open source pentru comunitãþi virtuale ºi comerþ electronic