emirhanHCL 1
emirhanHCL
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
farkmt2official 1
farkmt2official
mannaxxx 1
mannaxxx
Bvural41 1
Bvural41
Agora Metin2 1
Agora Metin2
Hikaye Ekle

[NODE JS] HTTP Status Kodlarini Dogru Kullanmak

nodejs.png


[NODE JS] HTTP Status Kodlarini Dogru Kullanmak​


Merhaba arkadaslar, bugun HTTP status kodlarini dogru kullanmayi ogrenecegiz. Status kodlari, sunucunun client'a "istegini aldim, sonuc su" demesinin standart yoludur. Ben kariyerimde her seyi 200 donduren API'ler gordum ve bunun ne kadar kotu bir pratik oldugunu aci tecrubemle ogrendim. Dogru status kodu kullanmak sadece bir convention degildir, uygulamanizin dogru calismasi icin gereklidir.

Status Kod Kategorileri​


HTTP status kodlari 5 kategoride gruplanir. 1xx bilgilendirme, 2xx basari, 3xx yonlendirme, 4xx istemci hatasi ve 5xx sunucu hatasi. Her kategorinin kendine ozgu bir anlami var ve dogru kategoriyi kullanmak API'nizin anlasilabilirligini buyuk olcude arttirir.

Ben ozellikle su kodlari en cok kullaniyorum: 200 (OK), 201 (Created), 204 (No Content), 400 (Bad Request), 401 (Unauthorized), 403 (Forbidden), 404 (Not Found), 409 (Conflict), 422 (Unprocessable Entity) ve 500 (Internal Server Error). Bunlari iyi ogrenirseniz cogu API senaryosunu karsilersiniz.

JavaScript:
const http = require('http');
const { URL } = require('url');

// Status kodlari referansi
const STATUS_KODLARI = {
    // 2xx Basari
    200: 'OK - Istek basarili',
    201: 'Created - Kaynak olusturuldu',
    204: 'No Content - Basarili ama icerik yok',

    // 3xx Yonlendirme
    301: 'Moved Permanently - Kalici yonlendirme',
    302: 'Found - Gecici yonlendirme',
    304: 'Not Modified - Degismedi (cache kullan)',

    // 4xx Istemci Hatasi
    400: 'Bad Request - Hatali istek',
    401: 'Unauthorized - Kimlik dogrulama gerekli',
    403: 'Forbidden - Erisim yetkisi yok',
    404: 'Not Found - Kaynak bulunamadi',
    405: 'Method Not Allowed - Metod desteklenmiyor',
    409: 'Conflict - Cakisma (ornegin: ayni email ile kayit)',
    422: 'Unprocessable Entity - Veri gecersiz',
    429: 'Too Many Requests - Cok fazla istek (rate limit)',

    // 5xx Sunucu Hatasi
    500: 'Internal Server Error - Sunucu hatasi',
    502: 'Bad Gateway - Arka uc sunucu hatasi',
    503: 'Service Unavailable - Hizmet kullanilamaz'
};

// Kullanici verileri
let kullanicilar = [
    { id: 1, email: 'ahmet@test.com', ad: 'Ahmet' }
];

async function bodyOku(req) {
    const chunks = [];
    for await (const chunk of req) chunks.push(chunk);
    const raw = Buffer.concat(chunks).toString();
    return raw ? JSON.parse(raw) : {};
}

function json(res, kod, veri) {
    res.writeHead(kod, { 'Content-Type': 'application/json; charset=utf-8' });
    res.end(JSON.stringify(veri, null, 2));
}

const sunucu = http.createServer(async (req, res) => {
    const url = new URL(req.url, `http://${req.headers.host}`);
    const yol = url.pathname;
    const metod = req.method;

    try {
        // 200 OK - Basarili veri getirme
        if (yol === '/api/kullanicilar' && metod === 'GET') {
            json(res, 200, { veri: kullanicilar });
        }

        // 201 Created - Yeni kaynak olusturma
        else if (yol === '/api/kullanicilar' && metod === 'POST') {
            const body = await bodyOku(req);

            if (!body.email || !body.ad) {
                json(res, 400, { hata: 'email ve ad zorunlu' });
                return;
            }

            // 409 Conflict - Ayni email ile kayit
            if (kullanicilar.find(k => k.email === body.email)) {
                json(res, 409, { hata: 'Bu email zaten kayitli' });
                return;
            }

            const yeni = { id: kullanicilar.length + 1, ...body };
            kullanicilar.push(yeni);
            json(res, 201, { veri: yeni }); // 201!
        }

        // 204 No Content - Basarili silme
        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) {
                json(res, 404, { hata: 'Kullanici bulunamadi' });
                return;
            }

            kullanicilar.splice(index, 1);
            res.writeHead(204);
            res.end(); // Body yok!
        }

        // 301 Redirect
        else if (yol === '/eski-sayfa') {
            res.writeHead(301, { 'Location': '/yeni-sayfa' });
            res.end();
        }

        // 405 Method Not Allowed
        else if (yol === '/api/kullanicilar' && !['GET', 'POST'].includes(metod)) {
            res.writeHead(405, {
                'Allow': 'GET, POST',
                'Content-Type': 'application/json'
            });
            res.end(JSON.stringify({ hata: 'Bu endpoint sadece GET ve POST destekler' }));
        }

        // 404 Not Found
        else {
            json(res, 404, { hata: 'Endpoint bulunamadi' });
        }

    } catch (error) {
        // 500 Internal Server Error
        console.error('Sunucu hatasi:', error);
        json(res, 500, { hata: 'Dahili sunucu hatasi' });
    }
});

sunucu.listen(3000, () => {
    console.log('Sunucu calisiyor: http://localhost:3000');
});

En Cok Yapilan Hatalar​


Birincisi: her seyi 200 dondurmek. Bazi gelisitiriciler hata durumlarinda bile 200 dondurur ve hatay body icine yazar. Bu cok yanlis cunku HTTP client'lari ve araclari status kodlarina gore davranir. Ikincisi: 401 ve 403 karistirmak. 401 "sen kimsin bilmiyorum, giris yap" demek, 403 ise "seni taniyorum ama buna erisim yetkin yok" demek. Bu ikisini dogru kullanmak guvenlik acisindan onemli.

Tecrubeme gore API gelistirirken tutarli olmak cok onemli. Her basarili islem icin ayni format, her hata icin ayni format kullanin. Boylece client tarafinda tek bir error handler yazilir ve her endpoint icin ozel hata yonetimi yapilmak zorunda kalinmaz. Neyse, sonraki konumuz HTTP headers!
 

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

Geri
Üst