İçeriğe geç

Tahmin edilebilir bir API'nin 7 katmanı

Klavye: ← → ile gezinin, F tam ekran, O genel bakış.

Tan, el sallarken

Muhammet Şafak — Sunumlar

Tahmin edilebilir bir API'nin 7 katmanı

İstemcinin şaşırmadığı bir API, yedi küçük kararın tutarlılığıdır.

Muhammet Şafak

Tan, işaret ederken

Akış

Dört durak

  1. Kaynak ve durum koduKatman 1 ve 2
  2. Liste uçlarıKatman 3: sayfalama, filtre, sıralama
  3. Yanıt ve hataKatman 4 ve 5
  4. Sürüm ve sözleşmeKatman 6 ve 7

Yedi katman

Her katman bir tutarlılık kararı

Kaynak
URL isim tabanlı ve çoğul, eylemi HTTP yöntemi taşır.
Durum
Başarı 2xx, istemci hatası 4xx, sunucu hatası 5xx.
Liste
page, per_page, sort, order her uçta aynı adla.
Zarf
Her yanıt aynı iskelette: success, data, message, errors.
Hata
Hata error.code, error.message, error.details olarak döner.
Sürüm
Breaking değişiklik yeni sürüm ister.
OpenAPI
Sözleşme koddan önce yazılır.

Katman 1 · Kaynak ve yöntem

Eylemi URL değil, yöntem taşır

Eylemi URL değil, yöntem taşır
YöntemAnlamıÖrnek
GETOkuGET /users/42
POSTOluşturPOST /users
PUTTamamen güncellePUT /users/42
PATCHKısmen güncellePATCH /users/42
DELETESilDELETE /users/42

Katman 2 · Durum kodu

Durum kodu sonucu söyler

Her hata için 200 OK dönüp gövdeye "error": true yazmak çalışır ama REST prensibine aykırı.
SınıfKodlarAnlamı
2xx200 · 201 · 204Başarılı; oluşturuldu; içerik yok
4xx400 · 401 · 403 · 404 · 422Hatalı veri, kimlik, yetki, kaynak yok, doğrulama
5xx500Sunucu tarafında beklenmeyen hata

Katman 3 · Sayfalama

Bir sayfanın künyesi

  • 2current_pagelast_page: 15
  • 20per_pageÜst sınır: min($adet, 100)
  • 21–40from – toBu sayfadaki kayıtlar
  • 287totalToplam kayıt

Kaynaktaki örnek · OFFSET

Sayfa büyüdükçe OFFSET pahalanır.

On bininci sayfaya gitmek için veritabanının 200.000 kaydı okuyup geçmesi gerekiyor; çözümlerden biri cursor pagination.

Katman 4 · Yanıt zarfı

Her yanıt aynı iskelette

İstemci her uçta aynı dört alanı okur: success, data, message, errors.

response.json
{"success": true,"data": {},"message": null,"errors": null}

Katman 4 · Yanıt zarfı

Liste de aynı zarfta

Sayfalı liste data.items ve data.meta olarak döner; zarf değişmez.

response.json
{"success": true,"data": {  "items": [],  "meta": {    "current_page": 1,    "per_page": 15,    "total": 243,    "last_page": 17  }},"message": null,"errors": null}

Katman 5 · Hata sözleşmesi

Hata da bir sözleşmedir

code makine için sabittir, message insan için değişebilir, details ek bağlam taşır.

error.json
{"error": {  "code": "VALIDATION_FAILED",  "message": "Gönderilen veriler doğrulanamadı.",  "details": [    {      "field": "email",      "message": "Geçerli bir e-posta adresi giriniz."    },    {      "field": "phone",      "message": "Telefon numarası zorunludur."    }  ]}}

Katman 4 ve 5

Zarf ve hata kuralları

  • 200 ile hataHata için 200 + "error": true çalışır ama REST'e aykırı; cache ve loglama bozulur.
  • BiçimHata kodu büyük harf ve alt çizgiyle: QUOTA_EXCEEDED.
  • KodlarYeni kod eklenebilir, eski kod kaldırılmamalı.
  • ÖlçekTek istemcili küçük serviste durum kodu ve kısa mesaj yeter.

Katman 6 · Sürümleme

Üç strateji, tercih URI

Tercih URI sürümlemesi: okunabilirlik, ayrı dokümantasyon, ayrı rota grupları.
StratejiÖrnekTakas
URIGET /api/v1/usersLog ve proxy'de net görünür; URL'leri çoğaltır
HeaderX-API-Version: 2URL temiz kalır; eksik header belirsizlik doğurur
QueryGET /api/users?version=2Başlangıçta pratik; proxy ve CDN görmeyebilir

Katman 6 · Sürümleme

Temel düzeyde: hangi değişiklik yeni sürüm ister?

Uyumlu

  • Yanıta yeni bir alan eklemek.
  • İsteğe bağlı bir parametre eklemek.
  • Hata mesajlarını zenginleştirmek.

Breaking

  • Var olan bir alanı kaldırmak veya yeniden adlandırmak.
  • Zorunlu bir parametre eklemek.
  • Yanıt yapısını ya da durum kodunu değiştirmek.

Kullanımdan kaldırma

En az 6–12 ay önceden duyurun.

Dış istemcilere açık bir API'de en az 6-12 aylık bir deprecation süreci makul.

Katman 6 · RFC 8594 (2019) · RFC 9745 (2025)

Sürümün ömrünü başlıkla bildirin

RFC 8594: Mayıs 2019, Informational. RFC 9745: Mart 2025.
BaşlıkBelgeNe söyler
Deprecation: @1780272000RFC 9745Ne zaman kullanımdan kaldırıldığını; değer bir tarih, true geçersiz
Sunset: Sat, 31 Oct 2026 23:59:59 GMTRFC 8594Ne zaman yanıt vermeyeceğini
Link: <…/docs/migrate-v2>; rel="deprecation"RFC 9745Geçiş belgesinin adresini

Katman 7 · Contract-first

Önce sözleşme, sonra kod

  1. Adım 1: SözleşmeOpenAPI 3.0.3
  2. Adım 2: Paralel işbackend · UI · test
  3. Adım 3: MockPrism
  4. Adım 4: Doğrulamacontract testing
  5. Adım 5: Güncellemesözleşme ya da kod

Katman 7 · OpenAPI

Sözleşme koddan önce yazılır

Örnek sözleşmenin şema kesiti. /orders ucu status filtresini pending, completed, cancelled ile sınırlar.

openapi.yaml
components:schemas:  Order:    type: object    required: [id, status, total]    properties:      id:        type: integer      status:        type: string      total:        type: number

Katman 7

Contract-first ne zaman değer?

  • Küçük projeTek geliştirici, küçük proje: contract-first overkill olabilir.
  • Çok tüketiciWeb, mobil, üçüncü taraf: kesinlikle zaman kazandırıyor.
  • Uzun ömürYıllarca yaşayacak API'de sözleşme bir karar kaydıdır.
Tan, gülümserken

Teşekkürler

muhammetsafak.com.tr

Yedi katman, yedi tutarlılık sözü. Ayrıntılar altı kaynak yazıda.

Paylaş, göm, indir