NodeJS Adım 7 – HttpClient ve Events(Olaylar)

Adım Adım Nodejs yazı dizimizin bir önceki bölümünde npm yani nodejs package manager’dan ve paket yönetiminden bahsetmiştik.

Hatırlarsanız daha önceki bölümlerde de callback fonksiyonundan bahsetmiştik. Callback fonksiyonu sayesinde asenkron işlemlerin bitiminde yapmamız gerekenleri belirtebiliyorduk. Peki asenkron işlemler sırasında “bitmek” olayı dışında başka olaylar meydana geldiğinde callback fonksiyonu gibi bir fonksiyonla o olay sırasında yapılması gereken işlemleride belirtebilir miyiz? Tabikide yapabiliriz. nodejs’in olaylar özelliği sayesinde meydana gelen her olayda bir fonksiyon çalışmasını sağlayabiliriz.

Bu bölümde örnek olarak bir web sayfasını çağıracağız ve onun üzerinde meydana gelen olaylara fonksiyon atayacağız. Bunun için kullanacağımız modül nodejs’in kendi modülü olan http modülü. Bu modül sayesinde http protokolü ile alakalı neredeyse her işlemi yapabiliriz. Nodejs’in en güçlü olduğu yanlardan bir tanesi web. Bunu sağlayan en önemli parçalardan bir taneside http modülü. Nodejs’in hem asenkron mimarisi, hem olay bazlı yapısı, hemde http modülü birleşince nodejs’in web üzerinde ölçeklenebilir web siteleri, web uygulamaları ve api yazmak çok cazip hale geldi.

Http modülünü kullanan ilk örneğimiz şu şekilde:

 

 var http = require("http")

http.get("https://www.emrekacan.net",function (response) {
    response.setEncoding('utf8')
    response.on('data',function (data) {
        console.log(data)
    })
})

7-1-node-httpclient

İlk satırda nodejs’in global http modülünü çağırıp http değişkenine atıyoruz. Daha sonra http modülünün get fonksiyonu ile https://www.emrekacan.net adresine istekte bulunuyoruz. Yani sanki web tarayıcısından girer gibi bu adrese http modülünün get metodu ile giriyoruz. İstek işleminin bitiminde de callback fonksiyonunu çalıştırıyoruz. Callback fonksiyonumuza tek parametre dönderiliyor. Oda response yani cevap değişkeni. response değişkeni ile yapmış olduğumuz isteğe verilecek cevap hakkında bilgi alabiliriz. Callback fonksiyonunun ilk satırında setEncoding ile yazı formatımızı uft8 olarak belirliyoruz. Yazılarımız bozuk çıkmasın diye. Geldik asıl yere. response değişkeninin on metodu ile bize gönderilecek cevap ile ilgili olaylar meydana geldiğinde işlemler yapabiliriz. Örneğimizde response.on(‘data’,…) şeklinde yazmış olduğumuz ifade şu anlama geliyor: response değişkeninde her data olayı gerçekleştiğinde şu fonksiyonu çalıştır. data olayı nedir peki? Biz bir web adresine istekte bulunduğumuzda web adresi bize tek seferde teslim edilmez. Parça parça teslim edilir. İşte her bir parça bize teslim edildiğinde data olayı çalışır. Yani data olayı data teslim edildi olayıdır. Buradaki callback fonksiyonu da her data teslim edildiğinde çalışır ve bu datayı konsola yazar.

Burada şöyle bir soru gelebilir aklınıza: E hani callback fonksiyonu dediğimiz şey işlem bitince çalışıyordu. http.get() fonksiyonunun callback fonksiyonuda web sayfasının yüklenmesi bitince çalışması gerekmiyor mu? Eğer bitince çalışıyorsa bitmiş birşeyin data olayına nasıl erişiyoruz? Şöyle cevaplayayım. Siz bir tarayıcı çalıştırıp adres bölümüne adresi yazdığınızda sizin web sayfası çağırma işleminiz bitmiş oluyor. Daha sonra o web sayfasının yüklenme işlemi başlıyor. Burada da aynı mantık var aslında. Siz http.get(…) fonksiyonunu kullandığınızda bu fonksiyon belirtilen adresi çağırıyor. Çağırma işlemi bitiyor. Daha sonra sayfanın yüklenme işlemi başlıyor. Bu sırada da bizim http.get(…) fonksiyonuna yollamış olduğumuz callback fonksiyonu çalışıyor. Aslında http.get(…) fonksiyonunun callback fonksiyonuna yollanan response parametresi de başlayan bu yüklenme işlemi zaten. Bu sayede yüklenme işleminin data fonksiyonuna erişebiliyoruz.

Peki bu response’un başka olayları yok mu? Tabiki var. Bi örnek daha yapalım:

 

var http = require("http")

http.get(process.argv[2], function (response) {
    response.setEncoding('utf8')
    response.on('data', function (data) {
        console.log(data)
    })
    response.on('end', function () {
        console.log('Yüklenme işlemi bitti.')
    })
    response.on('error', function (hata) {
        console.log('Yüklenme sırasında bir hata oluştu:' + hata.message)
    })
})
.on('error', function (hata) {
    console.log("Web adresinin açılması sırasında bir hata oluştu." + hata.message)
})

7-2-node-httpclient

