Sobes.tech
Middle

Koje je vaše razumevanje REST arhitekture i kako ste je primenjivali u svojim projektima?

sobes.tech АИ

Одговор од АИ

REST - nije arhitektura, već skup principa dizajna za distribuirane sisteme. Glavni principi:

  • Klijent-server: Podela odgovornosti. Klijent zahteva resurse, server ih pruža.
  • Stateless (bez stanja): Server ne čuva informacije o stanju klijenta između zahteva. Svaki zahtev sadrži sve potrebne informacije.
  • Cacheable (može se keširati): Klijenti i međuslojni čvorovi mogu keširati odgovore servera. Server mora naznačiti mogućnost keširanja.
  • Layered System (slojeviti sistem): Klijent ne mora direktno komunicirati sa krajnjim serverom; može komunicirati sa međuslojevima (npr. load balancer, proxy).
  • Code on Demand (po želji): Mogućnost da server pruža izvršni kod klijentu (npr. JavaScript). U iOS razvoju se retko koristi.
  • Uniform Interface (ujednačen interfejs): Najvažniji princip. Određuje strukturu i format interakcije:
    • Resource Identification in Requests: Resursi se identifikuju jedinstvenim URI-jevima.
    • Manipulation of Resources Through Representations: Klijent manipuliše resursima slanjem njihovih reprezentacija (npr. JSON, XML) serveru.
    • Self-descriptive Messages: Svaka poruka sadrži dovoljno informacija za obradu.
    • Hypermedia as the Engine of Application State (HATEOAS): Server pruža linkove na druge dostupne radnje ili resurse u telu odgovora. Omogućava klijentu da prelazi između stanja aplikacije putem hipermedije.

U iOS projektima sam primenjivao RESTful arhitekturu koristeći sledeće pristupe:

  1. Rad sa API: Glavni deo interakcije sa backend-om obavljao se putem RESTful API-ja, koji pruža pristup podacima i funkcionalnostima putem HTTP metoda (GET, POST, PUT, DELETE).
  2. Korišćenje framework-ova: Aktivno sam koristio framework-ove poput URLSession (nativni) ili treće strane, na primer Alamofire, za izvršavanje HTTP zahteva i obradu odgovora.
    // Primer zahteva korišćenjem URLSession
    let url = URL(string: "https://api.example.com/users/1")!
    let task = URLSession.shared.dataTask(with: url) { data, response, error in
        guard let data = data, error == nil else {
            print("Greška: \(error?.localizedDescription ?? "Nepoznata greška")")
            return
        }
    
        // Pretpostavljamo da je odgovor u JSON formatu
        if let json = try? JSONSerialization.jsonObject(with: data, options: []) {
            print(json)
        }
    }
    task.resume()
    
  3. Obrada podataka: Parsiranje JSON odgovora vršilo se pomoću JSONDecoder ili drugih metoda.
    // Primer dekodiranja JSON odgovora
    struct User: Decodable {
        let id: Int
        let name: String
    }
    
    func parseUserData(data: Data) {
        let decoder = JSONDecoder()
        if let user = try? decoder.decode(User.self, from: data) {
            print("ID korisnika: \(user.id), Ime: \(user.name)")
        } else {
            print("Neuspešno dekodiranje JSON")
        }
    }
    
  4. Modelovanje podataka: Kreirao sam Swift modele koji predstavljaju resurse dobijene sa servera.
  5. Arhitektonski obrasci: Rad sa REST API-jem integrisao sam u zavisnosti od korišćenog arhitektonskog obrasca (MVC, MVVM, MVP, VIPER). Na primer, u MVVM, logika rada sa mrežom često se nalazi u sloju Servisa ili Repozitorijuma.
  6. Keširanje: Koristio sam ugrađene mehanizme keširanja URLSession-a ili implementirao sopstvenu logiku keširanja podataka na nivou aplikacije radi poboljšanja performansi i rada u offline režimu.
  7. Obrada grešaka: Implementirao sam detaljnu obradu grešaka koje dolaze od API-ja (npr. 401 Unauthorized, 404 Not Found), obaveštavajući korisnika ili preduzimajući odgovarajuće radnje.

Principi Uniform Interface i Stateless bili su ključni pri projektovanju interakcije između iOS klijentske aplikacije i backend-a, čineći API predvidivim i skalabilnim.