GraphQL vs REST: Bilmeniz Gereken Her Şey
Yayınlanan: 2022-09-20Bir sonraki projenizin teknoloji yığınına dahil edilecek teknolojileri seçmek zor olabilir. Çoğu durumda - ve özellikle de GraphQL ve RESTful API'leri arasında seçim yapmak söz konusu olduğunda - her şey bir sonraki en iyi API tasarım mimarisini seçmekle ilgilidir.
API oluşturmanın dört önemli yolu vardır: SOAP, GRPC, REST ve GraphQL. API'ler oluşturmak istediğimizde aklımızı genellikle REST ve GraphQL ile daraltırız. Bunun nedeni, REST'in SOAP ve GRPC ile API oluşturmanın geleneksel yollarını değiştirmesidir.
GraphQL, API oluşturmanın daha iyi bir yolunu temsil ettiğinden, yaygın olarak daha iyi REST olarak etiketlenir. Birçok geliştirici GraphQL'nin REST'in yerini alacağına inanıyor. Pek çoğu, GraphQL'nin geliştiricilerin REST API'leri oluştururken karşılaştıkları bazı genel zorlukların çözülmesine yardımcı olduğunu keşfetti.
API oluşturmanın bu iki yöntemi tamamen farklıdır. Uygulamada, bu teknolojiler bir HTTP isteği göndererek ve sonucu alarak çalışır. Her ikisinin de artıları ve eksileri var ve bu makalede, API'leri geliştirme ve ölçekleme şeklimizi değiştiren bu iki harika teknolojiyi kapsamlı bir şekilde tartışacağız.
Ayrıntılara dalmadan önce, önce GraphQL ve RESTful API'lerinin anlamını keşfedelim.
GraphQL Nedir?
GraphQL, bir API sorgu dili ve bu sorguları mevcut verilerle yanıtlamak için bir çalışma zamanıdır. Ayrıca, en karmaşık sorguları bile işlemek için güçlü araçlarla donatılmıştır.
GraphQL'nin temel özelliği, yalnızca istenen belirli verileri talep etme ve alma yeteneğidir - başka bir şey değil. Bu, uygulamanızla birlikte API'lerinizi ölçeklendirmeyi çok daha basit hale getirir.
GraphQL'nin en heyecan verici yanı, size tüm verileri tek bir uç noktada sağlama yeteneğidir.
Yukarıdaki diyagram, GraphQL mimarisinin tipik bir temsilidir. İstemciler farklı cihazlardan istekte bulunur ve GraphQL onların isteklerini ele alır ve yalnızca talep edilen verileri döndürür. Bu, RESTful API'lerinde aşırı getirme ve eksik getirme sorununu düzgün bir şekilde çözer.
Yukarıdaki örnekte, bir GraphQL oyun alanını ve tek bir uç nokta ile verileri nasıl sorgulayabileceğinizi gösteriyoruz. En üstte API uç noktası, solda kıta adlarını isteyen sorgu ve son olarak sağda istediğimiz sorguya yanıt veriyoruz.
GraphQL, Facebook tarafından, mobil uygulama geliştiricilerinin REST API'leri ile çalışırken yaşadığı deneyimi çözmek amacıyla oluşturuldu. İlk açık kaynak sürümünün 2015 yılında piyasaya sürülmesinden bu yana GraphQL, teknolojinin teknoloji sektöründeki büyük oyuncular tarafından benimsenmesi nedeniyle muazzam bir büyüme yaşadı.
GraphQL Kullanan Şirketler
Aşağıda sunucularında aktif olarak GraphQL kullanan bazı şirket ve uygulamaların bir listesi bulunmaktadır.
Facebook, GraphQL'i yarattı ve 2012'den beri mobil uygulamalarına güç sağlamak için üretimde kullandılar. Milyar dolarlık sosyal ağ şirketi, 2015 yılında GraphQL spesifikasyonunu açık kaynaklı hale getirerek birçok ortamda ve her büyüklükteki ekip tarafından erişilebilir olmasını sağladı. .
GitHub
GitHub ayrıca GitHub GraphQL API'sini kullanarak entegrasyonlar oluşturmak, veri almak ve iş akışlarınızı otomatikleştirmek için bir GraphQL API'si sağlayarak GraphQL kullanımını duyurur. GitHub GraphQL API, GitHub REST API'sinden daha kesin ve esnek sorgular sunar.
Pinterest aynı zamanda GraphQL'nin ilk uygulayıcılarından biridir. Fotoğraf paylaşım devi, GraphQL'i ilk kez keşfettiklerini ve milyar dolarlık şirketlerine güç sağlayan GraphQL teknolojisini nasıl kullandıklarını kamuoyuna açıkladı.
Intuit, Shopify, Coursera ve Airbnb gibi milyar dolarlık diğer birçok şirket, uygulamalarını GraphQL ile güçlendiriyor. Ve bu geniş kapsamlı REST tercihi sadece büyümeye devam ediyor.
RESTful API Nedir?
REST, dağıtılmış hiper ortam sistemleri için bir yazılım mimarisi stili olan "Temsili Durum Aktarımı" anlamına gelir. Sunucu ve istemciler arasında kaynak alışverişi için ilkeleri ve kısıtlamaları tanımlar.
Bir API'de bu ilkelere uyulursa, o API'nin uygulamasına "RESTful" adı verilir. WordPress REST API bunun en iyi örneğidir.
Bir API'nin Restful API olarak adlandırılabilmesi için karşılaması gereken bazı ilkeler ve kısıtlamalar aşağıda verilmiştir:
- İstemci-Sunucu Ayrımı: İstemciler (ön uç) ve sunucu (arka uç) tamamen ayrıdır ve yalnızca uç noktalar aracılığıyla iletişim kurabilir.
- Tekdüzen Arayüz: Arayüzde görülen veriler tüm cihazlarda aynıdır.
- Durumsuzluk: Sunucu, mevcut isteğin ilk kez yapılıp yapılmadığını hatırlamaz. Her istek yapıldığında, sıfırdan işlemek için gerekli tüm bilgileri içermesi gerekir.
- Önbelleğe alınabilirlik: Önbelleğe alma ve oturum depolamaya izin verilir, ancak bunlar, son kullanıcıların veri önbelleğe almayı devre dışı bırakmasına izin verecek şekilde yapılandırılmalıdır.
- Katmanlı Sistem Mimarisi: API'ler, ne istemcinin ne de sunucunun doğrudan mı yoksa bir aracı aracılığıyla mı iletişim kurduğunu anlayamayacak şekilde tasarlanmalıdır.
Aşağıdaki diyagram temel REST mimarisine aittir. İsteklerin ve yanıtların tipik olarak nasıl işlendiğini gösterir.
GraphQL'nin Faydaları
Aşağıda, bir sonraki milyar dolarlık uygulamayı oluşturmak için neden fazlasıyla yeterli olduğunu gösteren GraphQL kullanmanın birkaç avantajı bulunmaktadır.
Tek Bir API Uç Noktası Üzerinden Veri Alma
GraphQL'nin en büyük avantajı, tek bir API uç noktası aracılığıyla herhangi bir veri noktasına veya tüm veri noktalarına erişme yeteneğidir.
RESTful API'lerle ilgili en yaygın sorunlardan biri, bilgiye erişmek için çok fazla uç noktaya sahip olmaktır. GraphQL'de yalnızca tek bir uç noktanız vardır, bu nedenle bir nesne hakkında farklı bilgileri almak için birden çok istek göndermeniz gerekmez.
Aşağıdaki şema, RESTful API ve GraphQL kullanarak kaynakları almanın açık bir örneğini göstermektedir. GraphQL sunucusunda kaynağa erişmek için yalnızca bir uç nokta olduğunu, RESTful API'de farklı kaynaklara erişmek için birden çok API uç noktası gerektiğini görebilirsiniz.
Aşırı Getirme veya Az Getirme Yok
Fazla veya eksik getirme sorunu, RESTful API'lerle ilgili bilinen bir sorundur. Bu, istemcilerin sabit veri yapılarını döndüren uç noktalara vurarak verileri indirdikleri veya beklediklerinden daha fazlasını veya daha azını aldıkları zamandır.
Aşırı getirme, talebin belirli bir istek için gerekenden daha fazla veri almasına veya "getirilmesine" neden olur. Kullanıcı adlarını ana sayfanızda görüntülemek amacıyla tüm kullanıcıları bir tabloya getirdiğinizi hayal edin. Bu durumda, aşırı getirme, ad dahil (ancak yalnızca değil) her kullanıcıya ilişkin tüm verileri döndürür.
Eksik getirme nispeten nadirdir, ancak belirli uç nokta istenen tüm bilgileri sağlayamadığında gerçekleşir. Müşterinin, gerektiğinde diğer bilgilere erişmek için ek isteklerde bulunması gerekecektir.
GraphQL, müşterinin istediği kaynağı herhangi bir ekstra ayrıntı olmadan tam olarak alarak aşırı getirme veya eksik getirme sorununu verimli bir şekilde çözer.
Karmaşık Sistemlerin ve Mikro Hizmetlerin Daha İyi İşlenmesi
GraphQL, entegre çoklu sistemlerin karmaşıklığını birleştirebilir ve gizleyebilir.
Örneğin, monolitik bir arka uç uygulamasından bir mikro hizmet mimarisine geçmek istediğimizi varsayalım. GraphQL API, çeşitli mikro hizmetler arasındaki iletişimi tek bir GraphQL şemasında birleştirerek yönetmeye yardımcı olur.
Bu şemalar tanımlandıktan sonra, ön uç şemadaki verilerin her zaman sistem genelinde senkronize olacağını bildiğinden, hem ön uç hem de arka uç başka herhangi bir değişiklik olmaksızın ayrı ayrı iletişim kurabilir.
Hızlı ve Güvenli
Aşırı getirme sorunu, istemciler için daha yüksek bant genişliği tüketimine neden olabilir ve bu da zamanla uygulamanızda gecikmeye neden olabilir. RESTful API tasarım modellerini kullanmak, çok büyük bir veri yükünden ihtiyaç duyulan bilgileri ayıklamak için daha fazla zaman alır.
GraphQL'nin aşırı ve eksik getirmeyi önleme yeteneği nedeniyle, sunucu güvenli, okunması kolay ve öngörülebilir bir şekil döndürür, bu da API isteklerinizi ve yanıtlarınızı daha hızlı hale getirir.
REST'in Faydaları
GraphQL'nin artan popülaritesine rağmen, REST hala en popüler API standartlarından biridir. Nedenine bir göz atalım.
- Öğrenme Eğrisi: RESTful API'leri öğrenmesi ve anlaması en kolay olanlardır. Bu, diğer API'lere göre birincil avantajıdır.
- Serileştirme: REST, verileri JSON'da seri hale getirmek için esnek bir yaklaşım ve biçimlerle birlikte gelir.
- Önbelleğe Alma: REST API, bir HTTP proxy sunucusu ve önbellek yardımıyla yüksek bir yükü yönetebilir.
- Karmaşık İstek: REST API'lerinin farklı istekler için ayrı bir uç noktası vardır ve bu, karmaşık isteğin diğer API'lere göre daha yönetilebilir olmasına yardımcı olur
- Temiz ve Basit: REST API'leri zarif, basit ve temizdir. Keşfetmek için basittirler.
- Standart HTTP Prosedürleri: REST, verileri almak ve isteklerde bulunmak için standart HTTP prosedür çağrılarını kullanır.
- İstemci/Sunucu: Bu, iş mantığının sunumdan ayrıldığı anlamına gelir. Böylece birini diğerini etkilemeden değiştirebilirsiniz.
- REST Durumsuzdur: İstemci ve sunucu arasında değiş tokuş edilen tüm mesajlar, mesajla ne yapılacağını bilmek için gereken tüm içeriğe sahiptir.
GraphQL'nin Dezavantajları
GraphQL ile REST'in artılarını tartıştığımıza göre, şimdi GraphQL'in bazı dezavantajlarını inceleyelim:
- Zor Öğrenme Eğrisi: GraphQL'i öğrenmek REST kadar kolay değildir. Bir GraphQL API oluşturmanın en zorlu kısmı şemayı tasarlamaktır. Bu çok fazla zaman ve alan bilgisi gerektirir.
- Dosya Yükleme: GraphQL'nin yerel bir dosya yükleme özelliği yoktur. Bu, Base64 kodlaması kullanılarak çözülebilir, ancak bu şekilde kodlama ve kod çözme maliyeti zaman alıcı ve pahalı olabilir.
- Web Önbelleğe Alma: Önbelleğe alma, sunucuya gelen sık trafiği azaltmaya yardımcı olur, bu da sık erişilen bilgileri sunucuya yakın tutarak istekleri ve yanıt sürecini hızlandırır. GraphQL, Apollo veya Relay istemcilerinin önbelleğe alma mekanizmalarına bağlı olarak HTTP önbelleğe alma yöntemlerini desteklemez veya bunlara güvenmez.
- Küçük Uygulamalar için Uygun Değil: GraphQL, küçük bir uygulama oluşturmak için en iyi API mimarisi olmayabilir. Uygulamanız GraphQL tarafından sunulan daha esnek sorguları gerektirmiyorsa, REST gitmeniz gereken yoldur.
- Karmaşık Sorgu Sorunu: GraphQL'nin bir istemciye tam olarak istediğini verme yeteneği, sorgu yayma sorunlarına da yol açabilir. Bir istemci çok fazla iç içe sorgu gönderirse, sunucu için çok zaman alan yanlış sorguların gönderilmesine neden olabilir. Bu tür istekleri karşılamak için özel uç noktalarla REST kullanmak daha iyidir.
REST'in Dezavantajları
Şimdi dikkatimizi REST'in bazı dezavantajlarına çevirelim:
- Çoklu Gidiş-Dönüşler: REST API'leriyle ilgili en büyük sorun, çok sayıda uç noktanın doğasıdır. Bu, müşterinin eksiksiz bir uygulama için tüm kaynakları alması anlamına gelir, verileri almak için sayısız gidiş-dönüş yapması gerekir.
- Aşırı getirme ve Yetersiz Getirme: Aşırı getirme ve eksik getirme sorunu, RESTful APIS'deki önemli bir dezavantajdır. İstenmeyen büyük yüklerin getirilmesi nedeniyle yanıtlarda gecikmeye neden olabilir.
- Hiyerarşi: REST API'leri, URI referanslı kaynaklar üzerine kurulduğundan, doğal olarak organize edilmeyen veya basit bir hiyerarşide erişilmeyen kaynaklar için uygun değildir.
Neden REST Yerine GraphQL Kullanmalısınız?
Daha sonra, gelecekteki API geliştirmeniz için RESTful API yerine neden GraphQL'yi düşünmek isteyebileceğinizi tartışacağız.
Kesinlikle Yazılan Şema
GraphQL, API'nin yeteneklerini tanımlamak için güçlü bir tip sistemi kullanır. GraphQL'de, istemcinin sunucu verilerine nasıl eriştiğini çevreleyen parametreleri tanımlamak için şema tanımlama dili (SDL) kullanılır. İstemciye sunulan tüm API'ler SDL'ye yazılır ve RESTful API'lerde görülen veri tutarsızlığı sorununu çözer.
Aşırı Getirme veya Az Getirme Yok
Aşırı veya eksik getirme sorunu, istemcilerin istediklerinden daha fazla veya daha az bilgi aldığı RESTful API'lerde bilinen bir sorundur. GraphQL, istemcinin ihtiyaç duyduğu bilgileri belirtmesi için bir ortam sağlayarak ve ardından tam olarak - ve yalnızca - bu belirli bilgiyi döndürerek bu sorunu çözer.
Birden Çok Uç Nokta
RESTful API'lerin en büyük sorunlarından biri bilgiye erişmek için çok fazla uç noktaya sahip olmaktır.
Belirli bir kullanıcıya kimlik numarasıyla erişmek istediğinizi varsayalım. Size /users/1
gibi bir uç nokta sunulur. Ancak bu kullanıcının fotoğraflarına erişmek istiyorsanız, /users/1/photos
gibi başka bir uç noktaya bir istek göndermeniz gerekir.
GraphQL'de tek bir uç noktanız vardır ve kullanıcı hakkında farklı bilgileri almak için birden fazla istek göndermeniz gerekmez.
GraphQL ve REST Hesaplaşması
Son olarak, GraphQL ve RESTful API'leri arasındaki büyük farkı keşfedeceğiz. Bundan sonra, iyi bir API tasarımının bazı özelliklerini tartışacağız ve her bir teknolojinin bunları nasıl ele aldığını karşılaştıracağız.
Verim
Tüm kaynaklarınıza erişmek için tek bir uç nokta sağlama yeteneği nedeniyle GraphQL'nin RESTful API'lerden daha hızlı performans gösterdiğine şüphe yoktur. RESTful API'ler, ağ gecikmesine neden olabilecek birden çok uç nokta kullanır.
Sorgu Karmaşıklığı
Uç noktalar birden çok uç noktaya ayrılmadığından, GraphQL sorguları zaman içinde giderek daha karmaşık hale gelebilir. RESTful API uç noktaları ise ayrılır, bu da RESTful API'leri basit sorgularla kısıtlar.
Popülarite ve Topluluk Desteği
GraphQL, büyüyen bir API mimari modeli ve sorgu dilidir. Hâlâ genç olmasına rağmen, benimsenme oranı ve kaynak havuzu hızla büyüyor ve bunu kendileri öğrenmek isteyenler için kaynaklar zaten bol miktarda bulunuyor.
Öte yandan REST, halihazırda geniş bir topluluk desteğine sahiptir ve küçük mikro hizmetler oluşturanlardan karmaşık sosyal uygulamalar oluşturanlara ve ötesine kadar her türlü şirket tarafından kullanılmaya devam etmektedir.
Şu anda, GraphQL ile REST arasındaki popülerlik yarışması bir beraberlik. Her iki teknoloji de yaygın olarak kullanılmaya ve geliştirme topluluğu tarafından iyi bir şekilde desteklenmeye devam ediyor.
Öğrenme eğrisi
GraphQL için öğrenme eğrisi diktir. API geliştirme ve genel yazılım mühendisliği konusunda iyi bir alan bilgisi gerektirir. Yeni başlayanlar, karmaşık bir uygulama oluşturmaya yetecek kadar GraphQL'yi anlamakta zorlanırlar.
Tersine, REST'in başlaması çok kolaydır ve kapı dışında daha az alan bilgisi gerektirir. RESTful API, çoğu büyük programlama diline ve popüler çerçevelere iyi bir şekilde entegre edilmiştir ve bu da öğrenmeyi çok kolaylaştırır.
Özet
GraphQL, REST'in SOAP API kalıplarıyla ilgili sorunları çözmek için tanıtıldığı gibi, RESTful API mimari kalıplarının izini takip eden yeni bir teknolojidir.
GraphQL size daha hızlı yanıtlar, tüm sorgularınız için tek bir API uç noktası ve tutarlı veri erişimi için katı bir şema sunar. Bu nedenler, milyarlarca dolarlık şirketleri erken aşamada bile GraphQL'ye geçmeye iten şeydir. Ancak, sınırlamalarına rağmen, GraphQL'nin öncüsü REST, sahnede güçlü bir şekilde varlığını sürdürmeye devam ediyor.
Bu kılavuzda, hangisini tercih ettiğinize güvenle karar vermenize yardımcı olmak için, her bir teknolojinin yararları ve sakıncaları dahil olmak üzere GraphQL ve RESTful API'ler hakkında bilmeniz gereken her şeyi araştırdık. Ayrıca, RESTful API'lerle ilgili aşırı getirme, yetersiz getirme ve birden çok uç nokta gibi bilinen sorunları ve GraphQL'nin bu sorunları nasıl çözmeye ve uygulamanızın performansını artırmaya çalıştığını tartıştık.
Artık, bir sonraki projeniz için GraphQL ve REST'in uygun olup olmadığını seçmek için yeterli bilgiye sahipsiniz. Seçtiğiniz kazananla ne inşa edeceğinizi yorumlar bölümünde bize bildirin!