Bu örnek bir önceki örnekle hemen hemen aynı. Bu örnekte web adresini konsoldan parametre olarak alıyoruz. Ek olarakta iki tane daha olay ekledim. Birisi end olayı. Adında anlaşılacağı üzere yükleme işlemi bittiğinde tetiklenen olaydır. Diğeri ise error olayı. Buda herhangi bir hata olduğunda tetiklenen bir olaydır. En altta http.get(…) fonksiyonunun dışında bir olay daha var. Oda error olayı. Buda herhangi bir hata anında tetiklenen bir olay. Peki iki error olayının farkı ne? Aslında yazıldıkları yerlere bakınca farkı anlayabiliriz. http.get(…) fonksiyonunun içerisine yani response’a yazılan error olayı yükleme sırasında bir hata oluştuğunda tetiklenir. http.get(…) fonksiyonunun dışına yazılan error olayı ise istek sırasında herhangi bir hata oluşursa tetiklenecek olaydır.

Olaylar yardımı ile bir web adresine istekte bulunup cevabı almayı gördük. Peki bu bizim ne işimize yarayacak? Gelen html içeriği xml parser araçları yardımı ile parse edebilirsiniz yani ayıklayabilirsiniz ve içerisinde işinize yarayabilecek verileri alabilirsiniz. Ya da belirli sürelerde web sitelerinin arşivini yapmak isteyebilirsiniz. Bunlar gibi şeyler yapılabilir ama en mantıklısı API’ları kullanmaktır. API’lar yine http protokolü ile çalışan URL’ler üzerinden ulaşabildiğimiz bize daha net bilgi veren json veya xml formatında kullanılabilen web servisleridir. Örneğin hava durumunu bize sunan bir API düşünün. Siz URL’inizi yazıyorsunuz, nerenin hava durumunu öğrenmek istediğinizi yazıyorsunuz ve size kısa bir json nesnesi dönüyor. Sizde ano alıp işliyorsunuz. Bu kadar. İşte bu basit bir API örneği. Bizde örneğimizde bunu kullanacağız. Diğer örneğimize geçelim.

Bu örnekte openweathermap.org sitesinin API larını kullanacağız. Belirli bir sınıra kadar ücretsiz. Örnek için yeterli. Bunun siteye üye olmanız gerekiyor. Üye olduktan sonra API Keys bölümünden yeni bir API Key oluşturabilir veya varolan API Key’i kullanabilirsiniz.

7-4-httpclient

Tabi bu API’lerin nasıl kullanılacağını dokümantasyonundan öğreniyoruz. Dokümantasyonu incelediğimizde belirtilen yerin şuan ki hava durumunu öğrenmek için şöyle bir URL yeterli olacaktır : http://api.openweathermap.org/data/2.5/weather?q=YER&appid=APIKEY  . YER yerine Ankara, İstanbul, Kayseri gibi bir yer ismi, APIKEY yerinede oluşturmuş olduğunuz API Key’lerden bir tanesini yerleştirin. Bunu herhangi bir tarayıcıdan çalıştırdığınızda size JSON bir değer dönderecektir. İşte biz bu JSON nesneyi Kullanacağız. Bir sonraki örnekte Konsoldan il adını alıp ekrana hava durumu sonucunu yazan bir uygulama yapacağız. Kodlarımıza geçelim:

 

var http = require("http")

http.get('http://api.openweathermap.org/data/2.5/weather?q=' + process.argv[2] + 
'&units=metric&appid=02583a7bfd3cd5d870c5fa483017fd61', function (response) {
    response.setEncoding('utf8')

    var sonuc = '';

    response.on('data', function (data) {
        sonuc = sonuc + data;
    })
    response.on('end', function () {
        var jsonSonuc = JSON.parse(sonuc);
        console.log(jsonSonuc.main.temp)
    })
    response.on('error', function (hata) {
        console.log('Yüklenme sırasında bir hata oluştu:' + hata.message)
    })
})
.on('error', function (hata) {
    console.log("Açılma sırasında bir hata oluştu." + hata.message)
})

7-3-node-httpclient

İnceleyecek olursak ilk satır http modülünün çağırılarak http değişkenine atıyoruz. Bir sonraki satırda http.get(…) fonksiyonuna API’ın URL’ini yazıyoruz. URL içerisindeki process.argv[2] bölümünde ise konsoldan aldıdığımız il adını URL içerisine ekliyoruz. URL’in sonundaki appid bölümündeki Key alanını siz kendi keyiniz ile değiştirin. Daha sonra callback fonksiyonumuz çalışıyor. Callback fonksiyonu içerisinde sonuc isminde bir değişken oluşturdum. Daha sonra data olayında gelen dataları sürekli olarak sonuc değişkenine ekledim. (Normalde çok kısa bir cevap olduğu için tek seferde geliyor. Ama önlem olarak değişkene atmak faydalı.) end olayında ise elde ettiğim sonuc değişkenini JSON’a dönüştürdüm ve jsonSonuc değişkenine attım. Son olarakta ekrana jsonSonuc nesnesinin main.temp değerini yazdırdım. Hava durumu sonucunun main.temp içerisinde olduğunu nerden biliyorum? Tabiki dokümantasyondan. Onun dışında API URL’ini tarayıcı üzerinden çalıştırarak da bakabilirsiniz. İşte bu kadar. Artık konsol üzerinden hava durumu öğrenebileceğimiz bir programımız var.

HttpClient ve Olaylar konumuzda bu kadar. Bu bölümde bir web sayfasını nasıl çağırabileceğimizi, çağırdıktan sonra yüklenme işlemine nasıl erişebileceğimizi ve bu yüklenme işlemindeki olaylara nasıl erişebileceğimizi gördük.

Bir sonraki bölümde kendi web sayfalarımızı nasıl yapabileceğimizi göreceğiz.

Makalede kullanılan kodlara buradan ulaşabilirsiniz.


Bloga e-posta ile abone ol

Bu bloga abone olmak ve e-posta ile bildirimler almak için e-posta adresinizi girin.

Bir Cevap Yazın