URLSession: Temel Bilgiler

URLSession ile internetten veri işlemeyi öğrenin!

Ege Sucu
TurkishKit
5 min readJul 19, 2019

--

URLSession: Temel Bilgiler

Bir iOS uygulaması yazarken uygulama içinde butonlar, aksiyonlar, bilgiler ve metinler tasarlar, bunların birbirleri arasında pazarlık yapmasını sağlarız. Ancak bu pazar cihazınızla sınırlı kalır. Günümüzde pek çok iOS uygulaması İnternet ile etkileşimde kalır. Bir sunucudan veri almak veya bir sunucuya veri göndermek isteyebilirsiniz. Bunun için Apple URLSession adında yerel bir kütüphane kullanır.

Üçüncü parti kütüphaneler bu ihtiyacı ortadan kaldırabilir ancak her zaman işin kökenini öğrenmenizde fayda var. Bu sayede bir olayı tam anlamı ile kavrayabilirsiniz. Yazımıza başlamadan önce bugün yapacaklarımız ile ilgili biraz bilgi paylaşımı yapmakta yarar var.

HTTP Request

Sunucu ile yapılan veri alışverişi talep/cevap üzerinden ilerler.

HTTP(HyperText Transfer Protocol) İnternet bağlantısı olan cihazlar arası veri aktarmayı belirleyen protokole verilen isimdir. Bütün sitelerin kullandığı bu protokol sayesinde sunucuya istekte bulunarak veri alışverişi yapabiliriz. Bu istekler arasında en çok kullanılan istekler arasında “POST”, “GET”, “UPDATE” ve “DELETE” istekleri yer alır. İsimleri işlevleri hakkında bilgi veriyor olsa da bir siteden veri isterken GET isteği, sunucuya bilgi yollarken(Kayıt olma) POST isteği yolladığımızı belirtmem konseptin kafanızda oturması için yeterli olur. Bu yazıda örnek olarak GET isteğini kullanacağız ancak siz uygulamanızda diğer istekleri de kullanabilirsiniz.

JSON

JSON(JavaScript Object Notation) JavaScript dilinde kullanılan bir açık kaynak dosya formatıdır. Amacı içiçe(recursive) veri yapılarını metin olarak tutmak olan bu yapı sayesinde pek çok sunucuya veri gönderim ve alımı sağlamaktayız.

Bünyesinde Anahtar: Veri (Key: Value) ilişkisi sunduğundan anahtarını belirttiğimiz bir dosyaya ulaşabilir veya filtreleme yaparak tüm anahtarlara ulaşabiliriz. Bünyesinde bir veri de tutabilir, bir veri altında bir veri dizisi de. Bu sayede Facebook yazı listesinden Instagram listenize kadar pek çok yapıyı oluşturabiliyor. Bu yazıda alacağımız veri JSON olacağı için mantığını anlatmak istedim.

Data, Response, Error

Bir iletişim başlattığınızda İnternet size 3 tip sonuç verir. Bunlardan data olanı aldığınız sonuç olup bir .json dosyası veya bir .xml dosyası olabilir. Buna İngilizce’de data denir ve verilerimizi içerir. İkinci sonuç olan response ise sunucunun size verdiği durum bilgisidir. Buna İngilizce dilinde HTTP Status Code denir ve 100–500 arası kodları vardır. Bu kodları detaylı olarak bu yazıda inceleyebilirsiniz.

Kısaca bahsetmek gerekirse 200 kodu sunucu ile başarılı iletişim kurduğunuzu, 400 ile başlayan kodlar İnternet bağlantınızda sorun olduğunu gösterir. 500 ile başlayan kodlar ise sunucuda bir sorun olduğunu gösterir ve kullanıcı ile alakalı değildir.

Error ise sunucunun size attığı bir hata mesajıdır. Bağlantınız işlem sırasında kesilmiş olabilir, cihazı uçak moduna almış olabilirsiniz veya bağlantınız zayıf olup veri çekemiyor olabilirsiniz.

URLSession.dataTask methodu ile veri çekme/veri gönderme işlemi yapılır ve bu bize data, response, error adında üç sonuç atar.

Lokasyon

Dünya’nın enlem ve boylamları

Uygulamamızda kullanıcıdan bulunduğu konumu isteyeceğiz. Bu konum sonucunda sunucuya kullanıcının bulunduğu konumun enlem(latitude) ve boylamını(longitude) yollayacağımız için bize buna göre bir veri sunacak.

Konumu çekme, enlem/boylam alma ve uygulamaya veri dönme işlemi

Artık uygulamamıza başlayabiliriz.

API Edinme

