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 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.
İ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:
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.
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.
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.
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.
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.
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.
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).
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.
Kaynak ve temsil etrafında model kurduğunuzda, bazı pratik kararlar kolaylaşır:
/users/123 UI, iş akışları veya veri modeli değişse bile geçerli kalır.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.
İ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.
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.
Bu kısıtlama şu yaygın kurulumlarla birebir örtüşür:
İstemci–sunucu ayrımı, “bir backend, birçok frontend” modelini gerçekçi kılar.
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.
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.
İ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.
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.
Authorization: Bearer … başlığı içerir, böylece herhangi bir sunucu kimlik doğrulayabilir.Idempotency-Key gönderir.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.
Ö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.
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ınabilirExpires: tazeliği ifade etmenin daha eski bir yolu, hâlâ bazı yerlerde görülürBu 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.
İyi adaylar:
Genelde kötü adaylar:
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.
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.
Kaynakların tanımlanması: Şeyleri (kaynakları) sabit kimliklerle (genellikle URL'ler) isimlendirin, eylemlerle değil. Örnek: /orders/123, /createOrder değil.
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.
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.
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.
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.
200, oluşturulan için 201 (ve Location), doğrulama hataları için 400, kimlik/izin için 401/403, kaynak yoksa 404.code, message, details, requestId.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" 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.
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:
application/json ile dikkatle korunan bir şema. Çoğu ekip için en kolay yol.application/vnd.acme.invoice+json gibi belirli bir temsili işaretlemek.application/json korunur, anlamı tanımlayan bir profile bağlantısı veya parametresi eklenir.Sürümleme mevcut istemcileri korumalı. Popüler seçenekler:
/v1/orders): bariz ama temsilleri çatallanmasına yol açabilir.Accept aracılığıyla): URL'leri sabit tutar ve "bu ne anlama geliyor" bilgisini mesaja taşır.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.
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.
İ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: 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ğı.
/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, 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.
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.
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 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.
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, sistem gözlemlenebilir ve öngörülebilir kaldığı sürece güçlüdür.
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.
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.
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:
İ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.
Ç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.
Sık görülen desenler:
/doThing, /runReport, /users/activate—isimlendirmesi kolay, bağlama almak kolay./createOrder, /updateProfile, /deleteItem—HTTP methodları ikinci plana düşer.Bu seçimler başlangıçta üretken hissedebilir çünkü dahili fonksiyon isimlerini ve iş operasyonlarını yansıtır.
Bu, "gerçekten ne kadar REST'iz?" değerlendirmesi için kullanılabilir:
/orders/{id} tercih edin /createOrder yerine.Cache-Control, ETag, Vary kullanın.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.)
Ö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.
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.
Çü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:
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.
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.
İstemci–sunucu ayrımı sorumlulukları net tutar:
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.
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:
Ö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, )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:
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.
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:
500 yapmayın)Katmanlar, gözlemlenebilirlik ve öngörülebilirlik varsa güçlüdür.
Authorization: Bearer …?cursor=... veya yanıt içi next linkiLast-Modified304 Not ModifiedVary (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.
200, 201 + Location, 400, 401/403, 404)code, message, details, requestId)Bu, bağlamayı azaltır ve değişikliklerin istemcileri kırma olasılığını düşürür.