Documente Academic
Documente Profesional
Documente Cultură
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.
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
Host: www.server.com
attribute1=value1&...&attributen=valuen
OPTIONS interogare cu privire la atributele serverului web sau ale unei resurse găzduite de acesta
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().
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.