HTTP Ve Retrofit Cache 1
Merhaba, Cache(ön belleğe alma) serimize bu yazı ile devam ediyoruz. Client geliştirirken kullanıcıya hızlı bir şekilde cevap vermek her ne kadar sunucu tarafında yapılması gereken birşey gibi gözüksede işin büyük kısmı client tarafınada düşebiliyor. Sonuç olarak son kullanıcı ile etkileşime geçen client tarafı oluyor.
Cacheyi anlattığım yazılar için;
- Picasso İle İmage Cache
- HTTP ve Retrofit Cache 1
- HTTP ve Retrofit Cache 2
- ExoPlayer İle Video Cache
Retrofit ile Cache olayına girmeden önce HTTP’nin bize sunduğu Cache olanaklarından bahsetmek daha sağlıklı. Bu yazımızda genel olarak HTTP’nin cache olanaklarından bahsedeceğim.
Bu konular için yararlandığım kaynaklar şunlar (Ben biraz özet geçeceğim, detaylı şekilde bu yazıları okuyunuz )
Bir HTTP işlemi için request ( istek ) olmalı. Ve bu isteğin sonucunda istek yapılan yerden response ( cevap ) gelmeli. Peki bir sunucuya bir istek gönderirken isteğimiz içinde neler var? Gelin genel olarak bir bakalım
Örn: www.serkanozaydin.net/users/2/detail?update=PROFILE
Yukarıda yazdığım bir link var teker teker parçalayalım
2: Path oluyor
update: Query oluyor
peki bir request bu kadar mı? Tabi ki değil siz browserda www.google.com.tr adresine girince aslında bilmeseniz bile birçok şey gönderiyorsunuz. Bunların bir çoğuda Header’da gidiyor. Gelin www.google.com.tr adresine request attığımız zaman Header’ın içinde neler var bakalım.
Request Method: Get işlemi yapmışız
Status Code: İstek yaptığımız yer bize başarılı cevap gelmiş (200)
cookie: Sunucuya bir cookie göndermişiz
Şuan burada yok ama bir E-tag var
Örn:
böyle böyle artıyor. Benim değinmek istediğim yerler şunlar;
- Status code
- cache-control
Aslında siz client olarak Header içinde belirlediğiniz parametreler ile cacheli veri veya cachesiz güncel veriyi sunucudan istiyebiliyorsunuz. Veya aldığınız veriyi client için Header ile yönetebiliyorsunuz.
Nasıl Yani?
Hadi gelin olayın derinlerine doğru gidelim. Siz her requestte eğer clienta cache gibi bir özellik eklemiş iseniz E-tag adında nasıl üretildiği muamma olan bir key gönderiyorsunuz. Peki bu E-tag ne?
Siz sunucuya request gönderdikten sonra sunucu size döneceği responseye göre bir key üretiyor. Ve siz sonra aynı endpointe request gönderince size daha önce gelen E-tag ile request veriyorsunuz ve sunucu size döneceği responseden tekrar bir E-tag üretiyor eğer sizin gönderdiğiniz E-tag ile sunucunun oluşturduğu E-tag uyuşuyor ise sunucu size 304 Status Code Not Modified dönüyor
Ne oluyor bu 304 Code? Yani size sunucu diyor ki “Arkadaş daha önce bana geldin ben sana bir cevap döndüm. Şimdi yine geliyorsun sana yine aynı cevabı döneceğim. Gel sen benden birşey isteme sana daha önce verdiğim cevabı kullan ve benden veri indirme. Hem sen işini hızlandır hem bende yükümü azaltayım” . Sunucu size aynı cevabı dönecek ise neden size daha önce döndüğü cevabı kullanmayasınız ki?
Peki Cache-control Ne oluyor?
Siz sunucuya gittiğiniz zaman belki bazı verileri kesinlikle sunucudan istiyor olabilirsiniz veya daha önce aldığınız bir veriyi sunuya değiştimi değişmedimi kontrol etmeksizin cacheden kullanmak isteyebilirsiniz. Detaylara değinmeyeceğim Gökhan Şengün hocanın yukarıda paylaştığım yazısını detaylı şekilde okuyarak öğrenebilirsiniz. Ben burada sadece şuna değineceğim; Sunucudan aldığınız bir veriyi ne kadar süre boyunca sunucudan güncel veri çekmeksizin kullanmak istediğimizi belirliyoruz?
Yani bir endpoint için hiç sunucuya gitmek istemeyebilirsiniz mesela Kullanıcının Adı ve Soyadını çağırdığınız bir servisten dönen sonucu bir daha sunucudan almak istemeyebilirsiniz. Sonuç olarak kullanıcının Adı ve Soyad’ı genellikle değişmez ki bunun için neden bir daha sunucuya istek gönderip güncel veriyi indireyim ki?
Peki böyle bir işlem için Header’da sunucuya ne göndermek gerekiyor?
"Cache-Control: public, max-stale=Cache Süresi"
Örn: “Cache-Control: public, max-stale=604800” bu ne demek oluyor? İlgili end pointe gidince 604800 sn boyunca bir daha o end pointe request atma
Bu yazı için anlatacaklarım bu kadar. Daha geniş bir konu lakin sizi sıkmak istemiyorum. İnternette sürüsüne bereket kaynak bulabilirsiniz bu konular ile ilgili.
Bundan sonraki yazımızda Retrofit ile Cacheleme konusunun üstüne düşeceğiz