Node.js http Modülü

Yazıda Node.js ile web sunucu işlemleri için kullanılan http modülü ile ilgili bilgiler yer almaktadır.

Sunucu taraflı çalışan programlama dilleri sunucu ile istemci arasında bağlantıyı sağlayan web sunucuya ihtiyaç duyar.

Web sunucusunun çalışma prensibi temel olarak kullanıcıdan aldığı istekleri sunucuya iletmesi ve sunucunun cevabını ise kullanıcıya iletmesidir.

PHP, ASP.NET, JSP gibi sunucu taraflı programlama dilleri içerisinde HTTP isteklerine cevap veren bir yapı bulunmaz.

Bu programlama dilleri isteklere cevap veren Apache HTTP, IIS, nginx gibi web sunucularını kullanır.

Node.js diğer sunucu taraflı programlama dillerinden farklı olarak HTTP isteklerine asenkron olarak cevap veren ve istek gönderen çekirdek/yerleşik HTTP modülü bulunur.

Modülün kullanılması için dahil edilmesi gerekir.

const http = require('http');

HTTP modülünü dahil ettiğimizde modül kullanmamız için bize çeşitli metotlar sunar.

HTTP sunucusu oluşturmak

HTTP sunucusu oluşturmak için http.createServer metodu kullanılır.

Metot parametre olarak geri bildirim fonksiyonu (callback) alır.

Geri bildirim fonksiyonu istek (request) ve cevap (response) olmak üzere iki parametre alır.

İstek parametresi istek yapan kullanıcının nasıl istek yaptığı (POST, GET, PUT vb.), hangi sayfaya istek yaptığı (index.html, iletisim.html vb.) gibi bilgilerin bulunduğu bir nesnedir.

Cevap parametresi istek yapan kullanıcıya hangi cevabın verileceği ile ilgili metot ve değerlerin bulunduğu bir nesnedir.

HTTP sunucusu oluşturduktan sonra createServer metodu çeşitli işlemler için metot ve özellikleri içeren HTTP sunucu nesnesi döndürür.

HTTP sunucu nesnesi hangi porttan gelen cevapların dinleneceğini listen metodu HTTP sunucusu zaman aşımı süresini timeout özelliği, HTTP sunucu isteklerini kapatmak için close gibi çeşitli metot ve özelliklere sahip bir nesnedir.

'use strict';

const http = require('http');

const sunucu = http.createServer(function (request, response) {

});

sunucu.listen(1453);

console.log('Sunucu çalışıyor...');

Kodlar çalıştırıldığında aşağıdaki gibi bir sonuç verecektir.

node index.js
Sunucu çalışıyor...

Ancak gelen isteklere herhangi bir cevap verilmediğinden tarayıcıdan http://localhost:1453 adresine girdiğinizde sayfa açılmayacaktır.

Gelen isteklere cevap vermek için geri bildirim fonksiyonuna ait cevap parametresinin write metodunu kullanabiliriz.

Ancak sadece bu yeterli olmayacaktır.

Çünkü write metodu ile cevap verdikten sonra istemciye cevabın sonlandığını bildirmek için end metodunu kullanmamız gerekir.

'use strict';

const http = require('http');

const sunucu = http.createServer(function (request, response) {

  response.write('Merhaba Node.js');

  response.end();

});

sunucu.listen(1453);

console.log('Sunucu çalışıyor...');

Kodlar çalıştırıldığında aşağıdaki gibi bir sonuç verecektir.

node index.js
Sunucu çalışıyor...

Tarayıcıdan http://localhost:1453 adresine girdiğinizde sayfa açılacak ve Merhaba Node.js yazacaktır.

Üst bilgi eklemek

Web tarayıcıları sayfa ile ilgili çeşitli bilgileri üst bilgi denilen web sunucusunun gönderdiği bilgilerden alır.

Önceki örnekte Merhaba Node.js yazmıştık.

Ancak Merhaba Dünya veya Hoşgeldiniz gibi Türkçe karakterlerin bulunduğu bir yazı yazıldığında tarayıcıya üst bilgi olarak sayfanın karakter kodu gönderilmediğinden karakter hatası verecektir.

Bu ve bunun gibi hataların önüne geçebilmek için cevap parametresiyle sayfaya ait üst bilgi göndermek yararlı olacaktır.

'use strict';

const http = require('http');

const sunucu = http.createServer(function (request, response) {

  response.writeHead(200, {
    'Content-Type': 'text/html; charset=utf-8'
  });

  response.write('Merhaba dünyalı <b>Node.js </b> dünyasına hoşgeldiniz...');

  response.end();

});

sunucu.listen(1453);

console.log('Sunucu çalışıyor...');

Örnekte basit bir üst bilgi eklenmiştir.

Üst bilgi tarayıcıdan tarayıcıya değişmekte ve kullanım alanına göre farklılık göstermektedir.

NOT: Geliştirilen projeye göre farklı üst bilgi eklenmesi gerekebilir.

İstekleri yönetmek

