Herhangi bir modern platform için kod yazdıysanız, kesinlikle bir web API ile etkileşime girmişsinizdir. Çoğu zaman bu API muhtemelen REST’tir. Uzun süredir programlama yapıyorsanız veya biraz daha eski bir sistem kullandıysanız, bu API SOAP bile olabilir. Ancak son zamanlarda GraphQL hakkında da oldukça fazla konuşulmaktadır.
Peki GraphQL ve REST API nedir ve bu iki API türü arasındaki farklar nelerdir?
REST Nedir?
REST, “Representational State Transfer” anlamına gelir. Bir API’nin nasıl görüneceğini belirleyen bir dizi kuraldır. Bu kurallardan biri, belirli bir URL’ye bağlandığınızda bir kaynak (bir veri parçası) almanız gerektiğini belirtir.
URL’ye istek, geri gönderilen veriye de yanıt denir.
Bir RESTful API’yi çağırdığınızda, sunucu kaynağın durumunun temsilini istemciye aktarır.
Örneğin, belirli bir kullanıcıyı almak için Facebook Profil API’sini çağırırsanız REST, ad, profil resmi, son gönderiler ve daha fazlası dahil olmak üzere bu kullanıcının durumunu aktarır.
REST’te bir işlem gerçekleştirmek için bu işlemi GET, POST, PUT veya DELETE gibi bir HTTP isteği şeklinde çağırmanız gerekir. Örneğin, belirli bir kullanıcının Facebook profilini almak için o kullanıcıyı tanımlayan URL’ye ve HTTP yöntemi GET’e ihtiyacınız olacaktır.
REST API’lerinin ana fikirleri aşağıdakileri içerir:
- İstekler arasında sunucu tarafından geçici durum tutulmaz (dolayısıyla durum aktarımı).
- Uç noktalar açıktır.
- HEAD, GET, POST, PUT, DELETE ve PATCH gibi HTTP “fiilleri” verilere ne olduğunu açıklar.
REST Kaynakları
REST, temel olarak API’deki herhangi bir varlık anlamına gelen bir “kaynak” kavramına sahiptir. Genel olarak, bir kaynak için bir uç noktası vardır.
Örneğin GitHub’ın REST API’sini ele alalım:
Bir kullanıcı bir “kaynaktır”. Bu kaynakla https://api.github.com/users/{username} adresine bir GET isteği göndererek etkileşime geçebiliriz. {username} yerine ilgilendiğimiz kullanıcının gerçek kullanıcı adını yazmanız gerekir. Bu bir kullanıcının bilgilerini almanın başka bir yolu yoktur.
Benzer şekilde, bir depo da bir “kaynaktır”. Belirli bir depo hakkında bilgi almak için https://api.github.com/repos/{owner}/{repo} adresine bir GET isteği göndererek {owner} ve {repo} değerlerini ilgili değerlerle değiştirebilirsiniz.
REST API Tarihi
REST’ten önce, SOAP (Simple Object Access Protocol) şirketlerin büyük bir kısmı tarafından API’ler oluşturmak için kullanılıyordu. Her ikisinin de arkasındaki motivasyon benzerdi: platformlar arasında kolay veri alışverişi sağlamak. Fakat REST çeşitli veri formatlarına izin verirken, SOAP yalnızca XML ile çalışır.
Burada dikkat edilmesi gereken önemli bir nokta, SOAP’ın bir protokol, REST’in ise bir mimari model olduğudur. “REST API” dediğimizde, aslında REST mimarisini takip eden web hizmetleri için doğru terim olan “RESTful API” demek istiyoruz.
2000’li yılların başında Roy Fielding liderliğindeki bir grup, veri alışverişi için daha iyi bir yapı elde etmek amacıyla REST mimarisini oluşturdu. REST API’leri, daha yüksek uyumlulukları, durumsuz mimarileri ve daha iyi önbellekleme mekanizmaları nedeniyle SOAP API’lerine karşı etkili bir şekilde kazandı.
REST’in Avantajları
- Her şey URL’de: URL’yi okumak size ne yaptığınız hakkında bilgi verir.
- Standart tabanlıdır: Standart HTTP yöntemlerine ve durum kodlarına dayanır.
- Önbelleğe alma: HTTP önbelleğe alma konusunda onlarca yıldır yapılan çalışmalara dayanır.
REST’in Dezavantajları
- Aşırı veya yetersiz veri getirme: İstemciler ihtiyaç duyduklarından daha fazla veri alabilir (aşırı getirme) veya gerekli tüm verileri almak için birden fazla istekte bulunmaları gerekebilir (yetersiz getirme).
- Sürüm oluşturma: API geliştiğinde, geriye dönük uyumluluğu korumak için versiyonlama gerektirebilir (dolayısıyla URL’lerde gördüğünüz /v1/).
GraphQL Nedir?
Yeni başlayanlar için, RESTful API’ler ihtiyaç duyulandan daha fazla veri döndürüyordu, bu da daha fazla API çağrısı anlamına geliyordu. Her uç nokta yalnızca belirtilen verileri döndürebildiğinden, geliştiriciler uç noktaları ön uç görünümlerini akılda tutarak tasarlamak zorundaydı.
Tüm bunlar daha az esneklikle sonuçlandı ve Facebook mühendisleri REST’e bir alternatif oluşturmaya karar verdi. GraphQL, 2012 yılında Facebook tarafından oluşturuldu ve 2015 yılında açık kaynak haline getirildi.
GraphQL, bir sunucu ile nasıl iletişim kurabileceğinizi ve bir istemciden bir sunucuya nasıl veri aktarabileceğinizi açıklar. GraphQL, istemcinin hangi verilere ihtiyaç duyduğunu özellikle sorabilmesi nedeniyle REST’ten temel olarak farklıdır.
GraphQL, birden fazla kaynaktan veri almayı ve toplamayı kolaylaştırır. Birden fazla uç nokta yerine, karmaşık sorguları toplayabilen ve çıktıyı istemcinin istediği formatta sunabilen “akıllı” bir uç noktanız vardı.
Örneğin, kafenizden yemek sipariş etmeniz, marketten alışveriş yapmanız ve bir kütüphaneden kitap ödünç almanız gerektiğini düşünün. REST ile, üç istek olan üç farklı telefon görüşmesi yaparsınız.
GraphQL ile bu üç telefon görüşmesi, Siri ile konuşmak gibi tek bir görüşme ile değiştirilebilir. Tek yapmanız gereken bu yerlerin adresini söylemek ve ardından siparişinizi vermek.
GraphQL Tarihi
Başlangıçta şirket, Facebook uygulamasını geliştirirken büyük ölçüde web teknolojilerinden yararlanmıştı. Ancak, şirket nihayet yerel bir mobil uygulama oluşturmaya karar verdiğinde, normal API’ler uygulamanın bazı yönlerini oluşturmak için verimli bir yol sağlayamadı. Örnek olarak, gönderinin kendisi, beğenen, yorum yapan, paylaşan kişiler ve çok daha fazlası gibi çeşitli verileri alan haber akışı deneyiminin optimizasyona ihtiyacı vardı. Gönderiler birbirine bağlı olduğundan, basit bir hiyerarşik veri yapısıyla çalışmak zordu; bu nedenle verileri yapılandırmak ve sorgulamak için yeni bir yol oluşturmaları gerekiyordu. GraphQL ilk olarak Facebook’ta Lee Byron tarafından geliştirildi ve 2015 yılında halka açıldı. Şu anda Linux vakfı tarafından barındırılmaktadır.
GraphQL’in Avantajları
- Esneklik: İstemciler tam olarak ihtiyaç duydukları verileri talep edebilirler, bu da aşırı ve yetersiz veri alma sorunlarını azaltır.
- Tek istek: İhtiyacınız olan tek şey tek bir GraphQL sorgusudur.
- Evrimleşme: Sunucu şemasında yapılan değişikliklerin istemcilerin güncellenmesini gerektirmesi gerekmez.
GraphQL’in Dezavantajları
- Karmaşıklık: Bir GraphQL sunucusunu uygulamak, özellikle karmaşık veri modelleriyle uğraşırken bir REST API’den daha karmaşık olabilir.
- Önbelleğe alma: İstekler daha spesifik ve dolayısıyla daha benzersiz olduğundan, GraphQL’de önbelleğe almanın uygulanması daha zordur.
GraphQL veya REST Ne Zaman Kullanılır?
Her bir yaklaşıma en iyi uyan bazı kullanım durumları aşağıdaki şekildedir:
GraphQL
- GraphQL, iç içe geçmiş verilerle kullanıldığında en iyi uyumu sağlar. GraphQL, verilen her gönderi ile ilişkili yorumları getirirken en iyi şekilde çalışır. Bu da onu, örneğin New York Times gibi kurumsal veri kaynaklarıyla birlikte kullanıldığında en iyi hale getirir.
- Aşırı getirmeyi kontrol etme yeteneği nedeniyle GraphQL, mobil cihazlar ve akıllı saatler gibi sınırlı bant genişliğine sahip olduğunuz durumlarda harikadır.
- GraphQL en çok mikro hizmetleri işlemek için kullanıldığında parlar. GraphQL, mikro hizmet mimarisi gerektiren farklı kaynaklardan veri tüketirken ve getirirken iyi çalışır.
- Yanıt esnekliği nedeniyle GraphQL, API’nin istemci tarafından ne zaman kullanılacağını tahmin edemeyen verilerle çalışırken iyi bir seçimdir. Bu, API’nizi herkese açık hale getirmek istediğinizde de geçerlidir. Bir istemci, tahmin edebileceğiniz farklı kaynakları getirdiğiniz API’yi kullanabilir.
REST
- Yalnızca bir istemciye hizmet vermeyi amaçlayan basit bir API oluştururken ve bant genişliği performansları veya veri almak için birden fazla tur hakkında endişelenmeniz gerekmiyorsa, REST iyi bir seçimdir.
- REST, istemciden gelen işlemi önceden belirleyen farklı HTTP yöntemlerine sahip olduğundan, belirli bir istemcinin gerçekleştirebileceği işlemlere dayalı olarak belirli bir istemcinin erişebileceği uç noktaları kontrol etmek için kullanabilirsiniz.
- İyi tasarlanmış bir API kullanım durumuna ihtiyacınız varsa, REST iyi bir seçimdir. Verileri farklı HTTP yöntemlerine göre kısıtlamanıza izin verir.
- REST, uygulamayı istemci için öngörülebilir kılan HTTP yöntemini kullanır. REST en çok belirli bir veri yapısına sahip olduğunuzda parlar.
- İstekleri önbelleğe almak istiyorsanız, REST harika çalışır. REST, önbelleğe almayı sorunsuz hale getiren farklı uç noktalar kullanır. GraphQL, tek bir uç nokta ve özel bir istek kullanır ve bu, kutudan çıkar çıkmaz önbellekleme teknolojilerini uygulamak için zor olabilir
- GraphQL yalnızca JSON formatını kullanarak verileri açığa çıkarır. Verilerinizi XML ve HTML gibi diğer yöntemleri kullanarak göstermeniz gerekiyorsa REST tam olarak bunu yapmak için harikadır.
GraphQL ve REST Arasındaki Benzerlikler
GraphQL ve REST temelde aynı görevi yerine getirir: bir sunucu ile iletişim kurmak ve veri almak. Fakat ikisi arasındaki birkaç benzerlik vardır.
- Hem GraphQL hem de REST bir kaynak kavramına dayanır ve bu kaynaklar için kimlikler belirtir.
- Hem GraphQL hem de REST, küçük ağ ayrıntılarını işlemek için çerçevelere ve kütüphanelere güvenir.
- Her ikisi de bir API isteğinin veri okumaya mı yoksa yazmaya mı yönelik olduğunu ayırt edebilir.
- REST API’deki uç noktalar, GraphQL’deki sorgu ve mutasyon türlerindeki alanların listesine benzer.
1. Kullanılabilirlik
Çoğu REST API’sinin diğerlerinden biraz farklı uygulanabileceğini bilmek önemlidir ve bu genel bir karşılaştırma olsa da, bazı REST API’leri diğerlerinden daha yüksek kullanılabilirliğe sahip olabilir. REST bir mimari olduğundan, bazı iyi uygulanmış API’lerin yanı sıra uygun uç noktaları belirtmeyen veya versiyonlamayı kötü uygulayan daha dağınık API’ler de olabilir.
Veri açısından, GraphQL geliştiriciye yalnızca belirttiklerini verir ve daha fazlasını vermezken, REST, uç noktadan istenen yapılandırılmış verilerde mevcutsa, hemen hemen her şeyi verir. Verilerin tamamını almak için genellikle birden fazla çağrı gerekmediğinden, bu durum GraphQL ile istemci tarafında çalışmayı kolaylaştırsa da, bunun önemli bir dezavantajı, veri talep ederken istemcide daha fazla spesifikasyonun gerekli olması ve gerekli tüm sorguları işlemek için API tarafında daha fazla kurulum gerekmesidir. Bu aynı zamanda, API’nin kendisi için mümkün olan sorguları, mutasyonları ve potansiyel bir sorgudan talep edilebilecek verileri belirtmek için arka uçta bazı ekstra adımlar gerektirir. Ayrıca, istemci tarafında, her sorgu için gerekli alanları belirtmek için ekstra çalışma vardır.
Kullanılabilirlik açısından başka endişeler de vardır: Çoğu RESTful API sağlayıcısı, sahip oldukları her uç nokta için hız sınırları sağlar ve bu da hiçbir API uç noktasının çok sık çağrılmamasını garanti eder. Ayrıca uygun bir şekilde ücretlendirebilir veya geliştiricinin istediğini almasını kolaylaştıran belirli planlar sağlayabilirler. GraphQL istemci tarafında genel sorgulara sahip olduğundan, bu durum arka uçta çözülür ve hız sınırlarının uygulanması zorlaşır.
İstemci genel olarak ayrılmış verilere ihtiyaç duyuyorsa (bir kitap listesi, bir nesnenin ayrıntılı görünümü, vb.), REST oldukça iyi sonuç verir ve uygulanması çok daha kolaydır. Veriler makul boyutlarda olduğunda, büyük kümeler için sayfalandırma uygulandığında ve veri almak için birden fazla çağrı gerekmediğinde, REST yaklaşımını benimsemek bir şirket için geliştirme sürecinde zaman ve para tasarrufu sağlayabilir.
İstemci tarafı uygulaması, çok sayıda REST çağrısı gerektirebilecek birbirine bağlı birkaç öğe içeriyorsa, GraphQL muhtemelen iyi bir seçenek olacaktır ve zaman içinde daha verimli olacağından uygulamaya zaman ayırmaya değerdir.
2. Performans
REST’in mi yoksa GraphQL’in mi daha iyi performans verdiğine karar vermeyi sağlayan ana faktörler, getirilen veri türleri ve bunların ne sıklıkta getirilmesi gerektiğidir.
GraphQL yalnızca gerekli verileri sağladığından (muhtemelen birden fazla veri türünden getirme), daha az veri sağlayabilir ve yalnızca gerekli verileri sağlaması gerektiğinden çağrıyı tamamlamak daha az zaman alabilir.
Öte yandan REST, API çağrılarının doğası gereği daha yavaş olması nedeniyle değil, istemci tarafında bir işlemi tam olarak tamamlamak ve kullanıcının ne talep ettiğine bakılmaksızın tüm veri setini sağlamak için birden fazla çağrının yürütülmesi gerekebileceğinden daha fazla zaman alabilir. İki farklı nesne türünün getirilmesi gerekiyorsa, iki farklı REST çağrısı söz konusu olacak ve bu da getirme sürelerinin artmasına neden olacaktır.
Ancak REST’in üstünlük sağladığı nokta, tekrarlanan çağrıların talep edildiği durumlardır. API çağrılarını hızlandırmak için HTTP önbellekleme mekanizmalarını kullanabilir ve ekstra işlem gerekmez. Bu, GraphQL’in aksine tüm GraphQL sorguları ana GraphQL uç noktasına POST sorguları olduğundan, bunu yapmak için potansiyel olarak daha fazla araca ihtiyaç duyabilir.
3. Güvenlik
REST API’leri işlemleri farklı uç noktalara böler ve tüm çağrılar tek bir düğüm üzerinden çalışmaz. Bu, Distributed Denial of Service (DDoS) saldırılarını tespit etmeyi ve kapatmayı kolaylaştırır. GraphQL, etkili bir şekilde tek bir uç noktadan geçen genel sorgular kullandığından, bunu yapmak daha zordur.
Kotalar ve hız limitleri gibi sınırlayıcı mekanizmalar, aşırı kullanımı önlemek ve daha da önemlisi, kötü niyetli bir saldırı durumunda meydana gelebilecek hiçbir şeyin üstesinden gelinmediğinden emin olmak için API’ye yapılan çağrıların sıklığını sınırlamak için kullanılır. REST, hız sınırlarının nispeten kolay bir şekilde uygulanmasına ve talep edilebilecek veri türlerinin kolayca tanımlanmasına olanak tanır. Bu aynı zamanda API uç noktaları için API sağlayıcısı tarafından bir plana veya API’nin kendisindeki trafik koşullarına göre denetlenebilen bireysel hız sınırlarına da izin verir.
Kimlik doğrulama mekanizmalarının REST üzerinde uygulanması genellikle GraphQL üzerinde uygulanmasından daha basittir. GraphQL kullanıcıları, bir API’nin çalışması için oldukça kritik olan REST’e kıyasla yetkilendirme ile ilgili ek işler yapmak zorunda kalabilir. Bu muhtemelen zaman içinde değişir. Ancak şimdilik REST, kimlik doğrulamasını ele almak için daha olgun bir çerçevedir.
REST Hangi Noktalarda Üstünlüğünü Korur?
GraphQL’in tüm faydalarını belirtmiş olsak da, REST kullanmanın da bahsetmeyi hak eden birkaç faydası vardır.
Bu avantajlar şunları içerir:
1. GraphQL’de kod kırılganlığı
GraphQL, sunucudan tam olarak istediğiniz verileri almanızı sağlar, bu da zor bir güvenlik sorununa yol açar. Eğer bir saldırgan korumasız bir sunucuya DDoS (Denial-of-service-attack) yapmak isterse, tek yapması gereken sunucunuzu aşırı yüklemek için pahalı bir iç içe sorgu çalıştırmaktır. Veri almak için ayrı HTTP çağrıları kullandığınız REST’te durum böyle değildir.
2. Hata raporlama
REST ile API yanıtlarını kullanabilir ve hata mesajları için bir izleme sistemi oluşturabilirsiniz. Ancak GraphQL’de hata raporlaması, her yerde bulunan “200 K Error – Something went wrong” mesajı ile arzulanan çok şey bırakır.
3. HTTP önbellekleme sorunu
HTTP önbellekleri, modern tarayıcılar tarafından kaynakları tanımlamak ve iki kaynağın aynı olmadığından emin olmak ve yeniden almayı önlemek için kullanılır. GraphQL ile evrensel bir tanımlayıcı kullanmanın bir yolu yoktur çünkü tüm istekler için aynı URL kullanılır. GraphQL’de kendi önbelleğinizi kurmanız gerekir ki bu da oldukça yorucudur.