Web module anlatmadan önce web sunucusu ve web uygulama mimarisi hakkında bilgi verelim. Web tasarımı ve programlama dersini alan öğrencilerim bu kısmı bilirler. Bu konu hakkında daha geniş bilgi için ders slaytlarıma (özellikle 1. Hafta) bakabilirsiniz.
Web Ortamı
Bir web sunucusu web tarayıcısı gibi bir HTTP istemcisinden gelen HTTP isteğini alıp istemciye cevap olarak web sayfası (HTML dökümanı, resimler, stil dosyaları, javascript kodları) döndüren bir yazılımdır. Bunların günümüzde en çok kullanılanları Apache HTTP Server, IIS (Internet Information Server) ve Nginx olarak gösterilebilir. Ayrıca, çoğu web sunucusu PHP, ASP.NET, Phyton, Ruby, JSP gibi dillerin sunucu taraflı scriptlerini destekler. Bu script’ler sayesinde veritabanında bilgi almak ve sunucu tarafında işlem yapmak mümkün hale gelir. Bu script’ler üretilen sonuçlar yine bir web sayfası şeklinde istemciye gönderilir. Dikkat edildiyse web sunucuları ve sunucu taraflı diller ayrı ayrı mekanizmalardır. Ancak, Node.js bu alışılmış düzeni değiştirdi. Node.js hem sunucu hem de sunucu taraflı bir script dili olarak düşünülebilir. Şimdi Node.js ortamında basit bir sunucu oluşturalım.
Bir Node.js Sunucusu
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
var http = require('http'); var fs = require('fs'); var url = require('url'); // Sunucu olustur http.createServer( function (request, response) { // Gelen URL'yi çözümle, istenen sayfayi bul var pathname = url.parse(request.url).pathname; // URL'den gelen sayfa, console.log("Istenen sayfa " + pathname + " alindi."); // Istenen sayfayi sunucunun dosya sisteminden oku fs.readFile(pathname.substr(1), function (err, data) { if (err) { console.log(err); // İstenen sayfa bulunmadiysa 404 hatasi uret. // HTTP Status: 404 : NOT FOUND // Content Type: text/plain response.writeHead(404, {'Content-Type': 'text/html'}); }else { // Istenen sayfa bulundu: HTTP Status: 200 : OK // Content Type: text/plain response.writeHead(200, {'Content-Type': 'text/html'}); // Dosyadan okunan degeri cevaba yaz response.write(data.toString()); } //Cevabi istemciye gonder response.end(); }); }).listen(8081); //dinlenen port bilgisi // Sunucunun calistigi IP ve dinledigi port console.log('Sunucu calisiyor: http://127.0.0.1:8081/'); |
Node.js üç modül koda eklenmiştir. “http” modülü sunucu oluşturmak için, “fs” modülü dosya okumak için ve “url” modülü gelen url’yi çözümlemek için metotlar içerir. Http modülündeki createServer metodu ile sunucu oluşturulur ve listen ile de sunucu gelen istekleri dinler. Listen bölümüne hangi portun dinleneceği bilgisi yazilir. createServer metodu response ve request olmak üzere iki parametre içerir. request içinde url bilgisi vardır. URL modülündeki parse metodu ile IP adresi veya web adresi gibi çıkarılıp yol bilgisi elde edilir. fs modülündeki readFile metodu ile url’den alınan yol bilgisi kullanılarak dosya okunur. Eğer dosya okuması başarılı ile yapılırsa response’a eklenir. Ayrıca, bu bilgi eklenmeden önce response head kısmı eklenmelidir. (200 sayfa bulundu anlamına gelir.) Browser’ınızı açıp “http://127.0.0.1:8081/” yazın ve sayfayı bekleyin.
Node.js ile İstemci Yapma
Node.js ile istemci yapabildiğiniz gibi bir sunucudan veri çeken bir kodda yazabilirsiniz. Bir anlamda bir web tarayıcısının en temel veri alma işlevini yapalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
var http = require('http'); // Istek icin kullanilan ayarlar var options = { host: 'localhost', port: '8081', path: '/index.htm' }; // Istek icin kullanilacak callback fonksiyonu var callback = function(response){ //web sayfasi adim adim aliniyor var body = ''; response.on('data', function(data) { body += data; //veri birden fazla parcadan olusabilir. }); response.on('end', function() { // Veri alma islemi bitti. console.log(body); }); } // Sunucuya bir istek olustur var req = http.request(options, callback); req.end(); |
Options ve callback bölümleri http.request metodu tarafından kullanılacaktır. Options bölümünde istenilecek web sayfası ile ilgili bilgiler vardır. callback fonksiyonu istenen veriyi almaya başlar. Ama istenen veri birden fazla paket içinde gelebilir. O yüzden “data” olayı veri geldikçe çalışır ve body kısmına sonuçları toplar (TCP’nin çalışmasını hatırlayalım). “end” olayı transfer bittiğinde aktive olur. Burada sonuçlar konsol ekranına yazdırılmıştır. http.request ile bir http isteği oluşturulur. options ve callback bölümlerine göre bu metot çalışır. http istemi tamamlandıktan sonra req.end() ile istem bitirilir (http ve tcp konularını hatırlayalım).