GraphQL ile REST Arasındaki Fark Nedir?

GraphQL ve REST, internet üzerinden veri değişimi için API tasarlamaya yönelik iki farklı yaklaşımdır. REST, istemci uygulamalarının internetin standart iletişim protokolü olan HTTP fiillerini kullanarak bir sunucuyla veri değişimi yapmasını sağlar. Öte yandan GraphQL, bir istemci uygulamasının uzak bir sunucudan nasıl veri istemesi gerektiğine ilişkin teknik özellikleri tanımlayan bir API sorgu dilidir. İsteği tanımlamak için sunucu tarafı uygulamaya bağlı kalmadan API çağrılarınızda GraphQL'yi kullanabilirsiniz. GraphQL ve REST, modern uygulamalarımızın çoğunun arkasındaki güçlü teknolojilerdir.

REST hakkında bilgi edinin »

GraphQL uygulaması hakkında bilgi edinin »

GraphQL ile REST arasındaki benzerlikler nelerdir?

Hem GraphQL hem de REST, bir istemci-sunucu modelindeki farklı hizmetler veya uygulamalar arasında veri değişimini sağlayan popüler API mimarisi stilleridir.

API'ler, veri erişimini ve şunlar gibi veri işlemlerini kolaylaştırır:

  1. İstemci, sunucudaki bir veya birden çok uç noktaya API isteği gönderir.
  2. Sunucu; veri, veri durumu veya hata kodları içeren bir yanıt verir.

REST ve GraphQL, API aracılığıyla ayrı bir uygulama, hizmet veya modül üzerinde veri oluşturmanıza, değiştirmenize, güncellemenize ve silmenize olanak tanır. REST ile geliştirilen API'ler, RESTful API'ler veya REST API'ler olarak bilinir. GraphQL ile geliştirilenler sadece GraphQL API'leridir.

Ön uç ve arka uç ekipleri, modüler ve erişilebilir uygulamalar oluşturmak için bu API mimarilerini kullanır. API mimarisi kullanmak sistemlerin güvenli, modüler ve ölçeklenebilir kalmasına yardımcı olur. Ayrıca sistemleri daha performanslı ve diğer sistemlerle entegrasyonu daha kolay hale getirir.

Daha sonra, GraphQL ile REST arasındaki diğer benzerliklerden bahsedeceğiz.

API'ler hakkında bilgi edinin »

Mimari

Hem REST hem de GraphQL birkaç ortak API mimari prensibini uygular. Örneğin, paylaştıkları ilkeler şunlardır:

  • Her ikisi de durum bilgisizdir, bu nedenle sunucu, istekler arasında yanıt geçmişini kaydetmez.
  • Her ikisi de istemci-sunucu modeli kullanır. Bu nedenle, tek bir istemciden gelen istekler tek bir sunucudan gelen yanıtlarla sonuçlanır.
  • HTTP, altta yatan iletişim protokolü olduğundan her ikisi de HTTP tabanlıdır.

Kaynak tabanlı tasarım

REST ve GraphQL, veri değişimlerini kaynaklar etrafında tasarlar. Kaynak, istemcinin API aracılığıyla erişebileceği ve değiştirebileceği herhangi bir veri veya nesneyi ifade eder. Her kaynağın kendine özgü tanımlayıcısı (URI) ve istemcinin üzerinde gerçekleştirebileceği bir dizi işlem (HTTP yöntemi) vardır.

Örneğin, kullanıcıların gönderi oluşturduğu ve yönettiği bir sosyal medya API'sini düşünün. Kaynak tabanlı bir API'de, bir gönderi bir kaynak olacaktır. Kendi benzersiz tanımlayıcısı vardır, örneğin /posts/1234. Ve gönderiyi REST'te almak için GET veya GraphQL'de almak için query gibi bir dizi işleme sahiptir.

Veri değişimi

Hem REST hem de GraphQL benzer veri biçimlerini destekler.

JSON, tüm dillerin, platformların ve sistemlerin anladığı en popüler veri değişimi biçimidir. Sunucu, JSON verilerini istemciye döndürür. Diğer veri biçimleri mevcuttur ancak XML ve HTML dahil olmak üzere daha az yaygın olarak kullanılır.

Benzer şekilde, hem REST hem de GraphQL, önbelleğe almayı destekler. Böylece, istemciler ve sunucular iletişim hızını artırmak için sık erişilen verileri önbelleğe alabilir.

JSON hakkında bilgi edinin »

Dil ve veritabanı tarafsızlığı

