REST ve RESTful dedikleri şey nedir?
REpresentational State Transfer kelimelerinin baş harflerinden oluşan basitçe Temsili Durum Transferi diyebileceğimiz bir kavramdır. Peki RESTful nedir derseniz REST yapısını kullanan servislere Restful demek basit olarak en doğru açıklama olacaktır.
Peki diğer alternatiflerinden ne farkı var?
En doğru açıklama çoğu benzer sistemler SOAP ve RPC gibi kanalları kullanırken WWW’nin doğasında olan HTTP protokolünü kullanması ile daha sade, basit anlaşılır ve nispeten kolaydır. Basit olması daha az kabiliyet anlamına gelmiyor aksine oldukça esnek ve yüksek kabiliyetli bir yöntemdir.
Rest servislerinde istekler HTTP method’larını barındırarak isteğin ne için kullanılacağını karşı sunucuya iletmektedir.
PUT,DELETE,GET,POST methodları sunucuya iletildiğinde sunucu izin verilen methodlardan biri olup olmadığını kontrol eder ve buna göre bir cevap döner. Eğer izin verilen methodlar içinde değilse bize bir HTTP response kodu ile dönüş yapar ve bizde neden veri alamadığımızı kolaylıkla anlayabiliriz.
Diğer yandan başarılı bir sunucu yanıtı JSON,XML,CSV gibi bir çok farklı türde olabileceği gibi yaygın kullanım JSON yönünde olmasıdır. Bunun temel nedeni istek trafiğindeki düşük veri boyutu sağlaması ve platform bağımsız bir şekilde tüm platformlar tarafından desteklenmesidir.
Her sistemde olduğu gibi bu sistemi içerisinde de diğerleri kadar keskin kısıtlar olmasa da kısıtlar mevcut.
Kısıtlar
Clint-Server Mimarisi : Burada anlatılmak istenilen aslında Separation of Concerns prensibi. Client’ın Server tarafındaki veri kaynağı hakkında hiç birşey bilmemesi, Server’ın da doğru istekler geldiği sürece doğru yanıtı vermesi. Client ile Server’ın birbirlerinden bağımsız olması. Amaç aslında platform bağımsız çalışmayı ve scalability’i arttırmak. Ayrıca aralarında ki interface ortak kaldığı sürece birbirlerinden bağımsız bir şekilde gelişmeleri de sağlanmış oluyor.
Stateless : Server tarafında client ile ilgili bir context veya Session tutulmaz. Client tarafından yapılan her request Server’ın response verebilmesi için gerekli bilgiyi taşır, yani her türlü state client tarafında tutulur, ihtiyaç duyulursa request içerisinde server’a bildirilir. Bu Scalability açısından da önemlidir, çünkü server’ın requestler arasında herhangi bir state’i saklamasını gereksiz kılar ve kaynak yönetimini kolaylaştırır. Visibility açısından önemlidir, çünkü request’in amacını anlamak için tek bir request’in içerdiği bilgiler yeterlidir.
Tabi stateless olmasının bazı dezavantajlarıda var. Client her request’de gerekli bilgileri eklemek zorundadır bu da network trafiğini arttırır. Bu ayrıca server’ın uygulamanın davranışlarındaki tutarlığı kontrol etmesini zorlaştırır, çünkü birçok farklı client’dan farklı içerikli requestler gelebilir, server’a validasyon açısından daha fazla yük binebilir.
Cacheable : HTTP response’ları client tarafından “cache”lenebilir, o yüzden Server gönderdiği response’ların cacheable olup olmadığını belirtmek durumundadır, bu performans açısından önemlidir.
Uniform Interface : Client-Server’lar arasında ortak, tekbiçimli arayüzlerin olması REST’in en önemli prensiplerinden biridir. Bu hem iletişim yöntemini basitleştiriyor hem de ortak bir interface olması sayesinde her parçanın birbirinden bağımsız bir şekilde evrimleşmesine olanak sağlıyor. Bu konu daha önce bahsettiğim HTTP Methodları ile de alakalı.
Layered System : Burada kast edilen aslında client’ın son server’a mı yoksa bir aracı server’a mı bağlandığını bilmiyor olması, yani her katman aslında tek bir katmanı biliyor. Bu tür bir yapıya olanak sağlamasıyla birlekte, aracı serverlar load-balancing yaparak scalability arttırabiliyor ve client’ları belli security policy’lerine zorlayabiliyorlar. Bu yapı ayrıca encapsulation yapılması gereken yerlerde kullanılabiliyorlar.
Tabi böyle bir pipe-line’ın aşırı kullanımı client — server arasında gecikmelere sebep olabiliyor.
Code on Demand : Server belli durumlar’da client tarafındaki fonksiyonaliteyi arttırmak veya değiştirmek için, client tarafına executable scriptler gönderebilir. Böyle bir kullanım bazı durumlarda Visibility’i düşürdüğü için, Code on Demand tek opsiyonel kısıttır.
Eğer bir servis Code on demand kısıtı hariç diğer kısıtları içermiyorsa tam olarak RESTful servis değildir. Bu kısıtların çoğu, bugünün modern programlama ortramlarında endişe edilmesi veya uygulanması zor kısıtlar değiller. Ayrıca bu kısıtların çoğu bize yabancı gelen kavramlar değiller, çoğumuz kendi mimarilerimizde de kullanmışızdır. Bence zaten en dikkat edilmesi gereken kısıt REST’in Stateless olması. REST’in hedefledikleri aslında ; Scalability, Simplicity, Modifiability, Visibility, Portability ve Reliability. Yukarıdaki kısıtlara ne kadar uyarsanız, hedeflediklerini o kadar gerçekleştirmiş olursunuz.