KoderKoder.ai
FiyatlandırmaKurumsalEğitimYatırımcılar için
Giriş YapBaşla

Ürün

FiyatlandırmaKurumsalYatırımcılar için

Kaynaklar

Bize UlaşınDestekEğitimBlog

Yasal

Gizlilik PolitikasıKullanım KoşullarıGüvenlikKabul Edilebilir Kullanım PolitikasıKötüye Kullanımı Bildir

Sosyal

LinkedInTwitter
Koder.ai
Dil

© 2026 Koder.ai. Tüm hakları saklıdır.

Ana Sayfa›Blog›Roy Fielding’in REST’i: Modern Web API’lerini Şekillendiren Kısıtlar
08 Ağu 2025·7 dk

Roy Fielding’in REST’i: Modern Web API’lerini Şekillendiren Kısıtlar

Roy Fielding'in REST kısıtlarını ve bunların gerçek dünya API/web uygulama tasarımını nasıl şekillendirdiğini anlayın: istemci–sunucu, durumsuzluk, önbellek, uniform arayüz, katmanlar ve daha fazlası.

Roy Fielding’in REST’i: Modern Web API’lerini Şekillendiren Kısıtlar

Neden Roy Fielding'in REST'i Hâlâ Önemli

Roy Fielding sadece bir API moda terimine iliştirilmiş bir isim değil. HTTP ve URI spesifikasyonlarının yazarlarından biriydi ve doktora tezinde, Web'in neden bu kadar iyi çalıştığını açıklamak için REST (Representational State Transfer) adında bir mimari stil tanımladı.

Bu köken önemlidir çünkü REST "güzel görünen uç noktalar" yapmak için icat edilmedi. Amaç, küresel, dağınık bir ağın hâlâ ölçeklenmesini sağlayan kısıtları tanımlamaktı: çok sayıda istemci, çok sayıda sunucu, ara katmanlar, önbellekleme, kısmi hatalar ve sürekli değişim.

Bu gönderiden ne alacaksınız

İki “REST API”nin neden tamamen farklı hissettirdiğini ya da küçük bir tasarım seçiminin sonradan neden sayfalama sıkıntısına, önbellekleme karışıklığına veya kırılmalara dönüştüğünü merak ettiyseniz—bu rehber sürprizleri azaltmak içindir.

Elde edeceğiniz şeyler:

  • bir API tasarlarken veya değerlendirirken daha net karar verme
  • takımınızla takasları tartışmak için daha iyi bir kelime hazinesi
  • gerçek projelerde hangi REST fikirlerinin daha önemli olduğuna dair pratik bir his

REST Bir Sayfada: Stil, Bir Standart Değil

REST bir kontrol listesi, protokol veya sertifika değildir. Fielding bunu bir mimari stil olarak tanımladı: birlikte uygulandığında Web gibi ölçeklenen sistemler üreten bir dizi kısıtlama—kullanımı basit, zamanla evrilebilir ve ara katmanlara (proxy'ler, cache'ler, gateway'ler) dost.

REST'in çözdüğü sorun

Erken Web, birçok organizasyon, sunucu, ağ ve istemci türü arasında çalışmak zorundaydı. Merkezi bir kontrol olmadan büyümeli, kısmi hatalardan kurtulabilmeli ve yeni özellikler eski olanları bozmadan ortaya çıkabilmeliydi. REST bunu, özelleştirilmiş, sıkı bağlı sözleşmeler yerine (kimliklendiriciler, temsiller ve standart işlemler gibi) az sayıda yaygın kavramı tercih ederek ele alır.

"Mimari kısıtlar" basitçe ne demek?

Bir kısıtlama, tasarım özgürlüğünü belli faydalar karşılığında sınırlandıran bir kuraldır. Örneğin, sunucu tarafı oturum durumundan vazgeçerseniz isteği herhangi bir sunucu düğümü işleyebilir; bu güvenilirliği ve ölçeklenebilirliği artırır. Her REST kısıtlaması benzer bir takas yapar: daha az rastgele esneklik, daha fazla öngörülebilirlik ve evrimleşebilirlik.

REST vs. “REST-benzeri” API'ler

Birçok HTTP API'si REST fikirlerini ödünç alır (HTTP üzerinde JSON, URL uç noktaları, belki durum kodları) ama tüm kısıt setini uygulamaz. Bu "yanlış" değildir—çoğunlukla ürün zaman çizelgeleri veya dahili kullanım ihtiyaçlarını yansıtır. Aradaki farkı adlandırmak faydalıdır: bir API kaynak-odaklı olabilir ama tam anlamıyla REST olmayabilir.

Bir paragrafta zihinsel model

REST sistemini, istemcilerin temsiller (JSON veya HTML gibi) aracılığıyla etkileştiği kaynaklar (URL ile adlandırılabilen şeyler) olarak düşünün; işlem adımları ve ilgili kaynaklar için linklerle yönlendirilir. İstemci gizli dış kurallara ihtiyaç duymaz; standart semantikleri takip eder ve linkleri kullanarak gezinir—bir tarayıcının Web içinde dolaşması gibi.

Kaynaklar ve Temsiller: Temel Sözlük

Kısıtlara ve HTTP ayrıntılarına dalmadan önce REST basit bir kavram değişimiyle başlar: işlemler yerine kaynak düşünün.

Kaynak = tanımlayabileceğiniz bir isim (isimdurum)

Bir kaynak, sisteminizde adreslenebilir bir "şey"dir: bir kullanıcı, bir fatura, bir ürün kategorisi, bir alışveriş sepeti. Önemli olan bunun bir isim (noun) olmasıdır.

Bu yüzden /users/123 doğal okunur: ID'si 123 olan kullanıcıyı tanımlar. /getUser veya /updateUserPassword gibi eylem-şekilli URL'lerle karşılaştırın. Onlar fiilleri—yani yaptığınız işlemleri—anlatır.

REST, eylem yapamayacağınızı söylemez. Söylediği, eylemlerin uniform arayüz aracılığıyla ifade edilmesi gerektiğidir (HTTP API'lerinde genellikle GET/POST/PUT/PATCH/DELETE gibi yöntemler).

Temsil = kaynağın bir görünümü

Bir temsil, bir kaynağın belli bir anda gönderdiğiniz veya aldığınız görüntüsüdür. Aynı kaynak birden çok temsile sahip olabilir.

Örneğin, /users/123 kaynağı bir uygulama için JSON, bir tarayıcı için HTML olarak temsil edilebilir.

GET /users/123
Accept: application/json

Şöyle dönebilir:

{
  "id": 123,
  "name": "Asha",
  "email": "[email protected]"
}

Oysa:

GET /users/123
Accept: text/html

Aynı kullanıcı ayrıntılarını gösteren bir HTML sayfası dönebilir.

Ana fikir: kaynak JSON değildir ve HTML de değildir. Bunlar onu aktarmak için kullanılan formatlardır.

Bu çerçeve API tasarımını nasıl değiştirir

Kaynak ve temsil etrafında model kurduğunuzda, bazı pratik kararlar kolaylaşır:

  • İsimlendirme stabil kalır. /users/123 UI, iş akışları veya veri modeli değişse bile geçerli kalır.
  • Uç noktalar basitleşir. Her operasyon için yeni bir URL icat etmek yerine, kaynak URL'lerini yeniden kullanır ve yöntemi veya temsili değiştirirsiniz.
  • İstemci kodu daha az bağlı olur. İstemciler “kullanıcıyı getir” veya “kullanıcı üzerinde alan güncelle”e odaklanır, eylem uç noktaları kataloğunu ezberlemek yerine.

Bu kaynak-öncelikli zihniyet, REST kısıtlarının üzerine kurulduğu temeldir. Ondan yoksun, "REST" çoğunlukla "HTTP üzerinde JSON ve hoş URL kalıpları"na dönüşür.

Kısıtlama 1: İstemci–Sunucu Ayrımı

İstemci–sunucu ayrımı, sorumlulukları temiz bir şekilde böler. İstemci kullanıcı deneyimine odaklanır (görüntü ve etkileşim), sunucu ise veri, kurallar ve kalıcılıktan sorumludur. Bu ayrılık, her iki tarafın birbirini yeniden yazmaya zorlanmadan değişebilmesini sağlar.

İstemci tarafında ve sunucuda neler yaşar?

Günlük terimlerle istemci "sunum katmanıdır": ekranlar, gezinme, hızlı geri bildirim için form doğrulamaları ve iyimser UI davranışları. Sunucu ise "gerçeğin kaynağıdır": kimlik doğrulama, yetkilendirme, iş kuralları, veri depolama, denetim ve cihazlar arası tutarlılığı sağlaması gereken her şey.

Pratik bir kural: bir karar güvenlik, para, izinler veya paylaşılan veri tutarlılığını etkiliyorsa, sunucuda olmalıdır. Deneyimin nasıl hissettirdiğini etkileyen kararlar (yerleşim, yerel giriş ipuçları, yükleme durumları) istemcide olmalıdır.

Modern uygulama örneklerine uyumu

Bu kısıtlama şu yaygın kurulumlarla birebir örtüşür:

  • SPA + API: bir web uygulaması (React/Vue vb.) UI üzerinde iterasyon yaparken API kaynakları sunmaya devam eder.
  • Mobil uygulamalar: iOS ve Android istemcileri aynı sunucu kurallarını ve uç noktalarını paylaşabilir.
  • Üçüncü taraf entegrasyonlar: ortaklar aynı sunucu yeteneklerini UI gerektirmeden tüketebilir.

İstemci–sunucu ayrımı, “bir backend, birçok frontend” modelini gerçekçi kılar.

Yaygın tuzak: UI durumunun sunucu oturumuna sızması

Sık yapılan hata, UI iş akışı durumunu (örneğin: kullanıcının ödeme adımının hangi aşamada olduğu) sunucu tarafı oturumda saklamaktır. Bu, backend'i belirli bir ekran akışına bağlar ve ölçeklemeyi zorlaştırır.

Gerekli bağlamı her istekle göndermeyi (veya saklanan kaynaklardan türetmeyi) tercih edin; böylece sunucu kaynaklara ve kurallara odaklanır—belirli bir UI ilerleyişini hatırlamakla değil.

Kısıtlama 2: Durumsuz Etkileşimler

Durumsuzluk, sunucunun istekler arasında istemci hakkında herhangi bir şey hatırlamaması demektir. Her istek, doğru yanıtı oluşturmak için gereken tüm bilgileri taşır—çağıranın kim olduğu, ne istediği ve işleme için gerekli bağlam.

Neden önemli?

İstekler bağımsız olduğunda, yük dengeleyici arkasında sunucu eklemek ya da çıkarmak “hangi sunucu benim oturumumu biliyor” endişesini ortadan kaldırır. Bu, ölçeklenebilirlik ve dayanıklılığı artırır: herhangi bir örnek herhangi bir isteği işleyebilir.

Ayrıca operasyonları basitleştirir. Hata ayıklama genellikle daha kolaydır çünkü tam bağlam istekte (ve günlüklerde) görünür, sunucu tarafı oturum belleğine gizlenmez.

Gerçek API'lerde hissettiğiniz takaslar

Durumsuz API'ler genellikle istekte biraz daha fazla veri gönderir. Sunucu tarafı oturuma güvenmek yerine istemciler her seferinde kimlik bilgilerini ve bağlamı ekler.

Ayrıca "duruma bağlı" kullanıcı akışlarını (sayfalama veya çok adımlı ödeme gibi) açıkça belirtmeniz gerekir. REST çok adımlı deneyimleri yasaklamaz—sadece durumu istemciye ya da kimliklendirilebilir ve alınabilir sunucu tarafı kaynaklara koymanızı teşvik eder.

Pratik kalıplar (ve çözdükleri sorunlar)

  • Auth tokenleri (ör. Bearer JWT'ler): Her istek Authorization: Bearer … başlığı içerir, böylece herhangi bir sunucu kimlik doğrulayabilir.
  • Idempotency anahtarları: "ödeme oluştur" gibi işlemler için istemciler aynı işi tekrarlardan korumak amacıyla Idempotency-Key gönderir.
  • Correlation ID'leri: X-Correlation-Id gibi bir başlık, bir kullanıcı eylemini servisler ve günlükler arasında izlemeyi sağlar.

Sayfalama için "sunucu sayfa 3'ü hatırlar" yerine ?cursor=abc veya istemcinin takip edebileceği bir next linki tercih edin; gezinme durumunu yanıtlarda tutun, sunucu belleğine değil.

Kısıtlama 3: Önbelleğe Alınabilir Yanıtlar

Consistent errors fast
Create a standard error shape and status code rules across your services.
Build Now

Önbellekleme, önceki bir yanıtı güvenle yeniden kullanmakla ilgilidir, böylece istemci (veya aradaki bir katman) aynı işi tekrar sunucunuza sormak zorunda kalmaz. Doğru yapıldığında, kullanıcı için gecikmeyi düşürür ve sizin için yükü azaltır—API anlamını değiştirmeden.

Pratikte "önbelleğe alınabilir" ne demek?

Bir yanıt, belirli bir süre için başka bir isteğin aynı yükü almasının güvenli olduğu durumlarda önbelleğe alınabilir. HTTP'de bu niyeti önbellekleme başlıklarıyla iletirsiniz:

  • Cache-Control: ana kontrol paneli (ne kadar süre saklanacak, paylaşılan önbelleklerde saklanıp saklanmayacağı vb.)
  • ETag ve Last-Modified: istemcilerin "değişti mi?" diye sormasını sağlar, ucuz bir "değişmedi" cevabı alınabilir
  • Expires: tazeliği ifade etmenin daha eski bir yolu, hâlâ bazı yerlerde görülür

Bu sadece "tarayıcı önbelleklemesi" değil. Proxy'ler, CDN'ler, API gateway'leri ve hatta mobil uygulamalar kurallar açık olduğunda yanıtları yeniden kullanabilir.

Genellikle önbelleğe alınması güvenli olanlar (ve olmayanlar)

İyi adaylar:

  • Herkes için aynı olan kamu verileri (ürün katalogları, dokümantasyon, kullanıcıya özgü olmayan feature flag'ler)
  • Nadiren değişen salt okunur kaynaklar (statik konfigürasyon, referans verileri)
  • Cookie veya yetkilendirmeye bağlı olmayan GET yanıtları

Genelde kötü adaylar:

  • Hesaba bağlı kişisel veriler (profiller, siparişler, mesajlar)
  • Kimlik doğrulamayle ilgili yanıtlar (token değişimleri, oturum durumu)
  • Kullanıcıya göre değişen her şey, açıkça ele alınmadıysa

Gözlemleyeceğiniz pratik sonuçlar

  • Daha hızlı sayfalar ve daha duyarlı uygulamalar (ağ bekleme süresi azalır)
  • Daha düşük sunucu ve veritabanı maliyetleri (tekrar eden hesaplamalar azalır)
  • Daha az "rate limit" vakası (önbelleğe alınmış okumalar istek hacmini azaltır)

Ana fikir: önbellekleme sonradan eklenen bir detay değil. REST bir kısıtlama olarak, API'lerin tazelik ve doğrulama bilgisini açıkça iletenleri ödüllendirir.

Kısıtlama 4: Uniform Arayüz (Gerçekte Ne Anlatıyor)

Uniform arayüz genellikle "okuma için GET, oluşturma için POST kullan" şeklinde yanlış anlaşılır. Bu sadece küçük bir kısmı. Fielding'in fikri daha geniş: API'ler o kadar tutarlı olmalı ki istemciler her uç nokta için özel bilgiye ihtiyaç duymasın.

Uniform arayüzün dört parçası

  1. Kaynakların tanımlanması: Şeyleri (kaynakları) sabit kimliklerle (genellikle URL'ler) isimlendirin, eylemlerle değil. Örnek: /orders/123, /createOrder değil.

  2. Temsiller aracılığıyla manipülasyon: İstemciler bir kaynağı temsil göndererek değiştirir (JSON, HTML vb.). Sunucu kaynağı kontrol eder; istemci onun temsillerini değiş tokuş eder.

  3. Kendini tanımlayan mesajlar: Her istek/yanıt nasıl işleneceğini anlamak için yeterince bilgi taşımalıdır—method, status kodu, başlıklar, medya tipi ve anlaşılır bir gövde. Anlam dışarıda dökümanlarda saklıysa, istemciler sıkı bağlı hale gelir.

  4. Hypermedia (HATEOAS): Yanıtlar bağlantılar ve izin verilen eylemler içermeli ki istemciler her URL yapısını sert kodlamadan iş akışını takip etsin.

Neden bağlanmayı azaltır

Tutarlı bir arayüz, istemcilerin dahili sunucu ayrıntılarına daha az bağımlı olmasını sağlar. Zaman içinde bu, daha az kırılma, daha az “özel durum” ve ekipler uç noktaları değiştirdiğinde daha az yeniden çalışma demektir.

Uygulanabilecek pratik kurallar

  • Durum kodlarını tutarlı kullanın: örn. okumalar için 200, oluşturulan için 201 (ve Location), doğrulama hataları için 400, kimlik/izin için 401/403, kaynak yoksa 404.
  • Hata biçimini standartlaştırın: örnek alanlar: code, message, details, requestId.
  • Medya tipleri ve başlıkları anlamlı tutun (Content-Type, önbellek başlıkları), böylece mesajlar kendilerini açıklar.

Uniform arayüz, öngörülebilirlik ve evrimleşebilirlik hakkındadır, sadece "doğru fiiller" kullanmak değil.

Kendini Tanımlayan Mesajlar: Anlaşılabilirlik İçin Tasarım

Stateless API starter
Generate token-based auth and request patterns that work well behind a load balancer.
Try Free

"Kendini tanımlayan" bir mesaj, alıcısına onu nasıl yorumlayacağını söyler—kabala bilgisine gerek kalmadan. Eğer bir istemci (veya aradaki katman) bir yanıtın ne anlama geldiğini HTTP başlıkları ve gövdesine bakarak anlayamıyorsa, HTTP üzerinde özel bir protokol oluşturdunuz demektir.

Yükü açıklamak için medya tiplerini kullanın

En basit kazanç Content-Type (gönderilen) ve genellikle Accept (almak istediğiniz) başlıklarını açık kullanmaktır. Content-Type: application/json temel ayrıştırma kurallarını söyler; anlam önemliyse vendor veya profil tabanlı medya tipleriyle daha ileri gidilebilir.

Yaklaşımlar:

  • Genel medya tipi + sabit alanlar: application/json ile dikkatle korunan bir şema. Çoğu ekip için en kolay yol.
  • Vendor medya tipleri: application/vnd.acme.invoice+json gibi belirli bir temsili işaretlemek.
  • Profiller: application/json korunur, anlamı tanımlayan bir profile bağlantısı veya parametresi eklenir.

Sürümleme ve uyumluluk (istemcileri kırmadan)

Sürümleme mevcut istemcileri korumalı. Popüler seçenekler:

  • URL ile sürümleme (/v1/orders): bariz ama temsilleri çatallanmasına yol açabilir.
  • Başlık veya medya tipi ile sürümleme (Accept aracılığıyla): URL'leri sabit tutar ve "bu ne anlama geliyor" bilgisini mesaja taşır.
  • Eklemeci evrim: yeni alan eklemeyi tercih edin ve eski alanları çalışır durumda bırakın; kademeli olarak kullanımdan kaldırın.

Ne seçerseniz seçin, varsayılan olarak geriye dönük uyumluluğu hedefleyin: alanları rastgele yeniden adlandırmayın, anlamı sessizce değiştirmeyin ve kaldırmayı kırıcı bir değişiklik olarak değerlendirin.

Tutarlı hatalar ve açık isimlendirme

Hatalar her yerde aynı görünürse istemciler daha hızlı öğrenir. Bir hata şekli seçin (örn. code, message, details, traceId) ve tüm uç noktalarda kullanın. Alan adlarında açık, tahmin edilebilir isimler (createdAt vs created_at) kullanın ve bir konvansiyona sadık kalın.

Dokümantasyon yardımcı olur—ama mesajda netlik olmalı

İyi dökümantasyon benimsemeyi hızlandırır, ama anlamın tek yeri olmamalıdır. İstemcinin status: 2nin "ödendi" mi yoksa "beklemede" mi olduğunu anlamak için wiki okumak zorunda kalması, mesajın kendini tanımlayan olmadığını gösterir. İyi tasarlanmış başlıklar, medya tipleri ve okunabilir yükler bu bağımlılığı azaltır ve sistemleri daha kolay evrilebilir kılar.

Hypermedia (HATEOAS): En Çok Atlanan REST Fikri

Hypermedia (HATEOAS: Hypermedia As The Engine Of Application State), bir istemcinin önceden API'nin sonraki URL'lerini bilmek zorunda olmaması anlamına gelir. Bunun yerine her yanıt keşfedilebilir sonraki adımlar olarak linkler içerir: nereye gidileceği, hangi eylemlerin mümkün olduğu ve bazen hangi HTTP yönteminin kullanılacağı.

Pratikte nasıl görünür

/orders/{id}/cancel gibi yolları sert kodlamak yerine, istemci sunucunun sağladığı linkleri takip eder. Sunucu şu demektir: "Bu kaynağın şu anki durumuna göre, geçerli hamleler bunlardır."

{
  "id": "ord_123",
  "status": "pending",
  "total": 49.90,
  "_links": {
    "self":   { "href": "/orders/ord_123" },
    "payment":{ "href": "/orders/ord_123/payment", "method": "POST" },
    "cancel": { "href": "/orders/ord_123", "method": "DELETE" }
  }
}

Sipariş paid olduğunda sunucu cancel bağlantısını kaldırıp refund ekleyebilir—iyi davranan bir istemci bu değişiklikten etkilenmez.

Hypermedia en çok ne zaman fayda sağlar

Hypermedia, akışların evrildiği durumlarda parıldar: onboarding adımları, ödeme süreçleri, onaylar, abonelikler veya "sonraki izin verilen" eylemlerin durum, izin veya iş kurallarına göre değiştiği her yerde.

Ayrıca sert kodlanmış URL'leri ve kırılgan istemci varsayımlarını azaltır. Rotaları yeniden düzenleyebilir, yeni eylemler ekleyebilir veya eski olanları kullanımdan kaldırabilirsiniz; yeter ki link ilişkilerinin anlamını koruyun.

Ekiplerin neden atladığı (ve ne kaybettikleri)

Takımlar genellikle link formatları tanımlama, ilişki adlarında anlaşma ve istemci geliştiricilerini linkleri takip etmeye öğretme gibi ek işler gerektiği için HATEOAS'ı atlar.

Kaybettikleri ise REST'in ana faydalarından biridir: gevşek bağlılık. Hypermedia yoksa birçok API "HTTP üzerinden RPC" haline gelir—HTTP'yi kullanırlar ama istemciler hala dış belgeler ve sabit URL şablonlarına güçlü şekilde bağımlıdır.

Kısıtlama 5: Katmanlı Sistem

Katmanlı sistem, istemcinin yanıtın gerçek origin sunucudan mı yoksa yol üzerindeki ara katmanlardan mı geldiğini bilmek zorunda olmaması demektir. Bu katmanlar API gateway'leri, ters proxy'ler, CDN'ler, auth servisleri, WAF'ler, service mesh'ler ve hatta mikroservisler arası dahili yönlendirmeyi içerebilir.

Katmanların faydası nedir?

Katmanlar temiz sınırlar oluşturur. Güvenlik ekipleri TLS, rate limit, kimlik doğrulama ve istek doğrulamayı kenarda uygulayabilir; bu, her backend servisini değiştirmeyi gerektirmez. Operasyon ekipleri gateway arkasında yatay ölçekleme yapabilir, CDN'de önbellekleme ekleyebilir veya olay anında trafiği kaydırabilir. İstemciler içinse tek bir kararlı API uç noktası, tutarlı başlıklar ve öngörülebilir hata biçimleri sunar.

Pratikte hissettiğiniz takaslar

Ara katmanlar gizli gecikme (ek atlamalar, ek el sıktırmalar) getirebilir ve hata ayıklamayı zorlaştırabilir: sorun gateway kurallarında, CDN önbelleğinde veya origin kodunda olabilir. Önbellekleme, farklı katmanlar farklı şekilde önbelleklediğinde veya gateway başlıkları yeniden yazdığında kafa karıştırıcı olabilir.

Katmanların zarar vermemesini sağlamak için pratik ipuçları

  • Uçtan uca izleme kimlikleri kullanın: bir istek ID'si kabul edin (veya oluşturun) ve her hop boyunca iletin; bunu yanıt ve günlüklerde gösterin.
  • Hata yayılımını netleştirin: upstream hatalarını açıkça eşleyin (her hatayı tek tip 500'e çevirmeyin).
  • Her hop için timeout belirleyin: gateway, upstream ve istemci timeout'ları hizalanmalı.
  • Önbellekleme davranışını belgeleyin: hangi yanıtların önbelleğe alınabilir olduğunu ve ara katmanların hangi başlıkları koruması gerektiğini açıkça belirtin.

Katmanlar, sistem gözlemlenebilir ve öngörülebilir kaldığı sürece güçlüdür.

Kısıtlama 6 (Opsiyonel): Code-on-Demand

Flutter app for your API
Create a Flutter app that consumes your API and handles paging and retries.
Build Mobile

Code-on-demand, REST kısıtlamalarından açıkça opsiyonel olanıdır. Sunucunun istemciyi genişletmek için çalıştırılabilir kod gönderebilmesini ifade eder. İstemci tüm davranışları baştan paketlemek yerine gerektiğinde yeni mantık indirebilir.

Web'in tanıdık örneği: JavaScript

Bir sayfa yüklenip etkileşimli hale geldiğinde—form doğrulama, grafik çizme, tablo filtreleme—tarayıcıda koşan JavaScript zaten code-on-demand kullanır. Sunucu HTML ve veri ile birlikte davranışı sağlayan kodu teslim eder.

Bu, webin hızla evrilmesini sağlayan önemli bir nedendir: tarayıcı genel amaçlı bir istemci olarak kalırken siteler kullanıcının yeni işlevsellikleri yeniden uygulama yükü olmadan sunabilir.

Neden opsiyonel (ve pek çok API neden atlar)

Diğer kısıtlamalar zaten ölçeklenebilirlik, sadelik ve birlikte çalışabilirlik sağladığı için REST code-on-demand olmadan da "işe yarar". Bir API yalnızca JSON gibi temsiller sunan saf bir kaynak-odaklı yapı olabilir ve istemciler kendi davranışlarını uygular.

Birçok modern Web API'si aktif olarak çalıştırılabilir kod göndermekten kaçınır çünkü bu şunları karmaşıklaştırır:

  • Güvenlik: yürütülebilir kod saldırı yüzeyini büyütür (injection, tedarik zinciri sorunları, kötü amaçlı betikler)
  • İçerik politikaları: tarayıcılar CSP gibi kısıtlar uygular; organizasyonlar inline scriptleri veya bilinmeyen kaynakları engelleyebilir
  • Denetim ve uyumluluk: hangi kodun ne zaman istemcide çalıştığını kanıtlamak zorlaşır, özellikle dinamik olarak getiriliyorsa

Code-on-demand hâlâ ne zaman mantıklı olabilir?

İstemci ortamını kontrol ettiğinizde ve UI davranışını hızlı yaymak istediğinizde veya ince bir istemciye sunucudan "eklenti" ya da kurallar indirtmek istediğinizde code-on-demand işe yarayabilir. Ancak bu bir zorunluluk değil; bir araç olarak düşünülmelidir.

Ana çıkarım: REST'i code-on-demand olmadan da tam olarak izleyebilirsiniz—birçok üretim API'si bunu yapar—çünkü bu kısıtlama isteğe bağlı genişletilebilirlik hakkındadır, kaynak-temelli etkileşimin temeli değil.

Bugün REST'i Uygulamak: Pratik Seçimler ve Yaygın Hatalar

Çoğu ekip REST'i reddetmez—HTTP'yi taşıma olarak kullanırken anahtar kısıtları sessizce bırakıp “REST-benzeri” bir stil benimser. Bu sorun değil, yeter ki bu bilinçli bir takas olsun; yanlışlıkla yapılırsa sonradan kırılgan istemciler ve maliyetli yeniden yazımlar olarak geri döner.

Yaygın REST-benzeri kestirmeler (ve neden oluşur)

Sık görülen desenler:

  • RPC uç noktaları: /doThing, /runReport, /users/activate—isimlendirmesi kolay, bağlama almak kolay.
  • Fiil ağırlıklı URL'ler: /createOrder, /updateProfile, /deleteItem—HTTP methodları ikinci plana düşer.
  • Gizli oturumlar: "Durumsuz" API'ler ama hala sticky session, sunucu belleği veya örtük iş akışı durumu kullanmak.

Bu seçimler başlangıçta üretken hissedebilir çünkü dahili fonksiyon isimlerini ve iş operasyonlarını yansıtır.

Sonradan fark edeceğiniz sonuçlar

  • Kırılgan istemciler: İstemciler belirli uç nokta şekillerine ve ad-hoc davranışlara bağımlıysa küçük sunucu refactor'ları kırılmalara yol açar.
  • Zor sürümlendirme: URL'ler davranışı kodluyorsa, davranışları sürümlendirmeniz gerekir; temsilleri evrimleştirmek yerine çatallanma eğilimi olur.
  • Önbellek kayıpları (ve daha yüksek gecikme): Her şey için POST kullanmak veya önbellek başlıklarını görmezden gelmek aradaki katmanların size yardımcı olmasını engeller.
  • Ölçekleme sorunları: Gizli sunucu tarafı oturum durumu yatay ölçeklemeyi zorlaştırır ve hatalardan kurtarmayı güçleştirir.

Pratik bir uyum kontrol listesi

Bu, "gerçekten ne kadar REST'iz?" değerlendirmesi için kullanılabilir:

  1. Kaynakları isimlendirin, eylemleri değil: /orders/{id} tercih edin /createOrder yerine.
  2. HTTP methodlarını kasıtlı kullanın: GET oku, POST oluştur, PUT/PATCH güncelle, DELETE sil.
  3. İstekleri bağımsız yapın: "istemcinin hangi adımda olduğu"nu anlamak için sunucu belleğine güvenmeyin.
  4. Güvenli yerlere önbelleğe alma uygulayın: GET yanıtları için Cache-Control, ETag, Vary kullanın.
  5. Hata ve medya tiplerini standartlaştırın: tutarlı durum kodları ve yanıt biçimleri özel durumları azaltır.

Gerçek uygulama sırasında nerede ortaya çıkar

REST kısıtları sadece teori değildir—geliştirirken hissettiğiniz koruyucu çitlerdir. Bir API'yi hızlıca üretirken (ör. React frontend ile Go + PostgreSQL backend hızla eşleştirme), en kolay hata "hızlıca bağlamak" için arayüzünüzü bırakmaktır.

Eğer Koder.ai gibi bir vibe-coding platformu kullanıyorsanız, bu REST kısıtlarını baştan sohbete getirmek faydalıdır—önce kaynakları isimlendirmek, durumsuz kalmak, tutarlı hata biçimleri tanımlamak ve önbelleğin nerede güvenli olduğunu belirlemek. Böylece hızlı iterasyon bile istemciler için öngörülebilir ve evrilebilir API'ler üretir. (Ve Koder.ai kaynak kodu dışa aktarmayı desteklediği için API sözleşmesini ve uygulamayı gereksinimler geliştikçe rafine edebilirsiniz.)

API ve web uygulama ekipleri için sonuçlar

Önce ana kaynaklarınızı tanımlayın, sonra kısıtları bilinçli seçin: önbellekleme veya hypermedia atlıyorsanız nedenini ve yerine ne koyduğunuzu belgeleyin. Amaç saflık değil—açıklık: kararlı kaynak kimlikleri, öngörülebilir semantikler ve sisteminiz evrildiğinde istemcileri dayanıklı tutacak açık takaslar.

SSS

What did Roy Fielding mean by “REST,” and why isn’t it a standard?

REST (Representational State Transfer), Roy Fielding'in Web'in neden ölçeklendiğini açıklamak için tanımladığı bir mimari stiltir.

Bu bir protokol veya sertifika değildir — istemci–sunucu, durumsuzluk, önbelleklenebilirlik, uniform arayüz, katmanlı sistem ve isteğe bağlı code-on-demand gibi bazı kısıtları içeren bir yaklaşım setidir. Bu kısıtlar esneklikten bazı ödünler vererek ölçeklenebilirlik, evrimleşebilirlik ve birlikte çalışabilirlik sağlar.

Why do two “REST APIs” often feel completely different?

Çünkü birçok API sadece bazı REST fikirlerini (HTTP üzerinden JSON, güzel URL'ler vb.) alır ama diğerlerini atlar (önbellek kuralları veya hypermedia gibi).

İki “REST API” şunlara göre çok farklı hissedebilir:

  • kararlı kaynaklar mı yoksa eylem uç noktaları mı modelledikleri
  • HTTP semantiğini (methodlar, status kodları, başlıklar) tutarlı kullanıp kullanmadıkları
  • önbelleğe ve aradaki ara katmanlara destek verip vermedikleri
  • keşfedilebilir bağlantılarla istemci bağlanmasını azaltıp azaltmadıkları
What’s the practical difference between “resources” and “actions” in URL design?

Kaynak, sisteminizde tanımlanabilir bir isimlendirilmiş nesnedir (ör. /users/123). Eylem uç noktası ise URL içinde yerleşik bir fiiltir (ör. /getUser, /updatePassword).

Kaynak-odaklı tasarım uzun vadede daha iyi yaşlanır çünkü tanımlayıcılar (identifiers) UI veya iş akışları değişse bile stabildir. Eylemler yine olabilir, ama genellikle HTTP yöntemleri ve temsiller aracılığıyla ifade edilir, fiil-biçimli yollar yerine.

What is a “representation,” and why is the resource not the JSON?

Kaynak kavramdır ("kullanıcı 123"). Temsil (representation) ise ağ üzerinden gönderdiğiniz anlık görüntüdür (JSON, HTML vb.).

Bu önemli çünkü aynı kaynak için farklı temsiller ekleyebilir veya değiştirebilirsiniz; kaynak kimliği aynıdır. İstemciler bir tek yük formatına değil, kaynak anlamına bağlı kalmalıdır.

How does client–server separation help real-world API teams?

İstemci–sunucu ayrımı sorumlulukları net tutar:

  • İstemci: UI, etkileşim, gezinme, hızlı doğrulama, iyimser UI davranışları
  • Sunucu: kimlik doğrulama/izinler, iş kuralları, kalıcılık, denetim

Güvenlik, para, izinler veya paylaşılan tutarlılık etkileyen kararlar sunucuda olmalıdır. Bu ayrım “bir backend, birden çok frontend” modelini mümkün kılar.

What does “stateless” mean for an HTTP API, and what changes in practice?

Durumsuzluk, sunucunun istemci hakkında istekler arasında bir şey hatırlamamasıdır. Her istek, çağıranın kim olduğunu, ne istediğini ve işlem için gereken bağlamı içerir.

Bunun pratik faydaları: yatay ölçekleme kolaylaşır (herhangi bir düğüm herhangi bir isteği işleyebilir) ve hata ayıklama basitleşir çünkü bağlam istekte/günlüklerde görünür.

Yaygın kalıplar:

Which caching headers matter most, and when should I use them?

Önbelleğe alınabilir yanıtlar, istemcinin veya aradaki bir ara katmanın aynı yükü tekrar istemeden yeniden kullanabilmesini sağlar; bu gecikmeyi düşürür ve sunucu yükünü azaltır.

HTTP araçları:

  • Cache-Control (tazelik ve kapsam)
  • ETag / (doğrulama, )
Is REST just “use GET/POST/PUT/DELETE correctly,” or is it more than that?

Uniform interface, sadece "GET oku, POST oluştur" demekten daha fazlasıdır. Amaç, istemcilerin her uç nokta için özel bilgiye ihtiyaç duymadan API'yi kullanabilmesini sağlamaktır.

Pratikte odaklanılacaklar:

What is HATEOAS (hypermedia), and when is it actually worth doing?

Hypermedia, yanıtların geçerli sonraki eylemlere bağlantılar içermesidir; böylece istemciler URL şablonlarını sert kodlamak yerine sunucunun verdiği bağlantıları takip eder.

En çok yararlı olduğu durumlar: akışların duruma veya izinlere göre değiştiği checkout, onaylar, abonelikler gibi süreçlerdir. Takımlar genellikle ek tasarım işi gerektirdiği için bunu atlarlar; kaybettikleri ise daha gevşek bağlanmış bir istemci–sunucu ilişkisi olur.

How do “layered systems” affect API behavior, performance, and debugging?

Katmanlı sistem, istemcinin yanıtı doğrudan origin sunucudan mı yoksa aradaki ara katmanlardan mı aldığını bilmek zorunda olmadığı anlamına gelir. Ara katmanlar: CDN'ler, gateway'ler, ters proxy'ler, auth servisleri vb.

Sorunları azaltmak için:

  • uçtan uca izleme için istek/korelasyon ID'lerini taşıyın
  • hata propagasyonunu netleştirin (her şeyi sadece 500 yapmayın)
  • her hop için timeoutları hizalayın
  • önbellekleme davranışını belgeleyin ve cache ile ilgili başlıkları koruyun

Katmanlar, gözlemlenebilirlik ve öngörülebilirlik varsa güçlüdür.

İçindekiler
Neden Roy Fielding'in REST'i Hâlâ ÖnemliREST Bir Sayfada: Stil, Bir Standart DeğilKaynaklar ve Temsiller: Temel SözlükKısıtlama 1: İstemci–Sunucu AyrımıKısıtlama 2: Durumsuz EtkileşimlerKısıtlama 3: Önbelleğe Alınabilir YanıtlarKısıtlama 4: Uniform Arayüz (Gerçekte Ne Anlatıyor)Kendini Tanımlayan Mesajlar: Anlaşılabilirlik İçin TasarımHypermedia (HATEOAS): En Çok Atlanan REST FikriKısıtlama 5: Katmanlı SistemKısıtlama 6 (Opsiyonel): Code-on-DemandBugün REST'i Uygulamak: Pratik Seçimler ve Yaygın HatalarSSS
Paylaş
Koder.ai
Build your own app with Koder today!

The best way to understand the power of Koder is to see it for yourself.

Start FreeBook a Demo
  • Her çağrıda Authorization: Bearer …
  • Güvenli yeniden denemeler için idempotency anahtarları
  • Sayfalama için ?cursor=... veya yanıt içi next linki
  • Last-Modified
    304 Not Modified
  • Vary (yanıtın hangi başlıklara göre değiştiğini belirtir)
  • Kural: herkese aynı olan kamu verilerini agresif önbelleğe alın; kullanıcıya özgü veriler genelde private veya önbelleğe alınmaz.

  • kararlı kaynak kimlikleri
  • doğru HTTP yöntemleri
  • tutarlı durum kodları (200, 201 + Location, 400, 401/403, 404)
  • standart bir hata gövdesi (code, message, details, requestId)
  • Bu, bağlamayı azaltır ve değişikliklerin istemcileri kırma olasılığını düşürür.