1 of 38

Tehnici avansate pentru

dezvoltarea aplicațiilor mobile

10 - Compose - Servicii web și Retrofit

2 of 38

Data layer

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

  • ViewModel
    • cere datele de la Data layer (serviciul Retrofit)
    • transforma datele în starea UI-ului
    • modificarea stării => actualizarea UI-ului

10 - Compose - Servicii web și Retrofit

2

3 of 38

Data layer

3

4 of 38

Servicii web

4

5 of 38

REST

  • REpresentational State Transfer

  • Arhitectură web stateless

  • Servicii RESTful

  • Cereri web de tip REST
    • GET, POST, PUT, DELETE

10 - Compose - Servicii web și Retrofit

5

6 of 38

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 38

HTTP

  • Fiecare cerere
    • include un URL
    • 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 38

Cerere HTTP - exemplu

8

9 of 38

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 38

Biblioteca Retrofit

10

11 of 38

Biblioteca Retrofit

  • Trimite cereri unui serviciu web de tip REST
  • Suport pentru XML, JSON, etc.

11

12 of 38

Biblioteca Retrofit

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

  • 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

10 - Compose - Servicii web și Retrofit

12

13 of 38

Biblioteca Retrofit

  • ViewModel comunică cu serviciul web prin Data layer

10 - Compose - Servicii web și Retrofit

13

14 of 38

Implementare folosind Retrofit - pași

1. Creăm o nouă sursă de date (fisier .kt în network/)

2. Construim un obiect Retrofit

    • un URL de bază
    • o fabrica de conversie

3. Declarăm o interfață

    • 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

14

15 of 38

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

15

16 of 38

3. Declararea interfeței

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

10 - Compose - Servicii web și Retrofit

16

17 of 38

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

17

18 of 38

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

18

19 of 38

4. Expunerea serviciului Retrofit API

  • Inițializare lazy - înainte de prima folosire
  • Implementare dinamică a interfeței MarsApiService
  • MarsApi.retrofitService
    • va accesa implementarea interfeței

10 - Compose - Servicii web și Retrofit

19

20 of 38

ViewModelScope

  • viewModelScope - un domeniu predefinit de corutine
    • asociat cu fiecare ViewModel
    • lansăm o corutină care face cererea web în background
    • cererea continuă în cazul unei schimbări de configurație

  • ViewModel-ul este distrus
    • => corutinele din acest domeniu sunt anulate

10 - Compose - Servicii web și Retrofit

20

21 of 38

Accesarea serviciului din ViewModel

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

21

22 of 38

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

22

23 of 38

Permisiuni

23

24 of 38

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

24

25 of 38

Gestiunea excepțiilor

25

26 of 38

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

26

27 of 38

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

27

28 of 38

Gestiunea excepțiilor - exemplu

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

10 - Compose - Servicii web și Retrofit

28

29 of 38

Parsarea unui JSON

29

30 of 38

JSON

  • Un vector de obiecte JSON (marcat cu [ ])
  • Fiecare obiect JSON între { }
    • perechi chei - valoare

10 - Compose - Servicii web și Retrofit

30

31 of 38

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

31

32 of 38

Serializare

  • Serializare = transformarea datelor/obiectelor î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

32

33 of 38

kotlinx.serialization

  • Biblioteci pentru transformarea JSON-ului în obiecte Kotlin

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

10 - Compose - Servicii web și Retrofit

33

34 of 38

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

34

35 of 38

Serializare - exemplu

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

10 - Compose - Servicii web și Retrofit

35

36 of 38

Serializare - exemplu

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

36

37 of 38

Bibliografie

10 - Compose - Servicii web și Retrofit

37

38 of 38

Cuvinte cheie

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

10 - Compose - Servicii web și Retrofit

38

38