Sobes.tech
Middle

Ποια είναι η κατανόησή σας για την αρχιτεκτονική REST και πώς την εφαρμόσατε στα έργα σας;

sobes.tech AI

Απάντηση από AI

Το REST δεν είναι μια αρχιτεκτονική, αλλά ένα σύνολο αρχών σχεδίασης για κατανεμημένα συστήματα. Οι βασικές αρχές:

  • Client-server: Διαχωρισμός ευθυνών. Ο πελάτης ζητά πόρους, ο διακομιστής τους παρέχει.
  • Stateless (Χωρίς κατάσταση): Ο διακομιστής δεν διατηρεί πληροφορίες σχετικά με την κατάσταση του πελάτη μεταξύ των αιτημάτων. Κάθε αίτημα περιέχει όλες τις απαραίτητες πληροφορίες.
  • Cacheable (Διαθέσιμο για cache): Οι πελάτες και οι ενδιάμεσοι κόμβοι μπορούν να cache-άρουν τις απαντήσεις του διακομιστή. Ο διακομιστής πρέπει να υποδεικνύει τη δυνατότητα cache.
  • Layered System (Πολυεπίπεδο σύστημα): Ο πελάτης δεν χρειάζεται να αλληλεπιδρά άμεσα με τον τελικό διακομιστή, μπορεί να αλληλεπιδρά με ενδιάμεσα επίπεδα (π.χ., load balancers, proxy).
  • 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): Ο διακομιστής παρέχει συνδέσμους σε άλλες διαθέσιμες ενέργειες ή πόρους στο σώμα της απάντησης. Επιτρέπει στον πελάτη να πλοηγείται μεταξύ καταστάσεων της εφαρμογής μέσω υπερμέσων.

Στα έργα iOS, έχω εφαρμόσει την αρχιτεκτονική RESTful, χρησιμοποιώντας τις ακόλουθες προσεγγίσεις:

  1. Εργασία με API: Το κύριο μέρος της αλληλεπίδρασης με το backend πραγματοποιούνταν μέσω 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?.localizedDescription ?? "Άγνωστο σφάλμα")")
            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("ID χρήστη: \(user.id), Όνομα: \(user.name)")
        } else {
            print("Αποτυχία αποκωδικοποίησης JSON")
        }
    }
    
  4. Μοντελοποίηση δεδομένων: Δημιουργούσα Swift μοντέλα που αντιπροσωπεύουν τους πόρους που λαμβάνονται από τον διακομιστή.
  5. Αρχιτεκτονικά μοτίβα: Ενσωμάτωσα την εργασία με REST API ανάλογα με το αρχιτεκτονικό μοτίβο που χρησιμοποιείται (MVC, MVVM, MVP, VIPER). Για παράδειγμα, στο MVVM, η λογική εργασίας με το δίκτυο βρίσκεται συχνά στο στρώμα των Υπηρεσιών ή των Αποθετηρίων.
  6. Cache: Χρησιμοποιούσα ενσωματωμένους μηχανισμούς cache του URLSession ή υλοποιούσα δική μου λογική caching δεδομένων σε επίπεδο εφαρμογής για βελτίωση της απόδοσης και offline λειτουργία.
  7. Διαχείριση σφαλμάτων: Υλοποιούσα λεπτομερή διαχείριση σφαλμάτων που λαμβάνονταν από το API (π.χ., 401 Unauthorized, 404 Not Found), ενημερώνοντας τον χρήστη ή λαμβάνοντας τα κατάλληλα μέτρα.

Οι αρχές της Ομοιόμορφης Διεπαφής και του Stateless ήταν κλειδιά κατά το σχεδιασμό της αλληλεπίδρασης μεταξύ της iOS εφαρμογής πελάτη και του backend, καθιστώντας το API προβλέψιμο και κλιμακούμενο.