Node.js Express ile HTTP Request (İstek) ve Response (Cevap) Mantığı
- 12
- (1)
- (5)
- 29 Ağu 2024
NodeJS Projesi Oluşturma
Visual Studio 2022 üzerinde NodeJS projeleri oluşturabileceğiniz çok sayıda şablon mevcuttur. NodeJS console projeleri, web projeleri oluşturabilirsiniz. Bu yazı içerisinde web projesi oluşturulup, express eklentisi kurularak, değişik web metotların nasıl uygulanabildiği incelenecektir.
Proje adını girip projeyi oluşturduktan sonra tamamen boş bir web projesi karşınıza gelecektir. Express kurmak için Visual Studio 2022 üzerinde Tools menüsü Command Line içinde bulunan, Developer Powershell tuşuna tıklayın.
Açılan Developer Powershell ekranında karşınıza projenin bulunduğu dizinde yer alan bir komut satırı penceresi gelecektir.
Buradaki komut satırına Express
kütüphanesini kurmak için npm install express
yazıp Enter
tuşuna basın. Express kütüphanesi ile beraber gerekli olan bütün eklentiler projeye eklenecektir.
Bunun yerine Windows üzerinde açabileceğiniz cmd komut ekranında projenin bulunduğu dizine cd
komutu ile gidip, aynı npm install express
komutunu yazabilirsiniz. Tamamen aynı işlem gerçekleşecektir.
Ya da Visual Studio 2022 ekranındaki Solution Explorer alt penceresinde npm öğesine sağ tıklayıp, Install New npm Packages penceresini açın. Search for packages yazan arama kutusuna express yazarak, TJ Holowaychuk isimli yayıncıya ait olan paketi projeye doğrudan kurabilirsiniz.
Tabii ki bütün bunları yapmak için de, sisteminizde NodeJS'in kurulu olması gereklidir. (NodeJS web sitesi)
Express ile Web Request Oluşturma
Visual Studio 2022 ile oluşturulan boş bir NodeJS web projesinde karşınıza gelecek ilk kod server.js içerisinde şu olacaktır.
'use strict';
var http = require('http');
var port = process.env.PORT || 1337;
http.createServer(function (req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World\n');
}).listen(port);
Express olmadan otomatik oluşturulmuş bu kodu aşağıdaki şekilde Express kütüphanesinin kullanıldığı hale dönüştürebilirsiniz.
'use strict';
const express = require('express');
const app = express();
var port = process.env.PORT || 1337;
app.listen(port, function () {
console.log('NodeJS ile Express uygulaması çalışıyor...');
});
Javascript dilinde function
tanımlarken aşağıdaki syntax yapısını da kullanabilirsiniz.
'use strict';
const express = require('express');
const app = express();
var port = process.env.PORT || 1337;
app.listen(port, () => {
console.log('NodeJS ile Express uygulaması çalışıyor...');
});
Mevcut uygulama içerisinde herhangi bir şekilde Request
yani istek gönderilebilecek bir link mevcut değildir. İstek gönderilebilecek bir link oluşturmak için aşağıdaki kodu inceleyip uygulayabilirsiniz.
'use strict';
const express = require('express');
const app = express();
var port = process.env.PORT || 1337;
app.get('/ana-ekran', (req, res) => {
res.send('Ana ekran linki çağırıldı');
});
app.listen(port, () => {
console.log('NodeJS ile Express uygulaması çalışıyor...');
});
Visual Studio 2022 üzerinden çalıştırma butonu ile veya komut satırından server.js dosyasını node [dosya yolu]/server.js
komutu ile çalıştırdığınızda uygulama başlayacaktır. Uygulama 1337 nolu portu kullanacağı için http://localhost:1337/ana-ekran linkine tarayıcınız üzerinden girebilirsiniz.
Eğer Türkçe karakterler karşınıza bozuk bir şekilde gelirse, server.js
dosyasını File menüsünden aynı konumuna farklı kaydederek, Encoding ayarını Unicode (UTF-8 with signature) olarak belirleyebilirsiniz.
Türkçe karakterler düzgün bir şekilde gelecektir.
/ana-ekran
yolu dışında /
link için aşağıdaki kodu uygulayın
'use strict';
const express = require('express');
const app = express();
var port = process.env.PORT || 1337;
app.get('/', (req, res) => {
// İçerik türünü html olarak belirlemek için
res.setHeader('Content-Type', 'text/html');
res.send(`
<html>
<head>
<title>Ana Sayfa</title>
</head>
<body>
<h1>Ana Sayfa</h1>
<div>
<p>NodeJS ile html sayfası görüntülerken:</p>
<ul>
<li>Html içeriğini res.send ile yollayabilirsiniz</li>
<li>html dosyasını açıp response olarak yollayabilirsiniz</li>
<li>pug yapısını kullanabilirsiniz</li>
<ul>
</div>
</body>
</html>
`);
});
app.get('/ana-ekran', (req, res) => {
res.send('Ana ekran linki çağırıldı');
});
app.listen(port, () => {
console.log('NodeJS ile Express uygulaması çalışıyor...');
});
Uygulamayı çalıştırıp http://localhost:1337/ linkine giriş yaptığınızda karşınıza gelecek olan görüntü
Request (İstek) Yolu İçerisinde Parametre Kullanımı
Uygulama içerisinde http://localhost:1337/kitap/anna-karenina, http://localhost:1337/kitap/savas-ve-baris, http://localhost:1337/kitap/suc-ve-ceza gibi parametre içeren istek yollarını kullanabilmek mümkündür.
'use strict';
const express = require('express');
const app = express();
var port = process.env.PORT || 1337;
app.get('/kitap/:name', (req, res) => {
let bookLink = req.params.name;
let bookName = 'Kitap Bulunamadı';
let authorName = 'Yazar Bulunamadı';
let year = 0;
switch (bookLink) {
case 'anna-karenina':
bookName = 'Anna Karenina';
authorName = 'Lev Nikolayeviç Tolstoy';
year = 1877;
break;
case 'savas-ve-baris':
bookName = 'Savaş ve Barış';
authorName = 'Lev Nikolayeviç Tolstoy';
year = 1869;
break;
case 'karamazov-kardesler':
bookName = 'Karamazov Kardeşler';
authorName = 'Fyodor Mihayloviç Dostoyevski';
year = 1881;
break;
case 'suc-ve-ceza':
bookName = 'Suç ve Ceza';
authorName = 'Fyodor Mihayloviç Dostoyevski';
year = 1866;
break;
case 'sefiller':
bookName = 'Sefiller';
authorName = 'Victor Marie Hugo';
year = 1862;
break;
}
res.setHeader('Content-Type', 'text/html');
res.send(`
<html>
<head>
<title>Kitap - ${bookName}</title>
</head>
<body>
<h1>${bookName}</h1>
<div>
<p>Yazar: ${authorName}</p>
<p>Yıl: ${year}</p>
</div>
</body>
</html>
`);
});
app.listen(port, () => {
console.log('NodeJS ile Express uygulaması çalışıyor...');
});
Girilen her uygun link için switch
koşullamasında var olan değerler ile bir sayfa oluşturulur.
Linkten alınacak değerler, bir veritabanı ya da bir json dosyasındaki verilerle sorgulanarak da response
verisi elde edilebilir.
'use strict';
const express = require('express');
const app = express();
var port = process.env.PORT || 1337;
var jsonBooks = [
{
'bookLink': 'anna-karenina',
'bookName': 'Anna Karenina',
'authorName': 'Lev Nikolayeviç Tolstoy',
'year': 1877
},
{
'bookLink': 'savas-ve-baris',
'bookName': 'Savaş ve Barış',
'authorName': 'Lev Nikolayeviç Tolstoy',
'year': 1869
},
{
'bookLink': 'karamazov-kardesler',
'bookName': 'Karamazov Kardeşler',
'authorName': 'Fyodor Mihayloviç Dostoyevski',
'year': 1881
},
{
'bookLink': 'suc-ve-ceza',
'bookName': 'Suç ve Ceza',
'authorName': 'Fyodor Mihayloviç Dostoyevski',
'year': 1866
},
{
'bookLink': 'sefiller',
'bookName': 'Sefiller',
'authorName': 'Victor Marie Hugo',
'year': 1862
},
{
'bookLink': 'deniz-iscileri',
'bookName': 'Deniz İşçileri',
'authorName': 'Victor Marie Hugo',
'year': 1866
}
];
app.get('/kitap/:name', (req, res) => {
let bookLink = req.params.name;
let bookName = 'Kitap Bulunamadı';
let authorName = 'Yazar Bulunamadı';
let year = 0;
// istek parametresinin eşitlendiği bookLink ile aynı olan json dizisindeki eleman filtrelenir
let filtered = jsonBooks.filter((book) => book.bookLink === bookLink);
// eğer filtreleme sonucu oluşan dizinin uzunluğu sıfırdan büyükse link dizide mevcuttur
if (filtered.length > 0) {
bookName = filtered[0].bookName;
authorName = filtered[0].authorName;
year = filtered[0].year;
}
res.setHeader('Content-Type', 'text/html');
res.send(`
<html>
<head>
<title>Kitap - ${bookName}</title>
</head>
<body>
<h1>${bookName}</h1>
<div>
<p>Yazar: ${authorName}</p>
<p>Yıl: ${year}</p>
</div>
</body>
</html>
`);
});
app.listen(port, () => {
console.log('NodeJS ile Express uygulaması çalışıyor...');
});
Response içerik türünün html sayfası değil de, json türünde dönmesini istiyorsanız, Content-Type
isimli header değerini application/json
yapmalısınız.
'use strict';
const express = require('express');
const app = express();
var port = process.env.PORT || 1337;
var jsonBooks = [
{
'bookLink': 'anna-karenina',
'bookName': 'Anna Karenina',
'authorName': 'Lev Nikolayeviç Tolstoy',
'year': 1877
},
{
'bookLink': 'savas-ve-baris',
'bookName': 'Savaş ve Barış',
'authorName': 'Lev Nikolayeviç Tolstoy',
'year': 1869
},
{
'bookLink': 'karamazov-kardesler',
'bookName': 'Karamazov Kardeşler',
'authorName': 'Fyodor Mihayloviç Dostoyevski',
'year': 1881
},
{
'bookLink': 'suc-ve-ceza',
'bookName': 'Suç ve Ceza',
'authorName': 'Fyodor Mihayloviç Dostoyevski',
'year': 1866
},
{
'bookLink': 'sefiller',
'bookName': 'Sefiller',
'authorName': 'Victor Marie Hugo',
'year': 1862
},
{
'bookLink': 'deniz-iscileri',
'bookName': 'Deniz İşçileri',
'authorName': 'Victor Marie Hugo',
'year': 1866
}
];
app.get('/kitap/:name', (req, res) => {
let bookLink = req.params.name;
let bookName = 'Kitap Bulunamadı';
let authorName = 'Yazar Bulunamadı';
let year = 0;
// istek parametresinin eşitlendiği bookLink ile aynı olan json dizisindeki eleman filtrelenir
let filtered = jsonBooks.filter((book) => book.bookLink === bookLink);
// eğer filtreleme sonucu oluşan dizinin uzunluğu sıfırdan büyükse link dizide mevcuttur
if (filtered.length > 0) {
bookName = filtered[0].bookName;
authorName = filtered[0].authorName;
year = filtered[0].year;
}
res.setHeader('Content-Type', 'application/json');
res.send({
kitapAdi: bookName,
yazarAdi: authorName,
yil: year
});
});
app.listen(port, () => {
console.log('NodeJS ile Express uygulaması çalışıyor...');
});
NodeJS ile Restful API yapmak için json içerik türünde response oluşturabilir, request (istek) içeriğini de json olarak alabilirsiniz.
Request (İstek) Yolu İçerisinde Sorgu Kullanımı
İstek linklerinde sorgu ve parametre arasındaki fark, parametre değerlerinin her zaman olmak zorunda olması, ancak sorgu değerlerinin opsiyonel olmasıdır.
Mesela example.com/url/:param1/:param2 linkinde param1 ve param2 olmak zorundadır.
Ancak example.com/url?param1=val1¶m2=val2 linkindeki param1 ve param2 opsiyoneldir. Biri ya da ikisi birden de olmayabilir. Her halükarda example.com/url için bir request çalışacaktır.
Yukarıdaki jsonBooks
dizisi içerisinde yazar adına ve kitap adına göre filtreleme yapan bir request oluşturulabilir. Bu sefer bookLink
değerleri dizi içerisindeki elemanlarada olmayacaktır.
'use strict';
const express = require('express');
const app = express();
var port = process.env.PORT || 1337;
var jsonBooks = [
{
'bookName': 'Anna Karenina',
'authorName': 'Lev Nikolayeviç Tolstoy',
'year': 1877
},
{
'bookName': 'Savaş ve Barış',
'authorName': 'Lev Nikolayeviç Tolstoy',
'year': 1869
},
{
'bookName': 'Karamazov Kardeşler',
'authorName': 'Fyodor Mihayloviç Dostoyevski',
'year': 1881
},
{
'bookName': 'Suç ve Ceza',
'authorName': 'Fyodor Mihayloviç Dostoyevski',
'year': 1866
},
{
'bookName': 'Sefiller',
'authorName': 'Victor Marie Hugo',
'year': 1862
},
{
'bookName': 'Deniz İşçileri',
'authorName': 'Victor Marie Hugo',
'year': 1866
}
];
app.get('/kitaplar', (req, res) => {
let queryBook = req.query.kitap;
let queryAuthor = req.query.yazar;
// Kitap adı veya yazar adı eşleşen öğeler filtrelenecektir
let filtered = jsonBooks.filter((book) => book.bookName === queryBook || book.authorName === queryAuthor);
res.setHeader('Content-Type', 'application/json');
// Doğrudan filtrelenen değerleri dizi halinde json olarak döndürecektir
res.send(filtered);
});
app.listen(port, () => {
console.log('NodeJS ile Express uygulaması çalışıyor...');
});
Sonuç aşağıdaki gibi bir json dizisi olacaktır.