1 of 39

Tehnici avansate pentru

dezvoltarea aplicațiilor mobile

10 - Compose - Servicii web și Retrofit

2 of 39

Data layer

  • Data layer pentru serviciu de rețea care comunică cu serverul și obține datele
    • Biblioteca Retrofit

  • ViewModel comunică cu data layer

  • În ViewModel avem starea UI-ului pentru a actualiza UI-ul când se schimbă datele

10 - Compose - Servicii web și Retrofit

2

3 of 39

Data layer

3

4 of 39

Servicii web

4

5 of 39

REST

  • REpresentational State Transfer

  • Arhitectură web stateless

  • Servicii RESTful

  • Cereri web de tip REST

10 - Compose - Servicii web și Retrofit

5

6 of 39

Cereri REST

  • Cererile se fac folosind URIs
    • Uniform Resource Identifier
    • Identifică o resursă de pe server folosind un nume

  • Un URL subset al unui URI
    • Uniform Resource Locator
    • Specifică locația resursei și metoda de obținere
    • Resursa se poate obține prin HTTP

10 - Compose - Servicii web și Retrofit

6

7 of 39

HTTP

  • Fiecare cerere include un URL și este trimisă la server prin protocolul HTTP

  • Metode HTTP:
    • GET - obține date de pe server
    • POST - crează date noi pe server
    • PUT - actualizează date existente pe server
    • DELETE - șterge date de pe server

10 - Compose - Servicii web și Retrofit

7

8 of 39

Cerere HTTP - exemplu

8

9 of 39

Format standard

  • Aplicația comunică prin rețea cu serviciul web
    • primește un răspuns într-un format standard
    • îl transformă în obiecte utile aplicației

  • Răspunsul de la un serviciu web are un format standard
    • XML
    • JSON

  • JSON - perechi cheie - valoare

10 - Compose - Servicii web și Retrofit

9

10 of 39

Biblioteca Retrofit

10

11 of 39

Biblioteca Retrofit

  • Comunică cu backend-ul REST

11

12 of 39

Biblioteca Retrofit

  • Trimite cereri unui serviciu web de tip REST

  • API de rețea pe baza conținutului de la serviciul web

  • Suport pentru XML, JSON, etc.

10 - Compose - Servicii web și Retrofit

12

13 of 39

Biblioteca Retrofit

  • Obține datele de la serviciul web

  • Folosește biblioteci de conversie
    • Decodifica datele și a le transforma în obiecte
    • Ex. ScalarsConverter transformă datele în primitive

  • Creează codul pentru a apela serviciul
    • Folosește thread-uri diferite pentru cereri

10 - Compose - Servicii web și Retrofit

13

14 of 39

Biblioteca Retrofit

  • ViewModel comunică cu serviciul web prin Data layer

10 - Compose - Servicii web și Retrofit

14

15 of 39

Implementare folosind Retrofit - pași

1. Creăm o nouă sursă de date

2. Construim un obiect Retrofit

    • o fabrica de conversie și un URL de bază

3. Declarăm o interfață care specifică cum Retrofit comunică cu serverul web

4. Creăm serviciul Retrofit API

    • expunem instanța serviciului către restul aplicației

10 - Compose - Servicii web și Retrofit

15

16 of 39

Crearea unui obiect Retrofit

  • network/MarsApiService.kt
    • Declarăm un URL de bază
    • Creăm un obiect Retrofit cu o fabrica de conversie și URL-ul de bază

10 - Compose - Servicii web și Retrofit

16

17 of 39

Declararea interfeței

  • network/MarsApiService.kt
    • Declarăm o interfață care specifică cum Retrofit comunică cu serverul web
    • Funcție suspendabilă - asincronă (launch())

10 - Compose - Servicii web și Retrofit

17

18 of 39

Declararea interfeței

  • Adnotarea @GET = cerere GET
    • specificăm un endpoint (/photos)
      • Când se apelează getPhotos() se adaugă “/photos” la URL-ul de bază

10 - Compose - Servicii web și Retrofit

18

19 of 39

Expunerea serviciului Retrofit API

  • Creăm serviciul Retrofit API
  • Expunem instanța serviciului către restul aplicației

  • Avem nevoie de o singură instanță a serviciului
    • un obiect singleton public
  • network/MarsApiService.kt

10 - Compose - Servicii web și Retrofit

19

20 of 39

Expunerea serviciului Retrofit API

  • Inițializare lazy - inițializare înainte de prima folosire
  • Implementare dinamică a interfeței MarsApiService
  • Orice apel către MarsApi.retrofitService va accesa obiectul singleton care implementează MarsApiService

10 - Compose - Servicii web și Retrofit

20

21 of 39

ViewModelScope

  • viewModelScope este un domeniu predefinit de corutine asociat cu fiecare ViewModel

  • Orice corutină din acest domeniu este anulată dacă ViewModel-ul este distrus

  • Îl folosim pentru a lansa o corutină care face o cerere web în background

  • Cererea continuă în cazul unei schimbări de configurație

10 - Compose - Servicii web și Retrofit

21

22 of 39

Accesarea serviciului din ViewModel

  • În clasa de tip ViewModel
  • O funcție privată getMarsPhotos()
  • Lansăm corutina folosind viewModelScope.launch
    • asincron

22

23 of 39

Accesarea serviciului din ViewModel

  • Folosim obiectul Singleton pentru a accesa metoda getPhotos() a interfetei retrofitService
  • Actualizăm starea din ViewModel = rezultatul primit de la serviciul web

23

24 of 39

Permisiuni

24

25 of 39

Permisiuni

  • Pentru a accesa datele utilizatorului sau opțiuni de sistem

  • Acces Internet -> permisiunea INTERNET
    • o permisiune normală, aprobată automat la instalare
    • trebuie doar declarată în fișierul AndroidManifest.xml

10 - Compose - Servicii web și Retrofit

25

26 of 39

Gestiunea excepțiilor

26

27 of 39

Excepții

  • Probleme cu rețea care pot cauza excepții:
    • URL/URI-ul folosit în API este incorect
    • serverul nu este disponibil
    • latență de rețea
    • conexiune slabă la Internet
    • lipsa conexiunii la Internet

10 - Compose - Servicii web și Retrofit

27

28 of 39

Gestiunea excepțiilor

  • Gestiunea excepțiilor se face prin prinderea și tratarea lor
    • Blocuri try-catch
    • try -> cod care ar putea cauza o excepție
    • catch -> cod care previne terminarea abruptă a aplicației

10 - Compose - Servicii web și Retrofit

28

29 of 39

Gestiunea excepțiilor - exemplu

  • Prindem și tratăm excepția în interiorul lui launch()

10 - Compose - Servicii web și Retrofit

29

30 of 39

Parsarea unui JSON

30

31 of 39

JSON

  • Un vector care conține obiecte JSON (marcat cu [ ])
  • Fiecare obiect JSON între acolade

10 - Compose - Servicii web și Retrofit

31

32 of 39

JSON

  • Fiecare obiect JSON conține perechi chei-valoare, separate de virgulă

  • Cheia separată de valoare prin 2 puncte (:)

  • Valoarea poate fi string, număr, boolean, vector, obiect JSON, null

10 - Compose - Servicii web și Retrofit

32

33 of 39

Serializare

  • Serializare = transformarea datelor într-un format ce poate fi transferat prin rețea

  • Deserializarea = transformarea datelor primite de la o sursă externă într-un obiect utilizabil în aplicație

10 - Compose - Servicii web și Retrofit

33

34 of 39

kotlinx.serialization

  • Biblioteci pentru transformarea JSON-ului în obiecte Kotlin

  • Mapează cheile cu proprietățile unui obiect de date cu același nume
    • Mapare cu nume diferit - adnotat cu @SerialName

10 - Compose - Servicii web și Retrofit

34

35 of 39

Data class

  • Data class pentru stocarea rezultatelor parsării
  • Adnotare cu @Serializable
  • Adnotarea @SerialName dacă numele variabilei diferă de numele cheii din JSON

10 - Compose - Servicii web și Retrofit

35

36 of 39

Serializare - exemplu

  • Folosire Json.asConverterFactory pentru transformarea din JSON în obiecte
  • Serviciul întoarce o listă de obiecte

10 - Compose - Servicii web și Retrofit

36

37 of 39

Serializare - exemplu

  • În ViewModel
  • Afișăm dimensiunea listei de obiecte parsate

37

38 of 39

Bibliografie

10 - Compose - Servicii web și Retrofit

38

39 of 39

Cuvinte cheie

  • Servicii web
  • REST
  • Cereri web
  • HTTP
  • JSON
  • Retrofit
  • Biblioteci de conversie
  • ViewModelScope
  • Permisiuni
  • Excepții
  • Serializare

10 - Compose - Servicii web și Retrofit

39

39