SwiftUI API Call & Working with JSON-1

Ata Anıl Turgay
blutv
Published in
3 min readDec 29, 2021

Herkese merhaba, bu yazıda third party kütüphaneler kullanmadan api call nasıl yapılır, gelen json’ı nasıl Codable ile decode ederiz bu konuları ele alacağız.

Yazımızda bir url’e request atacağız ve response bize todo list dönecek. Todo list api servisine buradan ulaşabilirsiniz.

Haydi bir an önce başlayalım!

İlk adım olarak generic olmayan, sadece belli bir url’e request atıp response almamızı sağlayan bir method yazalım.

Result success ve failure caselerini barındıran bir enum’dır. Bu caseleri handle edebilmek için Result kullanırız. Method içerisinde görüldüğü gibi success durumunda TodoModel tipinde bir array beklerken, failure yani error durumunda ise kendi oluşturduğumuz APIError tipinde Error bekliyoruz.

Yazdığımız method bir url bekliyor. İlk olarak url’e null check uygulanır ve bu kontrol sonrasında eğer url’de bir sorun olduğu tespit edilirse completion ile hata döndür dedik. Döndürdüğümüz hata case’i badUrl. Daha sonra URLSession task’ı gelen url ile oluşturarak request gönderiyoruz ve data-response-error döndürmesini bekliyoruz.

URLSession task bize error döndü mü diye kontrol etmemiz gerekiyor. Aksi takdirde error’u handle etmezsek uygulamamız crash olabilir. Bunun için ilk olarak error durumunu kontrol ediyoruz ve error var ise completion ile bunu döndürüyoruz. Error yok ise data’nın null olma durumunu kontrol ettikten sonra bu datayı beklediğimiz modele convert edebilmek için bir JSONDecoder objesi yaratıyoruz. Do-catch bloğu içerisinde ilk olarak bu decoder’ı kullanarak gelen datayı beklediğimiz TodoModel tipindeki array’e decode ediyoruz. Ve oluşan array’i completion ile success case’inde dönüyoruz. Eğer datayı TodoModel tipindeki array’e decode ederken bir sorun oluşursa catch bloğuna düşecektir ve burada da completion ile parsing hatası dönüyoruz.

Gelin APIError’u inceleyelim!

APIError Error ve CustomStringConvertible protocollerini uygulayan bir enum’dır. Şimdilik içerisinde 4 case yarattık. Siz çeşitlendirmek isterseniz bu caseleri handle etmek istediğiniz hata durumlarına göre arttırabilirsiniz.

TodoModel tipinde array dönen response için request atan bir method yazdık ve dönen hata veya response’ları handle ettik. Peki başka tipte beklediğimiz responselar için de tekrar tekrar method mu yazacağız? Örneğin arabalar dönen bir response için CarModel tipinde, elmalar dönen bir response için AppleModel tipinde response dönen ve bunları handle eden ayrı ayrı methodlar mı yazacağız? Cevap tabii ki hayır:)

Gelin yukarıda yazdığımız TodoModel tipinde response bekleyen methodumuzu generic olacak şekilde revize edelim!

Methodun adını tüm requestler için ortak olacağı için fetch olarak refactor ettik. fetch methodu T tipinde yani generic tipte yani ister TodoModel ister CarModel ister AppleModel ister XModel olsun Decodable protocolü uygulanmış tüm class, struct vs. alabilir. Gördüğünüz üzere completiondaki Result içerisinde artık TodoModel değil T tipte yani generic tipte yani herhangi bir model tipinde response döndürmeyi bekliyor. Kafa karışıklığı yaratabilecek tek kavram burada type: T.Type parametresidir. Bu type parametresi aslında bu methodu çağırdığımız yerde vereceğimiz model type’ını temsil ediyor. Todo listi çağıracağımız class içerisinde type parametresine TodoModel vereceğiz ve hangi tipte response decode edip bize döndüreceğini bu type parametresi ile anlamasını sağlayacağız.

Bu yazıda ilk olarak belli bir model tipinde response dönecek bir method yazdık ve api call nasıl yapılır inceledik. Ardından da bu methodumuzu refactor ederek generic hale getirdik.

Bir sonraki yazıda bu yazıda ele aldığımız success ve error durumlarını handle ederek SwiftUI ile geliştirme yapacağız.

Herkese keyifli araştırmalar ve okumalar…

--

--