Skip to content

REST API Tasarımı ​

REST API tasarımı, kaynakları ve bu kaynaklar üzerindeki HTTP davranışını istemci açısından öngörülebilir bir sözleşmeye dönüştürür. URL'yi yalnızca controller yolu olarak değil; kaynak kimliği, durum kodu, hata modeli, cache ve evrim politikasıyla birlikte tasarlamak gerekir.

Hızlı Karar ​

İhtiyaçBaşlangıç kararıDikkat
Kaynak koleksiyonuÇoğul isimli URI (/users)Fiil içeren URI'lerden kaçın
Tek kaynak işlemiHTTP metodu + kaynak kimliğiIdempotency davranışını yaz
Büyük listeCursor veya keyset paginationSıralama anahtarı sabit olmalı
Karmaşık aramaQuery parametreleri veya ayrı search endpoint'iSerbest SQL ifadesi kabul etme
Kısmi güncellemePATCH ve açık merge semantiğiNull ile alan silme ayrımı net olmalı

Üretim Kontrol Listesi ​

  • Problem: Kaynaklar, alt kaynaklar ve aggregate sınırları açık mı?
  • Çözüm: Metot, durum kodu, hata gövdesi, pagination ve filtre sözleşmesi tanımlı mı?
  • Trade-off: REST sadelik ve HTTP tooling sağlar; çok karmaşık ekranlarda BFF veya GraphQL gerekebilir.
  • Hata durumu: Validation, authorization, conflict, timeout ve rate-limit cevapları birbirinden ayrılmalı.
  • Ölçüm: p95 latency, payload boyutu, sayfa derinliği, 4xx/5xx ve cache hit oranı izlenmeli.
  • Güvenlik/maliyet: Filtre alanları allowlist ile sınırlandırılmalı; büyük response ve pahalı sorgular quota ile korunmalı.

Kaynak Modelleme ​

  • Koleksiyon için /orders, tek kaynak için /orders/{orderId} kullan.
  • İlişki gerçekten kaynak yaşam döngüsünün parçasıysa /orders/{id}/items; bağımsız sorgulanıyorsa /items?orderId={id} tercih et.
  • URI'ye create, get, delete gibi fiiller koyma; iş komutu kaynak modeliyle ifade edilemiyorsa açık bir action endpoint'i kullan.
  • Kimlik formatı ve zaman alanlarının temsilini standartlaştır; response'ta kaynak metadata'sını ve versiyon bilgisini gerektiğinde taşı.

HTTP Metotları ve Durum Kodları ​

İşlemMetotBaşarılı cevapÖnemli hata
ListelemeGET /orders200 OK400, 401, 403
Tek kaynakGET /orders/{id}200 OK404 Not Found
OluşturmaPOST /orders201 Created + Location409, 422
Tam güncellemePUT /orders/{id}200 veya 204404, 409
Kısmi güncellemePATCH /orders/{id}200 veya 204400, 409
SilmeDELETE /orders/{id}204 No Content404, 409

202 Accepted, işin kuyruğa alındığını; 429 Too Many Requests, istemcinin daha sonra denemesi gerektiğini; 503 Service Unavailable, geçici kapasite veya dependency problemini anlatır. Hata gövdesi için status, stable error code, message, field errors, request/correlation ID ve gerekiyorsa retry bilgisi taşıyan tek bir format kullan.

Pagination, Filtering ve Sorting ​

Pagination seçenekleri ​

ModelUygun olduğu durumBedel
Offset (page, size)Küçük ve nispeten sabit listelerDerin sayfalarda yavaşlar, ekleme/silmede kayma olur
CursorSürekli değişen feed ve infinite scrollCursor opak ve süreli yönetilmelidir
KeysetBüyük tablolar ve indeksli sıralamaKullanıcı her alan üzerinden sayfalayamaz

Her liste cevabında stabil sort, limit, nextCursor veya hasMore semantiği tanımla. limit için üst sınır koy; default sıralamayı ve tie-breaker alanını (createdAt, id) açıkça yaz.

Filtreleme ve sıralama ​

status=active, createdAfter=... ve sort=-createdAt,name gibi allowlist edilmiş query parametreleri kullan. Alan adı ve yön serbest bırakılmamalı; filtre kombinasyonlarının sorgu planı, index ihtiyacı ve timeout bütçesi ölçülmelidir. Arama dili gerekiyorsa API'ye SQL veya ORM ifadesi geçmek yerine sınırlı bir arama sözleşmesi oluştur.

Bulk İşlemler ve HATEOAS ​

Bulk endpoint'lerinde her öğenin sonucu, hata kodu ve idempotency davranışı belirlenmelidir. Tek transaction ancak aynı consistency sınırında güvenliyse kullanılmalı; uzun bulk işleri 202 ve job status kaynağı döndürmelidir.

HATEOAS, response'a sadece URL eklemek değil, istemcinin geçerli sonraki aksiyonları keşfedebilmesidir:

json
{
  "id": "ord_123",
  "status": "pending",
  "_links": {
    "self": { "href": "/api/orders/ord_123" },
    "cancel": { "href": "/api/orders/ord_123/cancellation", "method": "POST" }
  }
}

Link relation adları, yetki ve mevcut durumla tutarlı olmalı; hiçbir link güvenlik kontrolünün yerine geçmemelidir.

OpenAPI ve API Performansı ​

OpenAPI sözleşmesi path, parameter, request/response schema, status code, security scheme ve örnekleri tanımlar. SpringDoc ile üretilen doküman, elle yazılan açıklamalar ve generated client aynı sözleşmeden beslenmelidir. OpenAPI ayrıntıları ve contract workflow için API Contract ve Tooling sayfasına bakılabilir.

Payload alanlarını gereksiz büyütme; field selection, compression, ETag/conditional request ve response cache'i ihtiyaca göre kullan. N+1 sorgu, pahalı sort ve sınırsız nested expansion API'nin HTTP seviyesinde görünmeyen darboğazlarıdır.

Uygulama Sonucu ​

İyi bir REST tasarımı; kaynak isimlerinden çok, başarılı ve hatalı akışların aynı istemci tarafından tekrar edilebilir olmasını sağlar. Her endpoint için örnek istek/yanıt, hata sözleşmesi, auth kapsamı, retry/idempotency ve pagination davranışı dokümante edilmelidir.

Eren Demir tarafından oluşturulmuştur.