Bvural41 1
Bvural41
emirhanHCL 1
emirhanHCL
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
Hikaye Ekle

[NODE JS] HTTP Metodlarini Anlamak (GET, POST, PUT, DELETE)

Türkiye'de ilk Mobil & PC Aynı Anda Metin2 Oyna. Triarchonline kalıcı ve uzun ömürlü yapısı ile 24 Temmuz'da açılıyor. | 1-99 Mobil Metin2 Triarch HEMEN TIKLA!

nodejs.png


[NODE JS] HTTP Metodlarini Anlamak (GET, POST, PUT, DELETE)​


Herkese merhaba, bugun HTTP metodlarini Node.js perspektifinden detayli inceleyecegiz. Web gelistirmede HTTP metodlari, client ile server arasindaki iletisimin temel taslarindan. Her metodun kendine ozgu bir amaci ve kullanim alani var. Ben junior'ken her seyi GET ile yapiyordum, sonra RESTful API tasarimini ogrenince metodlarin ne kadar onemli oldugunu anladim.

HTTP Metodlari ve Amaclari​


HTTP protokolu 9 metod tanimlar ama pratikte en cok kullanilan 4 tanesi vardir: GET (veri al), POST (yeni veri olustur), PUT (mevcut veriyi guncelle) ve DELETE (veriyi sil). Bunlara CRUD (Create, Read, Update, Delete) islemleri denir ve neredeyse tum web API'leri bu model uzerine kurulur.

Her metodun onemli ozellikleri vardir. GET idempotent ve guvenlidir, yani tekrar cagirmak sonucu degistirmez ve sunucuda degisiklik yapmaz. POST ne idempotent ne de guvenlidir. PUT idempotent ama guvenli degildir. DELETE idempotent ama guvenli degildir. Bu kavramlar API tasariminda cok onemli.

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

// Basit in-memory veritabani
let kullanicilar = [
    { id: 1, ad: 'Ahmet', email: 'ahmet@test.com' },
    { id: 2, ad: 'Ayse', email: 'ayse@test.com' },
    { id: 3, ad: 'Mehmet', email: 'mehmet@test.com' }
];
let sonrakiId = 4;

// Request body okuma yardimcisi
function bodyOku(req) {
    return new Promise((resolve, reject) => {
        let body = '';
        req.on('data', chunk => { body += chunk.toString(); });
        req.on('end', () => {
            try {
                resolve(body ? JSON.parse(body) : {});
            } catch (e) {
                reject(new Error('Gecersiz JSON'));
            }
        });
        req.on('error', reject);
    });
}

// JSON cevap yardimcisi
function jsonCevap(res, statusKod, veri) {
    res.writeHead(statusKod, {
        'Content-Type': 'application/json; charset=utf-8',
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
        'Access-Control-Allow-Headers': 'Content-Type'
    });
    res.end(JSON.stringify(veri, null, 2));
}

const sunucu = http.createServer(async (req, res) => {
    const parsedUrl = url.parse(req.url, true);
    const yol = parsedUrl.pathname;
    const metod = req.method;

    console.log(`${metod} ${yol}`);

    // CORS preflight
    if (metod === 'OPTIONS') {
        res.writeHead(204);
        res.end();
        return;
    }

    try {
        // GET /api/kullanicilar - Tum kullanicilari listele
        if (yol === '/api/kullanicilar' && metod === 'GET') {
            jsonCevap(res, 200, {
                basarili: true,
                sayi: kullanicilar.length,
                veri: kullanicilar
            });
        }

        // GET /api/kullanicilar/:id - Tek kullanici getir
        else if (yol.match(/^\/api\/kullanicilar\/\d+$/) && metod === 'GET') {
            const id = parseInt(yol.split('/').pop());
            const kullanici = kullanicilar.find(k => k.id === id);

            if (!kullanici) {
                jsonCevap(res, 404, { basarili: false, mesaj: 'Kullanici bulunamadi' });
                return;
            }

            jsonCevap(res, 200, { basarili: true, veri: kullanici });
        }

        // POST /api/kullanicilar - Yeni kullanici olustur
        else if (yol === '/api/kullanicilar' && metod === 'POST') {
            const body = await bodyOku(req);

            if (!body.ad || !body.email) {
                jsonCevap(res, 400, { basarili: false, mesaj: 'ad ve email zorunlu' });
                return;
            }

            const yeniKullanici = { id: sonrakiId++, ...body };
            kullanicilar.push(yeniKullanici);

            jsonCevap(res, 201, { basarili: true, veri: yeniKullanici });
        }

        // PUT /api/kullanicilar/:id - Kullanici guncelle
        else if (yol.match(/^\/api\/kullanicilar\/\d+$/) && metod === 'PUT') {
            const id = parseInt(yol.split('/').pop());
            const index = kullanicilar.findIndex(k => k.id === id);

            if (index === -1) {
                jsonCevap(res, 404, { basarili: false, mesaj: 'Kullanici bulunamadi' });
                return;
            }

            const body = await bodyOku(req);
            kullanicilar[index] = { ...kullanicilar[index], ...body, id };

            jsonCevap(res, 200, { basarili: true, veri: kullanicilar[index] });
        }

        // DELETE /api/kullanicilar/:id - Kullanici sil
        else if (yol.match(/^\/api\/kullanicilar\/\d+$/) && metod === 'DELETE') {
            const id = parseInt(yol.split('/').pop());
            const index = kullanicilar.findIndex(k => k.id === id);

            if (index === -1) {
                jsonCevap(res, 404, { basarili: false, mesaj: 'Kullanici bulunamadi' });
                return;
            }

            const silinen = kullanicilar.splice(index, 1)[0];
            jsonCevap(res, 200, { basarili: true, mesaj: 'Kullanici silindi', veri: silinen });
        }

        else {
            jsonCevap(res, 404, { basarili: false, mesaj: 'Endpoint bulunamadi' });
        }
    } catch (error) {
        jsonCevap(res, 500, { basarili: false, mesaj: error.message });
    }
});

sunucu.listen(3000, () => {
    console.log('API sunucusu http://localhost:3000 adresinde calisiyor');
    console.log('\nEndpoint\'ler:');
    console.log('  GET    /api/kullanicilar');
    console.log('  GET    /api/kullanicilar/:id');
    console.log('  POST   /api/kullanicilar');
    console.log('  PUT    /api/kullanicilar/:id');
    console.log('  DELETE /api/kullanicilar/:id');
});

PATCH vs PUT​


PUT ve PATCH arasindaki fark sik sorulan bir sorudur. PUT kaynagi tamamen degistirir, yani gondermediginiz alanlar silinir. PATCH ise kismeni guncelleme yapar, sadece gonderdiginiz alanlar degisir. Pratikte cogu API PUT'u PATCH gibi kullanir ama dogru yaklasim bunlari ayirmaktir. Ben kucuk projelerde sadece PUT kullaniyorum ama buyuk API'lerde ikisini de desteklemek daha dogru.

Son olarak, HTTP metodlarini dogru kullanmak sadece convention degildir, gercek teknik sonuclari vardir. GET istekleri tarayici tarafindan cache'lenir, POST istekleri cache'lenmez. Arama motorlari sadece GET isteklerini izler. Tarayici geri tusu GET isteklerini tekrar calistirir ama POST icin onay ister. Bu yuzden metodlari dogru kullanmak uygulamanizin dogru calismasi icin onemlidir. Sonraki konuda URL modulunu inceleyecegiz!
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst