REST API
REST Nedir?
REST (Representational State Transfer), client ile backend arasında iletişim kurmak için kullanılan mimari bir yaklaşımdır. HTTP protokolü üzerine kuruludur ve belirli prensiplere dayanır.
Amaç:
- Basit
- Ölçeklenebilir
- Standartlaştırılmış
- Kaynak (resource) odaklı API tasarlamaktır.
REST Prensipleri
1) Stateless (Durumsuzluk)
Sunucu, istemci hakkında herhangi bir durum bilgisi saklamaz. Her request, işlenmesi için gereken tüm bilgileri içinde barındırmalıdır.
Örneğin:
- Token
- User ID
- Authorization header
Bu yüzden JWT sık kullanılır.
Neden önemli?
- Sunucu hafızasını azaltır
- Yatay ölçeklemeyi kolaylaştırır
- Load balancer ile uyumludur
2) Cacheable
Yanıtlar cache edilebilir olmalıdır.
Örnek:
Cache-Control: public, max-age=60
Amaç:
- Aynı veri için tekrar DB’ye gitmemek
- Performans kazanmak
- Sunucu yükünü azaltmak
3) Client–Server Separation
Frontend ve backend birbirinden bağımsızdır. Sadece API üzerinden konuşurlar.
Bu sayede:
- Frontend değişebilir
- Backend değişebilir
- Birbirlerini kırmazlar
4) Uniform Interface
REST’te her şey bir resource’tur.
URL’ler fiil değil isim temsil eder.
Yanlış (RPC tarzı):
GET /getUsers
POST /createOrder
GET /deleteUser/5
Doğru (RESTful):
GET /users
POST /users
GET /users/5
DELETE /users/5
HTTP Method’ların Doğru Kullanımı
| Metot | İşlem | Idempotency |
|---|---|---|
| GET | Veri okuma | Idempotent |
| POST | Yeni veri oluşturma | Idempotent değil |
| PUT | Veriyi tamamen güncelleme | Idempotent |
| PATCH | Kısmi güncelleme | Genelde idempotent kabul edilir |
| DELETE | Silme | Idempotent |
HTTP Status Codes
| Kod | Anlam |
|---|---|
| 200 | OK |
| 201 | Created |
| 204 | No Content |
| 400 | Bad Request |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Not Found |
| 409 | Conflict |
| 422 | Validation Error |
| 500 | Server Error |
Response Standardizasyonu
API her zaman aynı formatta cevap dönmelidir:
{
"data": {},
"meta": {},
"error": null
}
Bu:
- Frontend entegrasyonunu kolaylaştırır
- Hata yönetimini standartlaştırır
Katmanlı Mimari
Client
↓
API
↓
Service
↓
DB
API Versioning
Yeni versiyon çıktığında eski client’ların bozulmaması için versiyonlama yapılır.
https://api.site.com/v1/users
Filtering
Filtering, performans açısından kritik bir konudur. Yanlış filtreleme milyonlarca satırı taratabilir.
Express örneği:
const where = {};
if (status) where.status = status;
if (userId) where.user_id = userId;
if (fromDate && toDate) {
where.created_at = { [Op.between]: [fromDate, toDate] };
}
SQL karşılığı:
WHERE status = ?
AND user_id = ?
AND created_at BETWEEN ? AND ?
Index Neden Önemli?
Eğer index yoksa:
- Full table scan yapılır
- CPU artar
- Timeout oluşur
Index eklemek:
CREATE INDEX idx_product_category ON products(category);
Bu sayede:
Full scan yerine logaritmik erişim sağlanır.
Composite Index
Birden fazla filtre varsa:
CREATE INDEX idx_category_brand ON products(category, brand);
Index sırası kritiktir.
Örnek:
CREATE INDEX idx_orders_user_status
ON orders(user_id, status);
EXPLAIN Kullanımı
Yavaş endpoint varsa:
- EXPLAIN çalıştır
- Full table scan var mı bak
- Filtre kolonlarına index ekle
- Pagination var mı kontrol et
Sorting (ORDER BY)
Sorting performans açısından en pahalı işlemlerden biridir.
Eğer index yoksa:
- Tüm veriler RAM’e alınır
- Bellekte sort edilir
- RAM yetmezse disk kullanılır (Filesort)
Index-based sorting:
CREATE INDEX idx_products_price ON products(price);
Composite:
CREATE INDEX idx_category_price ON products(category, price);
Sorgu:
SELECT *
FROM orders
WHERE status = 'PAID'
ORDER BY created_at DESC
LIMIT 20;
Index:
CREATE INDEX idx_orders_status_created_at
ON orders(status, created_at DESC);
Filtering + Sorting + Pagination
SELECT *
FROM orders
WHERE status = 'PAID'
AND created_at < ?
ORDER BY created_at DESC
LIMIT 20;
Önemli noktalar:
- Sorting DB’de yapılır
- ORDER BY index yoksa pahalıdır
- WHERE + ORDER BY → composite index
- OFFSET büyük dataset’lerde pahalıdır
- Cursor-based (keyset) pagination tercih edilmelidir
- Dynamic sorting whitelist gerektirir
- Function kullanılan ORDER BY index’i bozar