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!
[NODE JS] REST API modern web geliştirme
REST API modern web geliştirmenin bel kemiğidir. Frontend uygulamalar, mobil uygulamalar, üçüncü parti entegrasyonlar ve mikroservisler arasındaki iletişim büyük ölçüde REST API'ler üzerinden gerçekleşir. İyi tasarlanmış bir REST API kullanımı kolay, tutarlı, ölçeklenebilir ve bakımı zahmetsiz olur.
REST Representational State Transfer'in kısaltmasıdır. Roy Fielding tarafından 2000 yılında doktora tezinde tanımlanmıştır. Birçok kısıtlama ve prensip içerir: client-server ayrımı, statelessness, cacheability, uniform interface ve layered system. Bu prensiplere uygun tasarlanan API'lere RESTful API denir.
URL tasarımında isim kullanın, fiil değil. /getUsers yerine /users, /createProduct yerine POST /products kullanın. HTTP metotları zaten eylemi ifade eder: GET okuma, POST oluşturma, PUT güncelleme, DELETE silme. Çoğul isimler kullanın: /user değil /users. Kaynak hiyerarşisini URL'de yansıtın: /users/5/orders gibi.
Ben kariyerimin başında her şeyi GET isteğiyle yapıyordum: /getUser?id=5, /deleteUser?id=5 gibi. Sonra REST prensiplerini öğrendiğimde API tasarımımın ne kadar kötü olduğunu fark ettim. RESTful tasarıma geçtiğimde hem kod daha temiz oldu hem de diğer geliştiriciler API'yi çok daha kolay anladı.
HTTP status code'larını doğru kullanmak REST API'nin önemli bir parçası. 200 OK genel başarı, 201 Created kaynak oluşturuldu, 204 No Content başarılı ama body yok (DELETE için), 400 Bad Request geçersiz istek, 401 Unauthorized kimlik doğrulanmadı, 403 Forbidden yetkisiz, 404 Not Found bulunamadı, 409 Conflict çakışma, 422 Unprocessable Entity validasyon hatası, 500 Internal Server Error sunucu hatası.
Versiyonlama API'nin uzun vadeli sürdürülebilirliği için önemli. URL'de (/api/v1/users), header'da (Accept: application/vnd.api.v1+json) veya query parametresinde (?version=1) yapılabilir. URL'de versiyonlama en yaygın ve en basit yöntem. Eski versiyonları hemen kaldırmayın, deprecation süreci uygulayın.
HATEOAS REST'in olgunluk seviyesinin en üst kademesi. Response'a ilgili kaynaklara linkler eklenir, istemci bu linkleri takip ederek API'yi keşfeder. Pratikte çoğu API HATEOAS uygulamaz ama en azından pagination'da sonraki/önceki sayfa linklerini eklemek iyi bir pratik.
Tutarlılık REST API tasarımının altın kuralıdır. Hata formatı, tarih formatı, sayfalama yapısı, isimlendirme convention'ı tüm endpoint'lerde aynı olmalı. Bir endpoint camelCase, diğeri snake_case kullanıyorsa bu kötü bir API tasarımıdır.
JavaScript:
const express = require('express');
const app = express();
const crypto = require('crypto');
app.use(express.json());
// Ornek veritabani
let kullanicilar = [
{{ id: 'usr_1', ad: 'Ahmet Yilmaz', email: 'ahmet@test.com', rol: 'admin', olusturma: '2024-01-15T10:00:00Z' }},
{{ id: 'usr_2', ad: 'Zeynep Kaya', email: 'zeynep@test.com', rol: 'user', olusturma: '2024-02-20T14:30:00Z' }},
{{ id: 'usr_3', ad: 'Mehmet Demir', email: 'mehmet@test.com', rol: 'editor', olusturma: '2024-03-10T09:15:00Z' }},
];
// ID olusturucu
function yeniId(prefix) {{
return `${{prefix}}_${{crypto.randomBytes(8).toString('hex')}}`;
}}
// Basarili response helper
function basariliResponse(res, data, statusCode = 200) {{
return res.status(statusCode).json({{
basarili: true,
veri: data,
zaman: new Date().toISOString(),
}});
}}
// Hata response helper
function hataResponse(res, mesaj, statusCode = 400, detaylar = null) {{
const response = {{
basarili: false,
hata: {{
mesaj,
kod: statusCode,
}},
zaman: new Date().toISOString(),
}};
if (detaylar) response.hata.detaylar = detaylar;
return res.status(statusCode).json(response);
}}
// ===== REST API ENDPOINT'LERI =====
// GET /api/v1/users - Tum kullanicilari listele
app.get('/api/v1/users', (req, res) => {{
const {{ sayfa = 1, limit = 10, rol, siralama = 'olusturma', sira = 'desc' }} = req.query;
let sonuc = [...kullanicilar];
// Filtreleme
if (rol) sonuc = sonuc.filter(k => k.rol === rol);
// Siralama
sonuc.sort((a, b) => {{
const cmp = a[siralama] > b[siralama] ? 1 : -1;
return sira === 'desc' ? -cmp : cmp;
}});
// Sayfalama
const toplam = sonuc.length;
const s = parseInt(sayfa);
const l = parseInt(limit);
const toplamSayfa = Math.ceil(toplam / l);
sonuc = sonuc.slice((s - 1) * l, s * l);
basariliResponse(res, {{
kullanicilar: sonuc,
sayfalama: {{
toplam,
sayfa: s,
limit: l,
toplamSayfa,
links: {{
ilk: `/api/v1/users?sayfa=1&limit=${{l}}`,
son: `/api/v1/users?sayfa=${{toplamSayfa}}&limit=${{l}}`,
onceki: s > 1 ? `/api/v1/users?sayfa=${{s-1}}&limit=${{l}}` : null,
sonraki: s < toplamSayfa ? `/api/v1/users?sayfa=${{s+1}}&limit=${{l}}` : null,
}},
}},
}});
}});
// GET /api/v1/users/:id - Tek kullanici getir
app.get('/api/v1/users/:id', (req, res) => {{
const kullanici = kullanicilar.find(k => k.id === req.params.id);
if (!kullanici) return hataResponse(res, 'Kullanici bulunamadi', 404);
basariliResponse(res, {{ kullanici }});
}});
// POST /api/v1/users - Yeni kullanici olustur
app.post('/api/v1/users', (req, res) => {{
const {{ ad, email, rol }} = req.body;
const hatalar = [];
if (!ad || ad.length < 2) hatalar.push('Ad en az 2 karakter olmali');
if (!email || !email.includes('@')) hatalar.push('Gecerli email gerekli');
if (kullanicilar.some(k => k.email === email)) hatalar.push('Email zaten kayitli');
if (hatalar.length > 0) return hataResponse(res, 'Validasyon hatasi', 422, hatalar);
const yeni = {{
id: yeniId('usr'),
ad, email,
rol: rol || 'user',
olusturma: new Date().toISOString(),
}};
kullanicilar.push(yeni);
basariliResponse(res, {{ kullanici: yeni }}, 201);
}});
// PUT /api/v1/users/:id - Kullaniciyi guncelle (tam)
app.put('/api/v1/users/:id', (req, res) => {{
const index = kullanicilar.findIndex(k => k.id === req.params.id);
if (index === -1) return hataResponse(res, 'Kullanici bulunamadi', 404);
const {{ ad, email, rol }} = req.body;
if (!ad || !email) return hataResponse(res, 'Ad ve email zorunlu', 422);
kullanicilar[index] = {{ ...kullanicilar[index], ad, email, rol: rol || 'user', guncelleme: new Date().toISOString() }};
basariliResponse(res, {{ kullanici: kullanicilar[index] }});
}});
// PATCH /api/v1/users/:id - Kismi guncelleme
app.patch('/api/v1/users/:id', (req, res) => {{
const index = kullanicilar.findIndex(k => k.id === req.params.id);
if (index === -1) return hataResponse(res, 'Kullanici bulunamadi', 404);
kullanicilar[index] = {{ ...kullanicilar[index], ...req.body, guncelleme: new Date().toISOString() }};
basariliResponse(res, {{ kullanici: kullanicilar[index] }});
}});
// DELETE /api/v1/users/:id - Kullanici sil
app.delete('/api/v1/users/:id', (req, res) => {{
const index = kullanicilar.findIndex(k => k.id === req.params.id);
if (index === -1) return hataResponse(res, 'Kullanici bulunamadi', 404);
kullanicilar.splice(index, 1);
res.status(204).end();
}});
// API dokumantasyon endpointi
app.get('/api/v1', (req, res) => {{
basariliResponse(res, {{
api: 'REST API v1',
endpoints: [
{{ metod: 'GET', yol: '/api/v1/users', aciklama: 'Kullanicilari listele' }},
{{ metod: 'GET', yol: '/api/v1/users/:id', aciklama: 'Kullanici detayi' }},
{{ metod: 'POST', yol: '/api/v1/users', aciklama: 'Yeni kullanici olustur' }},
{{ metod: 'PUT', yol: '/api/v1/users/:id', aciklama: 'Kullaniciyi guncelle' }},
{{ metod: 'PATCH', yol: '/api/v1/users/:id', aciklama: 'Kismi guncelleme' }},
{{ metod: 'DELETE', yol: '/api/v1/users/:id', aciklama: 'Kullanici sil' }},
],
}});
}});
app.listen(3000, () => console.log('REST API sunucusu port 3000'));
REST API tasarımı bir sanattır. İyi bir API kullanıcısını düşünerek tasarlanır, tutarlıdır ve belgelenmiştir. Bu prensipleri uygulayarak diğer geliştiricilerin sevgiyle kullanacağı API'ler oluşturabilirsiniz.
Son düzenleme:
Emeğiniz ve katkınız için teşekkür ederiz!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar!

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 1
- Görüntüleme
- 14
- Cevaplar
- 1
- Görüntüleme
- 7
- Cevaplar
- 1
- Görüntüleme
- 11
- Cevaplar
- 1
- Görüntüleme
- 10
- Cevaplar
- 1
- Görüntüleme
- 8