Sunucular kendilerini kullanabilmeniz için size bir API anahtarı sunabilir. Biz bu yazı için OpenWeather adlı siteden bir ücretsiz API anahtarı aldık. Sitesine girdiğinizde siz de kayıt olarak kolayca bir API anahtarı alabilirsiniz. Bu sınırlamanın amacı çok fazla istekte bulunulmasını engelleyerek sunucu bazlı saldırıları önler ve para kazanmadıkları planlar üzerinden sitenin masraf görmesini engeller.

Postman gibi uygulamalar ile api anahtarınız ve sitenin size verdiği link ile veri çekip çekemeyeceğinizi görebilirsiniz.

API anahtarı sunan her site size onu nasıl kullanabileceğinizi gösterir. Genellikle bir sunucuya parametreler girerek sonuç alabilirsiniz. OpenWeather sizden enlem ve boylam değerleri ile api anahtarınızı parametre olarak alıp size o bölgedeki hava durumu bilgilerini sunabiliyor.

Güvenli Bağlantı Kurulumu

Öncelikle bir bağlantıyı güvenle kurmamız gerekiyor. Biraz önce bahsettiğim senaryoları düşünürseniz İnternetin kesilmesi sizin verilerinizi alamamanıza sebep olup. Ve eğer kodlarınızı dikkatli yazmazsanız uygulamanızın çökmesine sebep olabilir. Bu sebeple daha önce pek çok kez yazdığımız guard-let ve if-let kalıplarını çokça kullanacağız. Bu sayede eğer veriye ulaşabiliyorsak ulaşacağız, ulaşamayacaksak o an uygulamanın çökmesini önleyeceğiz.

Gelen Veriyi JSON Olarak Tanıma

JSON objelerini kullanılabilir veriye dönüştürme

İnternet’ten aldığınız veri JSON objesi olmayabilir. Bu yüzden önce bunu kontrol etmekte fayda var. Bizim elimizdeki yapıda weather ağacı ve bunun içinde kullanacağımız description anahtarı var. Ayrıca dereceleri main ağacı içinden alabileceğiz.

JSON Ağacımız

Önce ilk katmanın “weather” olduğundan emin olup, daha sonra içerisinde “description” içerdiğinden emin olmak pratik bir kodlama örneğidir. Force Cast dediğimiz (! Kullanma) yöntemi önermemekteyim, çünkü İnternet’ten veriyi doğru çekebildiğinizin ve veri olup olmadığının garantisi yok. Bu sebeple bu kullanım veri olmadığı durumlarda uygulamanızı çökertir.

Güvenli bir şekilde JSON objesinin içindeki değerlere ulaşıyoruz.

Model oluşturma

Bir Model Örneği

Bir model oluşturmak verileri düzenlemenize yardımcı olur. Bu örnekte “Weather” adında bir model oluşturup içerisine “Description”, “Temp”, “Min-Temp” ve “Max-Temp” isimli özellikler ekledik.

Bu sayede sunucudan çekeceğimiz eşitlemesi ile kolayca çekebilir, kodun sonunda bu objeyi döndürerek tüm verileri kendimizde tutabiliriz.

Neden DispatchQueue.async ?

Verimizi ekrana yansıtma sırasında bu methodu kullanıyoruz. Bunun sebebi uygulama yönetiminde.

Siz bir veri indirme işlemine başladığınızda artık ana işlemin (uygulamanın işleyişi) dışına çıkmış ve arkaplanda devam eden bir işleme (thread olarak geçer) başlamış oluyorsunuz.

Bu sırada ana işleyişte yer alan bir metodu (UILabel’a değer vermek gibi) direk çalıştırırsanız o zaman veri çekilmeden veri atmaya çalışıp başarısız olma veya daha kötüsü, uygulamanın çökmesine bile sebep olabilirsiniz. Bunu önlemek için bir if elemanı kullanabilirsiniz, bu sayede işlem bittiğinde ana işleme veri ile geri dönebilirsiniz.

Projemizi çalıştırdığımızda sonucu göreceksinizdir:

Ve uygulamamız hazır. Tüm projeyi Github üzerinden edinebilir, sorunuz varsa yorum kısmında belirtebilirsiniz. Keyifli kodlamalar. 😌

Swift Öğrenin. Uygulama Geliştirin. Sınırların Ötesine Geçin.

Hem kod yazmaya yeni başlayanların hem de profesyonellerin rahatlıkla takip edebilecekleri 40 saatlik videolu eğitim ile Swift programlama dilini derinlemesine keşfedin. Eğitim boyunca karşılaşacağınız problemleri birebir online görüşmelerde çözün.

Bizi daha yakından takip etmek istiyorsanız, sosyal medya hesaplarımıza aşağıdan ulaşabilirsiniz!

Twitter | Instagram | Facebook

URLSession serisiyle internetten veri transferi yapmayı öğrenin!

--

--