Hem GraphQL hem de REST API'ler, istemci tarafı ve sunucu tarafı olması fark etmeksizin herhangi bir veritabanı yapısı ve programlama dili ile çalışır. Bu, onları herhangi bir uygulama ile son derece birlikte çalışabilir hale getirir.

GraphQL hangi REST sınırlamalarını aşmaya çalışır?

GraphQL, gelişmekte olan sosyal medya platformlarındaki hız ihtiyacına cevap olarak 2012 yılında ortaya çıktı. Geliştiriciler, REST gibi mevcut API mimarilerinin çok uzun olduğunu ve haber akışlarını verimli bir şekilde üretmek için yapılandırıldığını keşfetti.

Daha sonra, karşılaştıkları bazı zorluklardan bahsedeceğiz.

Sabit yapılı veri değişimi

REST API, bir kaynak almak için istemci isteklerinin sabit bir yapıya uymasını gerektirir. Bu sert yapının kullanımı kolaydır ancak tam olarak ihtiyaç duyulan verileri alıp vermek için her zaman en etkili araç değildir.

Aşırı getirme ve yetersiz getirme

REST API'ler her zaman bir veri kümesinin tamamını döndürür. Örneğin, REST API'deki bir kişi nesnesinden kişinin adını, doğum tarihini, adresini ve telefon numarasını alırsınız. Yalnızca bir telefon numarasına ihtiyacınız olsa bile tüm bu verileri alırsınız.

Benzer şekilde, bir kişinin telefon numarasını ve son satın alımını öğrenmek istiyorsanız birden fazla REST API isteğine ihtiyacınız olacaktır. /person URL'si telefon numarasını ve /purchase URL'si satın alma geçmişini döndürür.

Sosyal medya geliştiricileri, sadece API isteklerini işlemek için çok fazla kod yazmak zorunda kaldı. Bu da performansı ve kullanıcı deneyimini etkiledi.

GraphQL, sorgu tabanlı bir çözüm olarak ortaya çıktı. Sorgular, tam olarak istenen verileri yalnızca bir API isteği ve yanıt değişiminde döndürebilir.

Temel farklılıklar: GraphQL ve REST

REST API, uygulama iletişimine ilişkin bir mimari kavramıdır. Öte yandan GraphQL bir spesifikasyon, bir API sorgu dili ve bir araç setidir. GraphQL, HTTP kullanarak tek bir uç nokta üzerinden çalışır.

Ek olarak, REST geliştirme daha çok yeni API'ler oluşturmaya odaklanmıştır. Bu arada, GraphQL'nin odağı API performansı ve esnekliği olmuştur.

Daha sonra, diğer farklılıklardan da bahsedeceğiz.

İstemci tarafı isteği

Bir REST isteğinin çalışmak için kullandığı şeyler şunlardır: 

  • Eylemi belirleyen HTTP fiilleri
  • HTTP fiilinin eyleme geçirileceği kaynağı tanımlayan bir URL
  • Var olan bir sunucu tarafı kaynak içinde bir nesne oluşturmak veya değiştirmek istiyorsanız ayrıştırılacak parametre ve değerler

Örneğin, bir kaynaktan salt okunur veri almak için GET, yeni bir kaynak girdisi eklemek için POST veya bir kaynağı güncellemek için PUT kullanırsınız.

Buna karşılık, GraphQL istekleri şunları kullanır:

  • Salt okunur veri alma sorgusu
  • Verileri değiştirmek için mutasyon
  • Etkinlik tabanlı veri veya akış verisi güncellemeleri almak için abonelik

Veri biçimi, sunucu tarafı şemasına uyan nesneler ve alanlar dahil sunucunun verileri nasıl döndürmesini istediğinizi açıklar. Ayrıca yeni veriler de girebilirsiniz. Dahili olarak, GraphQL her istemci isteğini bir POST HTTP isteği olarak gönderir.

Müşteriye döndürülen veriler

REST mimarisi altında, sunucu tarafından belirtilen tüm kaynak yapısında sunucudan istemciye veri döndürülür. Aşağıdaki örnekler REST ve GraphQL'de döndürülen verileri gösterir.

REST'te döndürülen veri örneği

REST'te, GET/posts aşağıdakileri döndürür:

[

  {

    "id": 1,

    "title": "İlk Gönderi",

    "content": "Bu, ilk gönderinin içeriğidir."

  },

  {

    "id": 2,

    "title": "İkinci Gönderi",

    "content": "Bu, ikinci gönderinin içeriğidir."

  },

  {

    "id": 3,

    "title": "Üçüncü Gönderi",

    "content": "Bu, üçüncü gönderinin içeriğidir."

  }

]

GraphQL'de döndürülen veri örneği

