Sobes.tech
Middle

Aké je vaše pochopenie architektúry REST a ako ste ju použili vo svojich projektoch?

sobes.tech AI

Odpoveď od AI

REST nie je architektúra, ale súbor návrhových princípov pre distribuované systémy. Hlavné princípy:

  • Klient-server: Rozdelenie zodpovedností. Klient požaduje zdroje, server ich poskytuje.
  • Stateless (bez stavu): Server neuchováva informácie o stave klienta medzi požiadavkami. Každá požiadavka obsahuje všetky potrebné informácie.
  • Cacheable (možno cache-ovať): Klienti a medzičlánky môžu cache-ovať odpovede servera. Server musí uviesť možnosť cache.
  • Layered System (vrstvený systém): Klient nemusí komunikovať priamo s konečným serverom; môže komunikovať s medzivrstvami (napr. load balancers, proxy).
  • Code on Demand (kód na požiadanie): Možnosť, aby server poskytoval spustiteľný kód klientovi (napríklad JavaScript). V iOS vývoji sa to používa zriedkavo.
  • Uniform Interface (jednotné rozhranie): Najdôležitejší princíp. Určuje štruktúru a formát interakcie:
    • Resource Identification in Requests: Zdroje sú identifikované jedinečnými URI.
    • Manipulation of Resources Through Representations: Klient manipuluje zdrojmi odosielaním ich reprezentácií (napríklad JSON, XML) serveru.
    • Self-descriptive Messages: Každá správa obsahuje dostatok informácií na spracovanie.
    • Hypermedia as the Engine of Application State (HATEOAS): Server poskytuje odkazy na iné dostupné akcie alebo zdroje v tele odpovede. Umožňuje klientovi prechádzať medzi stavmi aplikácie cez hypermediu.

V iOS projektoch som aplikoval RESTful architektúru s využitím nasledujúcich prístupov:

  1. Práca s API: Hlavná časť interakcie s backendom bola realizovaná cez RESTful API, ktoré poskytuje prístup k dátam a funkciám cez HTTP metódy (GET, POST, PUT, DELETE).
  2. Použitie frameworkov: Aktívne som používal frameworky ako URLSession (nativný) alebo tretie strany, napríklad Alamofire, na vykonávanie HTTP požiadaviek a spracovanie odpovedí.
    // Príklad požiadavky s použitím 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("Chyba: \(error?.localizedDescription ?? "Neznáma chyba")")
            return
        }
    
        // Predpokladáme, že odpoveď je vo formáte JSON
        if let json = try? JSONSerialization.jsonObject(with: data, options: []) {
            print(json)
        }
    }
    task.resume()
    
  3. Spracovanie dát: Parsovanie JSON odpovedí sa vykonávalo pomocou JSONDecoder alebo iných metód.
    // Príklad dekódovania JSON odpovede
    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 používateľa: \(user.id), Meno: \(user.name)")
        } else {
            print("Nepodarilo sa dekódovať JSON")
        }
    }
    
  4. Modelovanie dát: Vytvoril som Swift modely, ktoré reprezentujú zdroje získané zo servera.
  5. Architektonické vzory: Prácu s REST API som integroval v závislosti od použitých architektonických vzorov (MVC, MVVM, MVP, VIPER). Napríklad v MVVM je logika práce so sieťou často v vrstve Služieb alebo Repozitárov.
  6. Cacheovanie: Používal som vstavané mechanizmy cache URLSession alebo implementoval vlastnú logiku cacheovania dát na úrovni aplikácie na zvýšenie výkonu a prácu v offline režime.
  7. Spracovanie chýb: Implementoval som podrobné spracovanie chýb získaných z API (napríklad, 401 Unauthorized, 404 Not Found), informujúc používateľa alebo podnikajúc príslušné kroky.

Principy Uniform Interface a Stateless boli kľúčové pri navrhovaní interakcie medzi iOS klientskou aplikáciou a backendom, čím sa API stalo predvídateľným a škálovateľným.