Back to Blog

Rest API Design Principles

February 18, 20264 min
REST APIDatabase IndexingAPI Performance
Rest API Design Principles

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İşlemIdempotency
GETVeri okumaIdempotent
POSTYeni veri oluşturmaIdempotent değil
PUTVeriyi tamamen güncellemeIdempotent
PATCHKısmi güncellemeGenelde idempotent kabul edilir
DELETESilmeIdempotent

HTTP Status Codes

KodAnlam
200OK
201Created
204No Content
400Bad Request
401Unauthorized
403Forbidden
404Not Found
409Conflict
422Validation Error
500Server 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:

  1. EXPLAIN çalıştır
  2. Full table scan var mı bak
  3. Filtre kolonlarına index ekle
  4. 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