Sunteți pe pagina 1din 5

Invocarea de Servicii Web prin Protocolul HTTP

Protocolul HTTP
De multe ori, funcționalitatea pe care o pun la dispoziție aplicațiile Android este preluată din
alte surse, datorită limitărilor impuse de capacitatea de procesare și memorie disponibilă ale
unui dispozitiv mobil. O strategie posibilă în acest sens este utilizarea HTTP, pentru
interogarea unor servicii web, al căror rezultat este de cele mai multe ori oferit în format
JSON sau XML. De asemenea, descărcarea unor resurse se poate face prin inspectarea
codului sursă al unor pagini Internet (documente HTML), în urma acestei operații
detectându-se locația la care acestea sunt disponibile.

HTTP (Hypertext Transfer Protocol) este un protocol de comunicație responsabil cu


transferul de hipertext (text structurat ce conține legături) dintre un client (de regulă, un
navigator) și un server web, interacțiunea dintre acestea (prin intermediul unei conexiuni
TCP persistente pe portul 80) fiind reglementată de RFC 2616. HTTP este un protocol fără
stare, pentru persistența informațiilor între accesări fiind necesar să se utilizeze soluții
adiacente (cookie, sesiuni, rescrierea URL-urilor, câmpuri ascunse).
Principalele concepte cu care lucrează acest protocol sunt cererea și răspunsul.
 cererea este transmisă de client către serverul web și reprezintă o solicitare
pentru obținerea unor resurse (identificate printr-un URL); aceasta conține
denumirea metodei care va fi utilizată pentru transferul de informații, locația
de unde se găsește resursa respectivă și versiunea de protocol;
 răspunsul este transmis de serverul web către client, ca rezultat al
solicitării primite, incluzând și o linie de stare (ce conține un cod care indică
dacă starea comenzii) precum și alte informații suplimentare

Structura unei Cereri HTTP


O cerere HTTP conține una sau mai multe linii de text ASCII, precedate în mod necesar de
denumirea metodei specificând operația ce se va realiza asupra conținutului respectiv:
DENUMIRE
DESCRIERE
METODĂ

descărcarea resursei specificate de pe serverul web pe client; majoritatea cererilor către un server
web sunt de acest tip

GET
GET /page.html HTTP/1.1

Host: www.server.com

obținerea antetului unei pagini Internet, pentru a se verifica parametrii acesteia sau doar pentru a
HEAD
testa corectitudinea unui URL

încărcarea resursei specificate de pe client pe serverul web (cu suprascrierea acesteia, în cazul în
PUT care există deja); trebuie specificate și datele de autentificare, utilizatorul respectiv trebuind să
aibă permisiunile necesare pentru o astfel de operașie

transferul de informații de către client cu privire la resursa specificată, acestea urmând a fi


prelucrate de serverul web

POST POST /page.html HTTP/1.1

Host: www.server.com

attribute1=value1&...&attributen=valuen

ștergerea resursei specificate de pe serverul web, rezultatul operației depinzând de permisiunile pe


DELETE
care le deține utilizatorul ale cărui date de autentificare au fost transmise în antete

solicitare de retransmitere a cererii primite de serverul web de la client, pentru a se testa


TRACE
corectitudinea acesteia

CONNECT rezervat pentru o utilizare ulterioară

OPTIONS interogare cu privire la atributele serverului web sau ale unei resurse găzduite de acesta

Capitalizarea este importantă atunci când se precizează denumirea metodei folosite,


făcându-se distincție între minuscule și majuscule.

Cel mai frecvent, se utilizează metodele GET (folosită implicit, dacă nu se specifică altfel)
și POST.
GET vs. POST
Deși atât metoda GET cât și metoda POST pot fi utilizate pentru descărcarea conținutului unei
pagini Internet, transmițând către serverul web valorile unor anumite atribute, între acestea
există anumite diferențe:
 o cerere GET poate fi reținută în cache, fapt ce nu este valabil și pentru o
cerere POST;
 o cerere GET rămâne în istoricul aplicației de navigare, fapt ce nu este valabil
și pentru o cerere POST;
 o cerere GET poate fi reținută printre paginile Internet favorite din cadrul
programului de navigare, fapt ce nu este valabil și pentru o cerere POST;
 o cerere GET impune unele restricții cu privire la lungimea (maxim 2048
caractere) și la tipul de date (doar caractere ASCII) transmise (prin URL),
fapt ce nu este valabil și pentru o cerere POST;
 o cerere GET nu trebuie folosită atunci când sunt implicate informații critice
(acestea fiind vizibile în URL), fapt ce nu este valabil și pentru o cerere POST;
 o cerere GET ar trebui să fie folosită doar pentru obținerea unei resurse, fapt
ce nu este valabil și pentru o cerere POST.
O linie de cerere HTTP poate fi succedată de unele informații suplimentare,
reprezentând antetele de cerere, acestea având forma atribut:valoare, fiind definite
următoarele proprietăți:
 User-Agent - informații cu privire la browser-ul utilizat și la platforma pe