Önceki örneklerde sade bir web sunucusu yaptık, yapmış olduğumuz web sunucusu gelen tüm isteklere (http://localhost:1453, http://localhost:1453/iletisim vb.) aynı cevabı verecektir.

Web sunucusuna gelen farklı isteklere göre farklı cevap vermek için istek parametresinin sahip olduğu url özelliğini kullanabiliriz.

'use strict';

const http = require('http');

const sunucu = http.createServer(function (request, response) {

  response.writeHead(200, {
    'Content-Type': 'text/html; charset=utf-8'
  });

  response.write(request.url);

  response.end();

});

sunucu.listen(1453);

console.log('Sunucu çalışıyor...');

Web sunucumuz artık gelen isteklere, istek yapılan sayfanın adresinin yazılığı olduğu bir sonuç verecektir.

İstek yapılan sayfaya özgü farklı bir sonuçta verebiliriz.

'use strict';

const http = require('http');

const sunucu = http.createServer(function (request, response) {

  response.writeHead(200, {
    'Content-Type': 'text/html; charset=utf-8'
  });

  if (request.url == '/' || request.url == '/anasayfa') {

    response.write('Burası anasayfa');

  } else if (request.url == '/iletisim') {

    response.write('Burası iletişim sayfası');

  } else {

    response.writeHead(404, {
      'Content-Type': 'text/html; charset=utf-8'
    });

    response.write('Böyle bir sayfa mevcut değil');

  }

  response.end();

});

sunucu.listen(1453);

console.log('Sunucu çalışıyor...');

Yapılan istek “/” ve “/anasayfa” ise Burası anasayfa, “/iletisim” ise Burası iletişim sayfası yazacaktır.

Yapılan isteklerin anlamlı şekilde parçalara bölünmesi ve daha kapsamlı isteklere cevap verebilmek için Node.js url Modülünü kullanabiliriz.

'use strict';

const http = require('http');
const url = require('url');

const sunucu = http.createServer(function (request, response) {

  response.writeHead(200, {
    'Content-Type': 'text/html; charset=utf-8'
  });

  let adres = url.parse(request.url, true);

  if (adres.pathname == '/profil' && adres.query.adi) {

    response.write('Hoşgeldiniz sayın ' + adres.query.adi);

  }

  response.end();

});

sunucu.listen(1453);

console.log('Sunucu çalışıyor...');

Yapılan istek /profil ve son ekinde ?adi bir değere sahipse bu değeri yazdıracaktır.

Örneğin; http://localhost:1453/profil?adi=Yusuf+SEZER gibi bir istek geldiğinde Hoşgeldiniz sayın Yusuf SEZER yazacaktır.

Harici dosya göndermek

Web sayfalarını sadece bir dosyada barındırmak hem karmaşık olacak hem de düzenlenmek istendiğinde çeşitli zorluklar çıkaracaktır.

Ayrıca her dosya değişikliğinde Node.js’i yeniden başlatmak gerekecektir.

Bu gibi sorunlar için harici olarak oluşturulan web sayfalarını cevap olarak gönderebiliriz.

Aşağıdaki gibi basit bir sayfamız olduğunu varsayalım.

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <title>Merhaba</title>
</head>

<body>
  <h1>Hoşgeldiniz</h1>
</body>

</html>

Kodlar çalıştırıldığında artık harici bir dosyayı cevap olarak gönderebiliriz.

'use strict';

const http = require('http');
const fs = require('fs');

const sunucu = http.createServer(function (request, response) {

  fs.readFile('index.html', function (err, data) {

    response.writeHead(200, {
      'Content-Type': 'text/html; charset=utf-8'
    });

    if (err) throw err;

    response.write(data.toString());

    response.end();

  });

});

sunucu.listen(1453);

console.log('Sunucu çalışıyor...');

Ayrıca harici dosya üzerinde yapılan değişiklikler Node.js’in yeniden başlatılmasına ihtiyaç olmadan değiştirilebilecektir.

Her bir sayfa için ayrı bir okuma yapmak yerine aşağıdaki gibi bir yapı oluşturabiliriz.

'use strict';

const http = require('http');
const fs = require('fs');
const url = require('url');

const sunucu = http.createServer(function (request, response) {

  let adres = url.parse(request.url);

  let dosya = adres.pathname.substr(1);

  fs.readFile(dosya, function (err, data) {

    response.writeHead(200, {
      'Content-Type': 'text/html; charset=utf-8'
    });

    if (err) {

      response.writeHead(404, {
        'Content-Type': 'text/html; charset=utf-8'
      });

      response.write('Böyle bir sayfa mevcut değil');

    } else {

      response.write(data.toString());

    }

    response.end();

  });

});

sunucu.listen(1453);

console.log('Sunucu çalışıyor...');

Kodlar çalıştırıldığında aynı klasörde bulunan dosyaları cevap olarak gönderecektir.

Node.js çekirdek modülü içerisinde yer alan HTTP modülü çeşitli metot, nesne ve özelliklere sahiptir.

Ancak salt HTTP modülünün kullanımı çokça kod yazılmasına neden olabilir.

Bunu yerine connect, express, koa gibi üçüncü parti modüllerin kullanımı daha avantajlı olacaktır.

İstek göndermek

Node.js HTTP modülü ile ayrıca HTTP isteği gönderebiliriz.

'use strict';

const http = require('http');
const fs = require('fs');

let ayar = {
  host: 'www.yusufsezer.com.tr'
}

const istek = http.request(ayar, function (response) {

  let dosya = fs.createWriteStream('yusufsezer.html');

  response.pipe(dosya);

});

istek.end();

Kodlar çalıştırıldığında www.yusufsezer.com.tr adresine bağlanacak ve sayfanın kodlarını aynı klasörde yusufsezer.html dosyasına kaydedecektir.

Node.js Derslerine buradan ulaşabilirsiniz…

Hayırlı günler dilerim.

Yusuf SEZER

Yusuf SEZER

Computer Engineer who interested about web technologies, algorithms, artificial intelligence and embedded systems; constantly exploring new technologies.


Bunlara'da bakmalısın!