GraphQL kullandığınızda, yalnızca istemci tarafından verilen yapıda belirtilen veriler döndürülür.

GET /graphql?query{post(id: 1) {id title content}} yalnızca birinci gönderileri döndürür:

{

  "data": {

    "posts": [

      {

        "id": "1",

        "title": "İlk Gönderi",

        "content": "Bu, ilk gönderinin içeriğidir."

      },

]}}

Sunucu tarafı şeması

GraphQL, verileri ve veri hizmetlerini tanımlamak için REST API'den farklı olan bir sunucu tarafı şeması kullanır.

GraphQL şema tanım dilinde yazılmış şema, aşağıdaki gibi ayrıntıları içerir:

  • Nesne türleri ve her bir nesneye ait alanlar
  • Her alan için bir işlem tanımlayan sunucu tarafı çözümleyici işlevleri

Şema, sistemde mevcut olan tüm verileri ve istemcilerin bu verilere nasıl erişebileceği veya bunları değiştirebileceğini açıklamak için türleri açıkça tanımlar. 

Öte yandan, REST API'ler sunucu tarafı şeması gerektirmez. Ancak verimli API tasarımı, belgeleme ve istemci geliştirme süreci için bunu isteğe bağlı olarak tanımlayabilirsiniz. 

Sürüm Oluşturma

API'ler geliştikçe, veri yapıları ve işlemleri de değişebilir. Bu değişiklikler konusunda bilgisi olmayan istemcilerde, bu durum istemci sistemini bozabilir veya bilinmeyen hatalar getirebilir.

REST API'ler genellikle bu sorunu çözmek için URL'de https://example.com/api/v1/person/12341 gibi sürüm oluşturma bilgileri içerir. Ancak, sürüm oluşturma zorunlu değildir ve hatalara yol açabilir. 

GraphQL, geriye dönük API uyumluluğu gerektirir. Böylece silinen alanlar bir hata iletisi döndürür. Kullanımdan kaldırılmış etiketi olanlar ise bir uyarı döndürür.

Hata işleme

GraphQL, güçlü bir şekilde belirtilmiş bir API mimarisidir. Bu, verilerin ayrıntılı bir açıklamasını, yapısını ve şemadaki veri işlemlerini gerektirdiği anlamına gelir. Şemadaki ayrıntı seviyesi nedeniyle sistem, istek hatalarını otomatik olarak tanımlayabilir ve faydalı hata iletileri sağlayabilir. 

REST API'ler zayıf bir şekilde belirtilmiştir ve çevreleyen koda hata işleme özelliği eklemeniz gerekir. Örneğin, bir PUT isteği bir sayı değerini tam sayı yerine metin olarak ayrıştırırsa sistem hatayı otomatik olarak tanımlamaz.

Kullanım zamanı: GraphQL ve REST

GraphQL ve REST API'leri birbirinin yerine kullanabilirsiniz. Bununla birlikte, birinin diğerinden daha uygun olduğu bazı kullanım örnekleri de vardır.

Örneğin, şu koşullara sahipseniz GraphQL muhtemelen daha iyi bir seçimdir:

  • Bant genişliğiniz sınırlıysa ve hem istek hem de yanıt sayısını en aza indirmek istiyorsanız
  • Birden fazla veri kaynağınız varsa ve bunları tek bir uç noktada birleştirmek istiyorsanız
  • Önemli ölçüde değişen müşteri istekleriniz varsa ve çok farklı yanıtlar bekliyorsanız

 

Öte yandan, şu koşullara sahipseniz REST muhtemelen daha iyi bir seçimdir:

  • Daha az karmaşık veriye sahip daha küçük uygulamalarınız varsa
  • Tüm istemcilerin benzer şekilde kullandığı veri ve işlemleriniz varsa
  • Karmaşık veri sorgulama için herhangi bir gereksiniminiz yoksa

 

Farklı işlevsellik alanları için hem GraphQL API'ler hem de REST API'ler ile tek bir uygulama oluşturmak da mümkündür.

GraphQL ve REST aynı API üzerinde nasıl kullanılır?

RESTful API'yi GraphQL API'ye yükseltmek, tam bir yeniden yazma gerçekleştirmeden mümkündür.

Sürecin ana hatlarını burada bulabilirsiniz:

  1. RESTful API'nin veri modelini anlayın. Bunun için her bir URL kaynağındaki verilerin şeklini inceleyin.
  2. GraphQL şemasını veri modelinden yazın.
  3. İstemcilerin veriler üzerinde hangi işlemleri gerçekleştirdiğini belirleyin ve bunları şemaya dahil edin.
  4. Şemadaki her alan için sunucu tarafı kodunda bir çözümleyici işlevi oluşturun.
  5. Çözümleyiciler ve şema ile bir GraphQL sunucusu oluşturun.

