Sobes.tech
Middle

Ի՞նչ է ձեր հասկանալը REST ճարտարապետության մասին և ինչպես եք այն կիրառել ձեր նախագծերում։

sobes.tech AI

Պատասխան AI-ից

REST - դա ոչ թե ճարտարապետություն է, այլ դիզայնի սկզբունքների հավաքածու՝ տարածված համակարգերի համար: հիմնական սկզբունքները:

  • Հաճախորդ-սերվեր: Պատասխանատվության բաժանում: Հաճախորդը խնդրում է ռեսուրսները, սերվերը դրանք տրամադրում է:
  • Stateless (պահպանում չլինել): Սերվերը չի պահում հաճախորդի վիճակի մասին տեղեկատվություն հարցումների միջև: Ամեն հարցում պարունակում է անհրաժեշտ ամբողջ տեղեկատվությունը:
  • Cacheable (կեշավորման հնարավորություն): Հաճախորդներն ու միջնորդական հանգույցները կարող են կեշավորել սերվերի պատասխանները: Սերվերը պետք է նշի կեշավորման հնարավորությունը:
  • Layered System (շերտավոր համակարգ): Հաճախորդը պարտադիր չէ անմիջապես շփվել վերջնական սերվերի հետ; նա կարող է շփվել միջնորդական շերտերի (օրինակ, բաշխիչների, պրոքսի) հետ:
  • Code on Demand (պարտադիր չէ): Սերվերը կարող է տրամադրել գործարկվող կոդ հաճախորդին (օրինակ, JavaScript): iOS-կառուցվածքում դա հազվադեպ է:
  • Uniform Interface (համամասնավոր ինտերֆեյս): ամենակարևոր սկզբունքը: սահմանում է շփման կառուցվածքը և ձևաչափը:
    • Resource Identification in Requests: ռեսուրսները նույնականացվում են յուրահատուկ URI-ներով:
    • Manipulation of Resources Through Representations: հաճախորդը մանիպուլյացիա է իրականացնում ռեսուրսների հետ, ուղարկելով նրանց ներկայացումներ (օրինակ, JSON, XML) սերվերին:
    • Self-descriptive Messages: յուրաքանչյուր հաղորդագրություն պարունակում է բավարար տեղեկատվություն իր մշակման համար:
    • Hypermedia as the Engine of Application State (HATEOAS): սերվերը տրամադրում է հղումներ այլ հասանելի գործողությունների կամ ռեսուրսների՝ պատասխանների մարմնում: Դա թույլ է տալիս հաճախորդին անցնել ծրագրի վիճակների միջև հիպերհղումներով:

ԻOS նախագծերում ես կիրառել եմ RESTful ճարտարապետությունը՝ օգտագործելով հետևյալ մոտեցումները:

  1. API-ի հետ աշխատել: հիմնական շփումը բեքենդի հետ իրականացվում էր RESTful API-ով, որը տրամադրում էր տվյալներ և ֆունկցիոնալություն HTTP մեթոդներով (GET, POST, PUT, DELETE):
  2. Ֆրեյմվորկների օգտագործում: ակտիվորեն օգտագործում էի URLSession (նատիվ) կամ երրորդ կողմի ֆրեյմվորկներ, օրինակ՝ Alamofire, HTTP հարցումների կատարելու և պատասխանների մշակման համար:
    // Օրինակ՝ 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("Error: \(error?.localizedDescription ?? "Unknown error")")
            return
        }
    
        // Ասում ենք, որ պատասխանն JSON է
        if let json = try? JSONSerialization.jsonObject(with: data, options: []) {
            print(json)
        }
    }
    task.resume()
    
  3. Տվյալների մշակումը: JSON պատասխանների վերլուծությունը կատարվում էր JSONDecoder կամ այլ մեթոդներով:
    // Օրինակ՝ JSON պատասխանների դեկոդավորում
    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("User ID: \(user.id), Name: \(user.name)")
        } else {
            print("Failed to decode JSON")
        }
    }
    
  4. Տվյալների մոդելավորում: Ստեղծում էի Swift մոդելներ, որոնք ներկայացնում էին սերվերից ստացվող ռեսուրսները:
  5. Արտաքին ճարտարապետական օրինակներ: ինտեգրում էի REST API-ի աշխատանքը՝ օգտագործելով տարբեր ճարտարապետական օրինակներ (MVC, MVVM, MVP, VIPER): Օրինակ՝ MVVM-ում, ցանցի աշխատանքը հաճախ գտնվում է Սերվիսների կամ Ռեպոզիտորիաների շերտում:
  6. Կեշավորում: օգտագործում էի URLSession- ի ներքին կեշավորման մեխանիզմները կամ իրականացնում էի սեփական տվյալների կեշավորման լոգիկան՝ բարելավելու արտադրողականությունը և աշխատելու օֆլայն ռեժիմում:
  7. Համախմբում սխալների մշակումը: իրականացնում էի մանրամասն սխալների մշակումը՝ ստացված API-ներից (օրինակ, 401 Unauthorized, 404 Not Found), տեղեկացնելով օգտվողին կամ ձեռնարկելով համապատասխան գործողություններ:

Համամասնավոր ինտերֆեյսի և Stateless սկզբունքները կարևոր էին հաճախորդային iOS հավելվածի և բեքենդի շփման նախագծման ժամանակ՝ making API predictable and scalable.