care rulează acesta
 informații cu privire la conținutul pe care clientul îl dorește de la serverul
web, având capacitatea de a-l procesa; dacă serverul poate alege dintre mai
multe resurse pe care le găzduiește, va alege pe cele care respectă
constrângerile specificate, altfel întoarce un cod de eroare
 Accept - tipul MIME
 Accept-Charset - setul de caractere
 Accept-Encoding - mecanismul de codificare
 Accept-Language - limba
 Host (obligatoriu) - denumirea gazdei pe care se găsește resursa (specificată
în URL); necesară întrucât o adresă IP poate fi asociată mai multor nume
de DNS
 Authorization - informații de autentificare în cazul unor operații care
necesită drepturi privilegiate
 Cookie - transmite un cookie primit anterior
 Date - data și ora la care a fost transmisă cererea
Mecanisme pentru Comunicația prin HTTP în Android
Clasa HttpURLConnection
În Android, comunicația dintre un server web si un client poate fi gestionată prin intermediul
clasei HttpURLConnection, care pune la dispoziție aceleași funcționalități ca în cazul Java SE.
O aplicație ce utilizează această clasă presupune implementarea următoarelor etape:

1. instanțierea unui obiect URL prin intermediul căruia pot fi obținute informații
cu privire la resursa respectivă (protocolul utilizat, mașina pe care se
găsește resursa respectivă, portul pe care poate fi accesată, fișierul accesat,
referința vizualizată):
 getProtocol() - furnizează protocolul utilizat, în acest caz, http;
 getHost() - indică adresa mașinii care găzduiește resursa
respectivă;
 getPort() - întoarce portul pe care s-a realizat comunicația:
 valoarea -1 este specifică pentru situația în care nu s-a
precizat un port în mod explicit;
 valoarea 80 este transmisă numai în cazul în care
aceata este specificată ca atare în adresa furnizată.
 getFile() - specifică calea de la care este obținută resursa;
 getRef() - precizează referința din cadrul paginii HTML (de
regulă, de tip ancoră) care a fost solicitată.
2. deschiderea unei conexiuni, printr-un apel al metodei openConnection();
metoda întoarce un obiect de tip URLConnection care poate fi convertit
la HttpURLConnection prin care se oferă acces la:
 antetele de
cerere: setRequestMethod(), setRequestProperty(String,
String);
 antetele de răspuns, inclusiv linia de
stare: getResponseCode(), getHeaderFields(), getResponseMes
sage();
 informații referitoare la mecanismele de gestiune a stării (cookie-
uri) - în condițiile în care HTTP este un protocol fără stare; se
utilizează clasele CookieManager, CookieHandler, care
gestionează la nivelul întregii mașini virtuale obiectele de
tipul HttpCookie.
3. utilizarea unui flux de intrare / flux de ieșire pentru transferul de informații;
se folosesc, obiectele / metodele:
 BufferedInputStream / getInputStream();
 BufferedOutputStream / getOutputStream() - în acest caz,
trebuie apelată metoda setDoOutput() cu parametrul true,
împreună cu metodele care evită reținerea conținutului într-o zonă
tampon (consumând astfel memorie inutilă și având un impact
asupra latenței):
 setFixedLengthStreamingMode() - atunci când
dimensiunea conținutului este cunoscută în prealabil;
 setChunkedStreamingMode() - atunci când
dimensiunea conținutului nu este cunoscută
4. închiderea conexiunii, prin intermediul metodei disconnect(), se face de
regulă pe clauza finally a unui bloc try-catch pe care sunt gestionate
operațiile ce implică comunicația prin rețea; scopul pentru care este utilizată
aceasta metodă este dat de posibilitatea de reutilizare a resurselor folosite
de conexiune (sockeți TCP), dacă proprietatea http.keepAlive nu specifică
altfel.
Implicit, clasa HttpURLConnection folosește metoda GET. Metoda POST este utilizată numai
în situația în care a fost apelată în prealabil metoda setDoOutput(true).

Celelalte metode (OPTIONS, HEAD, PUT, DELETE, TRACE) pot fi utilizate numai în situația în
care sunt specificate explicit ca parametru al funcției setRequestMethod().

Comunicația dintre serverul web și client trebuie să se realizeze pe un fir de execuție


separat, în caz contrar fiind generată
excepția android.os.NetworkOnMainThreadException.

În fișierul AndroidManifest.xml trebuie specificată permisiunea de acces la rețea:


<uses-permission android:name=“android.permission.INTERNET” />.

O practică curentă este de a verifica codul de răspuns transmis de a accesa fluxul de intrare
asociat resursei respective. Astfel, numai în situația în care valoarea întoarsă de
metoda getResponseCode() este HttpURLConnection.HTTP_OK se poate continua
procesarea conținutului stocat la URL-ul accesat.

S-ar putea să vă placă și