Sobes.tech
Middle

REST mimarisi hakkındaki anlayışınız nedir ve projelerinizde nasıl uyguladınız?

sobes.tech yapay zeka

AI'dan gelen yanıt

REST, mimarisi değil, dağıtık sistemler için tasarım ilkeleri kümesidir. Temel ilkeler:

  • İstemci-sunucu: Sorumlulukların ayrılması. İstemci kaynakları talep eder, sunucu sağlar.
  • Durumsuz (Stateless): Sunucu, istemci durumu hakkında bilgi tutmaz. Her istek, işleme için gereken tüm bilgileri içerir.
  • Önbelleğe alınabilir: İstemciler ve ara düğümler, sunucu yanıtlarını önbelleğe alabilir. Sunucu, önbelleğe alma imkanını belirtmelidir.
  • Katmanlı Sistem: İstemci, doğrudan son sunucu ile etkileşime geçmek zorunda değildir; ara katmanlar (örneğin, yük dengeleyiciler, proxyler) ile etkileşime geçebilir.
  • İstek Üzerinden Kod (Code on Demand): Sunucu, istemciye çalıştırılabilir kod sağlayabilir (örneğin, JavaScript). iOS geliştirmede nadirdir.
  • Bütünsel Arayüz: En önemli ilkedir. Etkileşim yapısını ve formatını belirler:
    • İsteklerde Kaynak Tanımlaması: Kaynaklar benzersiz URI'ler ile tanımlanır.
    • Temsiller aracılığıyla Kaynak Manipülasyonu: İstemci, kaynakları temsil eden JSON, XML gibi temsilleri kullanarak manipüle eder.
    • Kendini Açıklayan Mesajlar: Her mesaj, işleme için yeterli bilgiyi içerir.
    • Hipermedya ile Uygulama Durumunun Motoru (HATEOAS): Sunucu, yanıt gövdesinde diğer erişilebilir eylem veya kaynaklara bağlantılar sağlar. İstemcinin uygulama durumları arasında hipermedya aracılığıyla geçiş yapmasını sağlar.

iOS projelerinde, RESTful mimarisi şu yaklaşımlarla uyguladım:

  1. API ile çalışma: Backend ile etkileşimin büyük kısmı, HTTP metodları (GET, POST, PUT, DELETE) aracılığıyla erişim sağlayan RESTful API kullanılarak gerçekleştirildi.
  2. Framework kullanımı: URLSession (yerel) veya üçüncü taraflar, örneğin Alamofire, kullanarak HTTP istekleri yapma ve yanıtları işleme.
    // URLSession kullanarak örnek istek
    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("Hata: \(error?.localizedDescription ?? \"Bilinmeyen hata\")")
            return
        }
    
        // Yanıtın JSON formatında olduğunu varsayıyoruz
        if let json = try? JSONSerialization.jsonObject(with: data, options: []) {
            print(json)
        }
    }
    task.resume()
    
  3. Veri işleme: JSON yanıtların ayrıştırılması, JSONDecoder veya diğer yöntemlerle yapıldı.
    // JSON yanıtını decode etme örneği
    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("Kullanıcı ID: \(user.id), İsim: \(user.name)")
        } else {
            print("JSON decode başarısız")
        }
    }
    
  4. Veri modelleme: Sunucudan alınan kaynakları temsil eden Swift modelleri oluşturdum.
  5. Mimari desenler: REST API ile çalışma, kullanılan mimari desene göre entegre edildi (MVC, MVVM, MVP, VIPER). Örneğin, MVVM'de, ağ ile ilgili mantık genellikle Servisler veya Depolar katmanında bulunur.
  6. Önbellekleme: URLSession'ın yerleşik önbellekleme mekanizmalarını veya uygulama seviyesinde veri önbellekleme mantığını kullanarak performansı artırdım ve çevrimdışı çalışma desteği sağladım.
  7. Hata işleme: API'den alınan hataları detaylı şekilde işledim (örneğin, 401 Yetkisiz, 404 Bulunamadı), kullanıcıyı bilgilendirdim veya uygun adımlar attım.

Bütünsel Arayüz ve Durumsuz ilkeleri, iOS istemci uygulaması ile backend arasındaki etkileşimi tasarlarken anahtar oldu, API'yi öngörülebilir ve ölçeklenebilir hale getirdi.