Bu adımdan sonra, istemciler GraphQL veya REST kullanarak API'nizle iletişim kurabilir.

GraphQL çözümleyicileri nasıl oluşturacağınızı öğrenin »

Farklılıkların özeti: REST ve GraphQL

 

REST

GraphQL

Bu nedir?

REST, istemci ile sunucu arasında yapılandırılmış veri değişimini tanımlayan bir dizi kuraldır.

GraphQL; bir sorgu dili, mimari stil ve API'leri oluşturup işlemeye yönelik araçlar kümesidir.

En uygun olduğu alanlar:

REST, kaynakların iyi tanımlandığı basit veri kaynakları için yararlıdır.

GraphQL; büyük, karmaşık ve birbiriyle ilişkili veri kaynakları için kullanışlıdır.

Veri erişimi

REST, kaynakları tanımlamak için URL biçiminde birden fazla uç noktaya sahiptir.

GraphQL tek bir URL uç noktasına sahiptir.

Döndürülen veri

REST, verileri sunucu tarafından tanımlanan sabit bir yapıda döndürür.

GraphQL, verileri istemci tarafından tanımlanan esnek bir yapıda döndürür.

Veriler nasıl yapılandırılır ve tanımlanır?

REST verileri zayıf bir şekilde belirtilmiştir. Bu nedenle istemci, biçimlendirilmiş veriler döndürüldüğünde bunların nasıl yorumlanacağına karar vermelidir.

GraphQL verileri güçlü bir şekilde belirtilmiştir. Yani istemci, verileri önceden belirlenmiş ve karşılıklı olarak anlaşılan biçimlerde alır.

Hata denetimi

REST'te istemci, döndürülen verilerin geçerli olup olmadığını kontrol etmelidir.

GraphQL'de, geçersiz istekler genellikle şema yapısı tarafından reddedilir. Bu, otomatik olarak oluşturulmuş bir hata iletisiyle sonuçlanır.

AWS, GraphQL ve REST gereksinimlerinizi nasıl destekleyebilir?

Amazon Web Services (AWS), daha iyi yönetilen API'ler oluşturmanıza ve sunmanıza yardımcı olur.

AWS AppSync, sunucusuz GraphQL ve yayınla-abone ol (pub/sub) API'leri oluşturur. Verileri güvenli bir şekilde sorgulamak, güncellemek ve yayınlamak için tek bir uç nokta üzerinden uygulama geliştirmeyi basitleştirir.

AWS AppSync ile istemcilerin aşağıdakileri yapmasına olanak tanıyan API'ler oluşturursunuz:

  • Tek bir ağ çağrısıyla SQL, NoSQL, arama verileri, REST uç noktaları ve mikro hizmetler gibi birden çok veri kaynağıyla etkileşim kurma
  • Mobil ve web uygulamaları ile bulut arasında verileri otomatik olarak eşitleme
  • Arka uçtan bağlı istemcilere ve bağlı istemciler arasında veri yayınlama
  • Mobil veya web uygulamasında gerçek zamanlı panolar oluşturmak için Nesnelerin İnterneti (IoT) verilerine erişme

Benzer şekilde Amazon API Ağ Geçidi, istenen ölçekte API'ler oluşturulup yayınlanmasını, bunların izlenmesini, bakımın yapılmasını ve güvenliğinin sağlanmasını mümkün kılan, tam olarak yönetilen bir hizmettir.

API Ağ Geçidi kullanarak yararlanabileceğiniz yollardan bazıları şunlardır:

  • Kullanıcılara hem API istekleri hem de yanıtları için yüksek hızlı performans sunma
  • API'lerinize erişimi yetkilendirme
  • Yeni sürümleri hızla yinelemek, test etmek ve yayınlamak için aynı API'nin birden çok sürümünü eş zamanlı bir biçimde çalıştırma
  • API çağrıları, veri gecikmesi ve hata oranlarına ilişkin performans ölçümlerini ve bilgileri izleme

Hemen bir hesap oluşturarak AWS'de GraphQL ve REST'i kullanmaya başlayın.

AWS İçin Sonraki Adımlar

GraphQL ile oluşturmaya başlayın

AWS'de GraphQL'yi nasıl kullanmaya başlayacağınızı öğrenin

Daha fazla bilgi edinin 
REST ile oluşturmaya başlayın

AWS'de REST'i nasıl kullanmaya başlayacağınızı öğrenin

Daha fazla bilgi edinin