Sobes.tech
Middle

Kokia yra jūsų supratimas apie REST architektūrą ir kaip ją taikėte savo projektuose?

sobes.tech AI

Atsakymas iš AI

REST nėra architektūra, o dizaino principų rinkinys paskirstytoms sistemoms. Pagrindiniai principai:

  • Kliento-serveris: atsakomybės paskirstymas. Klientas užklausia išteklių, serveris juos teikia.
  • Stateless (be būsenos): Serveris neįsimena kliento būsenos informacijos tarp užklausų. Kiekviena užklausa turi visą reikalingą informaciją apdorojimui.
  • Cacheable (kaupti galima): Klientai ir tarpiniai mazgai gali talpinti serverio atsakymus į talpyklą. Serveris turi nurodyti talpyklavimo galimybę.
  • Layered System (sluoksniuota sistema): Klientas neprivalo tiesiogiai sąveikauti su galutiniu serveriu; jis gali sąveikauti su tarpiniais sluoksniais (pvz., apkrovos balansavimo, proxy).
  • Code on Demand (nebūtina): Serveris gali teikti vykdomą kodą klientui (pvz., JavaScript). iOS projektuose tai retai naudojama.
  • Uniform Interface (vienodas sąsaja): svarbiausias principas. Apibrėžia sąveikos struktūrą ir formatą:
    • Resource Identification in Requests: ištekliai identifikuojami unikaliomis URI.
    • Manipulation of Resources Through Representations: klientas manipuliuoja ištekliais, siunčdamas jų reprezentacijas (pvz., JSON, XML) serveriui.
    • Self-descriptive Messages: kiekviena žinutė turi pakankamai informacijos apdorojimui.
    • Hypermedia as the Engine of Application State (HATEOAS): serveris teikia nuorodas į kitas prieinamas veiksmus ar išteklius atsakymo turinyje. Tai leidžia klientui pereiti tarp programos būsenų per hipermediją.

iOS projektuose aš taikiau RESTful architektūrą naudodamas šiuos požiūrius:

  1. API naudojimas: pagrindinis sąveikos su backend vykdavo per RESTful API, teikiančią prieigą prie duomenų ir funkcijų per HTTP metodus (GET, POST, PUT, DELETE).
  2. Framework'ų naudojimas: aktyviai naudojausi URLSession (natūralus) arba trečiųjų šalių framework'ais, pvz., Alamofire, HTTP užklausų vykdymui ir atsakymų apdorojimui:
    // Pavyzdys su `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("Klaida: \(error?.localizedDescription ?? "Nežinoma klaida")")
            return
        }
    
        // Tikimės, kad atsakymas JSON formate
        if let json = try? JSONSerialization.jsonObject(with: data, options: []) {
            print(json)
        }
    }
    task.resume()
    
  3. Duomenų apdorojimas: JSON atsakymų analizė buvo atliekama naudojant JSONDecoder arba kitus metodus:
    // Pavyzdys JSON dekodavimo
    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("Vartotojo ID: \(user.id), Vardas: \(user.name)")
        } else {
            print("Nepavyko dekoduoti JSON")
        }
    }
    
  4. Duomenų modeliavimas: Sukūriau Swift modelius, atitinkančius iš serverio gaunamus išteklius.
  5. Architektūros šablonai: Integravau darbą su REST API priklausomai nuo naudojamo architektūros šablono (MVC, MVVM, MVP, VIPER). Pavyzdžiui, MVVM, tinklo logika dažnai būna Service arba Repository sluoksnyje.
  6. Kaupimas: Naudojau URLSession įmontuotus kaupimo mechanizmus arba įgyvendinau savo duomenų kaupimo logiką programos lygyje, siekiant pagerinti našumą ir dirbti neprisijungus.
  7. Klaidų apdorojimas: įgyvendinau detalią klaidų apdorojimą, gaunamą iš API (pvz., 401 Unauthorized, 404 Not Found), informuodamas vartotoją arba imdamasis atitinkamų veiksmų:

Uniform Interface ir Stateless principai buvo svarbūs kuriant sąveiką tarp kliento iOS programos ir backend, užtikrinant API prognozuojamumą ir mastelį.