Capitolul Cuvinte-cheie SOAP, XML, REST, ASP.NET, client web, PHP, NuSOAP IH.12.1. Introducere Ce înseamnă serviciile web? Ele înseamnă invocarea la distanță a metodelor, prin web; limbaje și platforme de server și client, variate; standarde pentru localizarea serviciilor, formatarea și transferul datelor. Din punct de vedere tehnic, un serviciu web se poate prezenta ca o funcție care nu este pe calculatorul local, ci pe un server conectat la Internet și care este apelabilă de la distanță, apelarea și primirea rezultatelor făcându-se prin intermediul WWW. Inițial, pentru serviciile web au fost gândite multe standarde, privind formatul datelor transferate, securitatea lor, interoperabilitatea dintre platforme etc. Aceste standarde se folosesc și azi, dar mai degrabă pentru servicii web mari, adică între serverele firmelor, de exemplu între firmă de transport aerian și agenție de turism. De obicei, aceste servicii web au și specificații publicate și suport pentru unelte de dezvoltare, ca dezvoltatorii de aplicații care consumă aceste servicii să le poată integra în aceste aplicații. Unul din cele mai folosite standarde, în acest scop, este SOAP ( Simple Object Access Protocol ). Acesta folosește XML, pentru transmiterea informației la apelarea funcțiilor de la distanță și a răspunsului procesării. Pentru serviciile web simple, cu puțini parametri, unde este prioritară viteza ridicată de comunicare între serviciul web și aplicația client, nu dezvoltarea rapidă a aplicației, se recomandă dezvoltarea și utilizarea lor cu tehnologii REST ( REpresentational State Transfer ). Aici, datele se transmit simplu, sub formă de text, deși se poate utiliza și XML, pentru structurarea datelor. IH.12.2. Servicii web în ASP.NET Crearea unui serviciu simplu Pentru a crea un serviciu web să creăm un proiect de tip ASP.NET Web Service Application, pe care să-l numim SeviciulMeu. Observaţi că wizard-ul a creat un nou proiect, care conţine o clasă numita Service1, cu implementarea using System; using System.Data; using System.Web; using System.Collections; using System.Web.Services; using System.Web.Services.Protocols; using System.ComponentModel; namespace ServiciulMeu /// <summary> /// Summary description for Service1 /// </summary> - 197 -
[WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ToolboxItem(false)] public class Service1 : System.Web.Services.WebService [WebMethod] public string HelloWorld() return "Hello World"; Clasa conţine o singură metodă, numită HelloWorld(). Pentru ca această metodă să fie trimisă de către serverul de web clientului, ea este declarată ca fiind metodă web, prin intermediul directivei [WebMethod]. Să ştergem această metodă si să inserăm alte 2 metode, ca mai jos: public class Service1 : System.Web.Services.WebService [WebMethod] public string Codificare(string mesaj) char[] sir = mesaj.tochararray(); for (int i = 0; i < sir.length; i++) if (i % 2 == 0) sir[i] += (char)1; sir[i] -= (char)1; mesaj = new string(sir); return mesaj; [WebMethod] public string Decodificare(string mesaj) char[] sir = mesaj.tochararray(); for (int i = 0; i < sir.length; i++) if (i % 2 == 0) sir[i] -= (char)1; sir[i] += (char)1; mesaj = new string(sir); return mesaj; Ce fac metodele? Prima metodă primeşte ca parametru un string, pe care îl transformă într-un şir de caractere. Apoi codifică acest şir, adunând 1 la fiecare caracter de poziţie pară şi scăzând 1 din fiecare caracter de poziţie impară. În final, retransformă şirul de caractere în string, şi-l returnează. Metoda a doua, realizează în aceeaşi manieră operaţia inversă. - 198 -
Ce mai avem de făcut? Nimic! Probabil, ar fi bine totuşi să înlocuim adresa URL http://tempuri.org/ generată automat, cu o adresă proprie, chiar dacă aceasta nu există. Prin acest mecanism, putem realiza o identificare în mod unic a instituţiei care furnizează serviciul. Haideţi să o înlocuim, de exemplu cu /// </summary> [WebService(Namespace = "http://www.infoap.utcluj.ro/webservices")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] Să compilăm şi să executăm programul. Ce observăm? În urma lansării în execuţie a programului, va fi lansat automat browserul de web, care ne afişează cele 2 metode expuse de server (fig. IH.12.1). Este o modalitate prin care ASP.NET ne permite să verificăm funcţionalitatea serviciului. Dacă apăsăm clic de Figura IH.12.1 exemplu pe Codificare, va fi afişată o casetă care ne permite să transmitem stringul care urmează să fie codificat (fig IH.12.2). Figura IH.12.2 Dacă vom introduce un text şi vom apăsa butonul Invoke, vom obţine rezultatul din fig. IH.12.3. Se observă că se afişează şirul codificat, obţinut în urma execuţiei metodei, precum şi - 199 - Figura IH.12.3
adresa URL de identificare a serviciului web. Cu aceasta, serviciul nostru este implementat şi verificat. Crearea unui program client Windows Metodele implementate ca serviciu web, pot fi utilizate foarte simplu într-un program windows. Să exemplificăm acest lucru. Pentru aceasta, sa creăm o aplicaţie Windwos. Haideţi s-o numim ClientWindows. Să realizăm interfaţa din fig. IH.12.4, în care: inseram 3 controale Label, pentru care modificăm proprietatea Text în <Mesaj>, <Mesaj codificat>, respectiv <Mesaj decodificat>. inserăm 3 controale Text Box, pentru care modificăm proprietăţile Name astfel: pentru Figura IH.12.4 controlul de sus, în txtmesaj, pentru controlul de la mijloc în txtcodificat şi pentru controlul de jos în txtdecodificat. De asemenea, pentru controlul de sus modificăm proprietatea PasswordChar în Figura IH.12.5 *, iar pentru celelalte 2 controale proprietatea ReadOnly în true. inserăm 2 butoane, pentru care modificăm proprietăţile Text şi Name în Codificare, respectiv Decodificare. adaugăm o referinţă web (click dreapta pe rădăcină în Solution Explorer, Add web reference). În caseta URL, introduceţi URL-ul afişat în web browser la lansarea serviciului (fig. IH.12.5) şi apăsaţi Go. - 200 -
Va vor fi afişate cele 2 metode expuse de serviciul web. Pentru a le putea utiliza, apăsaţi butonul Add Reference (fig. IH.12.6). În acest moment, referinţa va fi adăugată proiectului şi cele 2 metode vor putea fi utilizate. Figura IH.12.6 Să implementăm acum funcţiile care se execută la apăsarea celor 2 butoane. Mai ţineţi minte, dublu clic pe ele: private void Codificare_Click(object sender, EventArgs e) if (txtmesaj.text.length > 0) localhost.service1 ser = new localhost.service1(); txtcodificat.text = ser.codificare(txtmesaj.text); MessageBox.Show(" Ce sa codific?"); Să explicăm. Aşa cum se vede în fig. IH.12.7, în Solution Explorer a apărut o referinţă web spre localhost. Această referinţă ne permite accesul spre serviciul Service1 implementat anterior, care la rândul lui va expune cele 2 metode. În funcţie, totul are loc doar dacă în caseta txtmesaj există scris ceva. Dacă da, se creează un nou serviciu web, numit ser, de tipul serviciului expus de localhost. Apoi, proprietatea Text a controlului txtcodificat este modificată Figura IH.12.7-201 -
de textul rezultat prin apelul metodei Codificare() a serviciului ser, care are ca parametru de intrare conţinutul textului din txtmesaj. Simplu. Să implementăm acum funcţia de decodificare: private void Decodificare_Click(object sender, EventArgs e) if (txtcodificat.text.length > 0) localhost.service1 ser = new localhost.service1(); txtdecodificat.text = ser.decodificare(txtcodificat.text); MessageBox.Show(" Ce sa decodific?"); Funcţia nu mai are nevoie de explicaţii. Compilaţi şi executaţi programul. Crearea unui program client ASP.NET Haideţi să vedem acum cum putem accesa funcţiile expuse de serviciul web într-o pagină web. Să creăm un nou proiect ASP.NET Web Application, pe care să-l numim ClientWeb. Să realizăm în designer aceeaşi interfaţă ca şi în cazul precedent, modificând controalele proprietăţilor similar (fig IH.12.8). Căsuţei de text de sus setaţi-i proprietatea TextMode pe Password. Adăugaţi apoi aceeaşi referinţă web, în acelaşi mod, ca şi în exemplul anterior. Să facem acum dublu clic asupra butoanelor pentru a genera scheletul funcţiilor care se lansează în execuţie la apăsarea lor şi să implementăm codul: Figura IH.12.8 protected void Codificare_Click(object sender, EventArgs e) if (txtmesaj.text.length > 0) ClientWeb.localhost.Service1 ser = new ClientWeb.localhost.Service1(); txtcodificat.text = ser.codificare(txtmesaj.text); txtcodificat.text = "Ce sa codific?"; protected void Decodificare_Click(object sender, EventArgs e) if (txtcodificat.text.length > 0 && txtcodificat.text!="ce sa codific?") ClientWeb.localhost.Service1 ser = new ClientWeb.localhost.Service1(); txtdecodificat.text = ser.decodificare(txtcodificat.text); txtdecodificat.text = "Ce sa decodific?"; - 202 -
Compilaţi şi executaţi programul. IH.12.3. Servicii web în PHP PHP permite dezvoltarea unor servicii web. Pentru ușurarea dezvoltării serviciilor SOAP, există biblioteci PHP pentru acest scop: extensie PHP, NuSOAP și WSF/PHP. Exemplu de serviciu web, în PHP, cu NuSOAP: <?php // Biblioteca NuSOAP trebuie instalată înainte require_once('nusoap.php'); // Instanț iem serviciul web $serv = new soap_server; // Înregistrăm metoda web $server->register('hello'); // Declarăm/implementăm funcț ia function hello($nume) return 'Hello, '. $nume; // Se invocă serviciul $HTTP_RAW_POST_DATA = isset($http_raw_post_data)? $HTTP_RAW_POST_DATA : ''; $server->service($http_raw_post_data);?> - 203 -