Merhaba,
Bu yazıda size Swift ile network işlemlerini ek bir kütüphane kullanmadan nasıl yapabileceğinizden bahsetmek istiyorum.
iOS geliştiricileri için Swift için Alamofire, Objective-C içinde AFNetwork oldukça yaygın kullanıma ve bilinirliğe sahip. Zaten yanlış hatırlamıyorsam Alamofire, AFNetwork’ü yapanlar tarafından çıkarılmıştı. Bende bu yapıyı oluştururken Moya’dan etkilenmiştim.
Swift’e yeni başladıysanız veya ben ek kütüphane kullanmak istemiyorum diyorsanız bu yazı size bir fikir verebilir. Sürekli kütüphane kullanmanın insanı körelttiğine inanan biri olarak boşu boşuna dependency eklemeye gerek olmadığını düşünüyorum.
Öncelikle HTTP istekleri için 2 tane enum oluşturalım. İlki HTTPMethod, ikincisi de HTTPEncode.
[gist id=”0b5fc4466f28a85769117752fe27077b”]
HTTPMethod, standart bir http isteği için kullanacağımız tipi barındıracak. HTTPEncode ise sunucuya göndereceğimiz verileri nasıl ileteceğimizle ilgili. Örnek vermek gerekirse “url” tipinde bir encode yaptığımızda sunucuya gideceğimiz url’e veriler QueryString olarak eklenir. Diğer seçenekte ise body içerisinde JSON formatında iletilir.
Şimdi sıra network isteği için kullanacağımız NetworkTarget enum’unda.
Bu aşamada network isteğimizle ilgili tüm işlemleri, Swift’in enum için bizlere sunduğu son derece kullanışlı özellikler ile yaratacağız. Enum kullanımı konusunda daha fazla bilgi almak istiyorsanız veya daha önce hiç kullanmadıysanız Swift dökümantasyonunundan bilgi alabilirsiniz.
Bir network isteği gönderebilmemiz için bize gereken bilgiler şunlar:
- Sunucu adresi (baseUrl)
- İstek yapacağımız path
- Sunucuya gönderilecek -gerekiyorsa- parametreler
- Bu parametreleri nasıl göndereceğimizi belirleyen bir encoding bilgisi (HTTPEncode)
- İstek tipi (HTTPMethod)
- Port -gerekiyorsa-
- Header’da gönderilecek ekstra bilgiler (Authentication token gibi)
Yukarıda belirttiğim tüm bilgileri şimdi tek tek NetworkTarget içine yerleştirelim.
[gist id=”f288cfb13dd5be7f56724d752d62fe2f”]
Kendi kullanımıza göre NetworkTarget’in property’lerini değiştirip genişletebilirsiniz. Sunucu bilgileri ve route’lar gerçek değil baştan belirteyim 🙂
Şimdi sıra yukarda tanımladığımız enum’dan nasıl bir network isteği oluşturacağımıza geldi.
Standart olarak Apple’ın bize verdiği URLSession tüm network isteklerinin kalbini oluşturuyor. Yani size Alamofire’da kullansanız aslında bir URLSession isteği atıyorsunuz. Detaylarını öğrenmek için Apple URLSession sayfasına bakabilirsiniz.
Bir istek yaratmak içinde bir -tabi gerekiyorsa- bir request modeli ve dönen yanıtı çevirip kullanıcıya gösterebilmek içinde bir response modeli gerek. Swift’te belirlediğimiz modelleri Codable protocol’ü ile JSON’a ve JSON’dan çeviriyor. Aslında request model için Encodable, response için Decodable protocolleri.
Aşağıda hem örnek modelleri hemde network isteği yaratan fonksiyonu yazdım.
[gist id=”3d3476aeba07e7ec36f0b6fe8ce123c5″]
RESTFUL bir sunucu ile iletişimdeyseniz Http status code’ları da önem taşır. Onun içinde HTTPURLResponse enum’ını kullandım.
Önemli bir uyarı: QueryString olarak göndereceğiniz verileri encode etmeniz gerekebilir. Yukarıdaki JSONHelper’ın yaptığı özetle bu.
Peki bu enumları nasıl çağırıp kullanacağız. Oldukça basit.
[gist id=”50a88a26f911ac9369acb3c2c3908d2a”]
Özetlersek:
İstek başarılı sonuçlanırsa completionHandler çağırılır. Başarısız ise failureCompletion. Ekstra kütüphane kullanmadan bence çoğu koşulda ihtiyacınızı karşılayabilecek basit bir yapı. Hem kontrol tamamen sizde hemde istediğiniz gibi özelleştirebilirsiniz. Ben dosya gönderim/alım eklemedim. Onuda yorumlara siz eklersiniz.
Umarım faydalı olabilmiştir. Okuduğunuz için teşekkür ederim.
Leave a Reply