AspNet .Core ile GraphQL İşlemleri
- Abi napıyorsun!
- GraphQL diye bir şeyden bahsettiler. Anlamaya çalışıyorum?
- Allahım yine mi…
- Bilinçaltım:
- Abi Rest var, şimdi onla idare ederim
- Kaçmıyor ya bir yere bakarız bir ara
- Hemen öğrenmeliyim, yoksa geri kalacağım
Ya babacım bir durun yahu, daha Rest’i yeni öğrendik bi durun hazmedelim ama yok, neymiş takip edersen izi kaybetmezsin, takip etmezsen geri kalırsın korkusu rüyalarıma sirayet ediyor, deliksiz uykuya hasret bir mesleğim var ama seviyorum, ve sevmenin gereği olarak onunla ilerlemeye çalışıyorum.
GraphQL
GraphQL API seviyesinde yazılan sorgulama dili olarak tanımlayabiliriz. Rest Servisler gibi sıralı ve birden çok isteği, ihtiyaç doğrultusunda tek bir istek üzerinden çalışır hale getiriliyor.
Facebook tarafından geliştirilen/standartlaştırılan GraphQL “veri sorgulama ve erişimi” için yeni bir yaklaşım tarzı sunuyor diyebiliriz.
GraphQL nedir?, detayları nelerdir? yaşam döngüsü gibi tanımlamalara çok girmeyeceğiz. Burada GraphQL sorguları nasıl oluşturulur, insert, update, select işlemlerini nasıl yaparız sorularına cevap bulacağız. GraphQL ile ilgili açıklamalarada değineceğiz.
Senaryo olarak bir dergi firmasını ele alacağız. Yazılar, bu yazılara ait yorumlar, yazının bağlı olduğu kategori, ve yazının sahip olduğu tag bilgileri gibi, gerçek hayat senaryosu üzerinden gideceğiz. Bu şekilde genel hatları ile çeşitli GraphQL sorguları yazacağız.
/api/Posts
/api/Posts/id/3
/api/Categories/id/2
/api/comments/postId/3
/api/tags/postId/3
Yukarıda yazmış olduğum HTTP Get talepleri ile:
Post bilgileri, Post’un kategori bilgisi, Post’un yorumları, Post’un tag bilgilerini elde etmek için yapılan isteklerdir. Normalde bu kurguyu REST ile yapmak istesek beş farklı sorgudan yararlanmak gerekirken GraphQL ile bunu tek paketle gerçekleştirmek mümkündür.
PROJE TASLAĞI — MENÜ
- Başlangıç olarak:
Newspaper isminde bir Veritabanı oluşturup 5 adet tablo ekleyeceğiz.
(Post-Category-PostComment-Tag-PostTag). Burada tablolar arasındaki ilişkiye dikkat çekmek istiyorum, bu örneğimizde Bire çok, çoğa çok, bire bir gibi ilişkilerin olduğu bir yapı kuracağız, mesleki olarak en sık karşılaştığımız tablolar arası ilişkilere değineceğiz. - Ara sıcak olarak:
Repository Design Pattern uygulayarak katmanlı mimari kuracağız, katmanlar arasındaki ilişkileri konuşacağız, hangi katmanda hangi operasyonların yazılması gerektiğine değineceğiz. Katmanlı mimaride en önemli husus bağımlılıkları yönetmek ve katmanlar arası ilişkiyi doğru tahlil ederek dizayn etmek. - Ana yemek olarak:
Nuget paket yöneticisinden yararlanarak proje katmanlarımıza gerekli paketleri yükleyip GRAPHQL için gerekli operasyonları yazacağız. - Tatlı olarak:
Graphiql nesnesini paket yöneticisinden indirip yazmış olduğumuz backend katmanı test edeceğiz.
Swagger aslında API’ler için standartlaştırılmış bir doküman şablonu sunan bir mekanizma. İçinde servise sunulan metodları deneyebileceğimiz arabirimleri bize hazır olarak veriyor. Ayrıca REST testleri için Swagger şart değil. Genellikle Postman, SOAP UI, hatta bir tarayıcı bile(HTTP Get’ler için) yeterli. GraphiQL’de GraphQL için oluşturulmuş hazır deneme şablonu dur.
GraphQL işlemlerine başlamadan önce bu yazımdan Repository Tasarım Kalıbı şeklinde hazırlamış olduğum yazımı okuduktan sonra devam edeceğiz. Ardından GraphQL ile ilgili implementasyon işlemlerini yapıp GraphQL’ e örnekleri yapacağız.
Repository Tasarım Kalıbı ile GraphQL projemizi anlatan yazıya buradan erişebiliriz. GraphQL altyapı kurulması ve işlemleri geçmeden önce okuyup ardından devam edebilirsiniz.
GraphQL ve GraphiQL
GraphQL ile ilgili operasyonları Business katmanında bir klasör oluşturup içerisine yazacağız..
Types:
Veritabanında bulunan tabloların ve alanlarının tanımlamaları olarak söyleyebiliriz.
- İlk olarak Type işlemlerini yapacağız. Oluşturacağımız Type nesneleri ObjectGraphType<T> tipinde olacaktır. T Nesnesi burada hangi tür nesne için işlem yapılıyorsa o tipte (Post, Category, Comment vb..) olacaktır.
Field nesnesinin bir çok kullanım opsiyonu mevcuttur.
Genel olarak Post nesnesi üzerinden sorgulamalar yapıyor olacağız. Post nesnesi için PostType isminde bir tip oluşturacağız.
Type nesnelerine bakıldığında ObjectGraphType<T> türünde olduğuna tekrar dikkat çekmek istiyorum.
PostType nesnesi ile ilgili olarak, Post nesnesine ait bilgileri, Post’un kategori bilgisini, commentleri, kaç adet comment olduğunu ve hangi taglara sahip olduğu gibi soruların cevabını bulabiliriz.
PostType nesnesi constructor da Business Katmanında yazmış olduğumuz soyut sınıfların inject (enjekte) edildiğine dikkat edelim.
Veritabanında ve tablolarda olmayan özellikleri (property) burada tanımlayabiliriz. (CommentCount- Yorum sayısı). Geri dönüş tipi IntGraphType.
PostType işlemlerinde dikkat ederseniz bağlı özelliklerin sorgulama işlemlerinde geri dönüş tipleri değişkenlik göstermektedir.
-ListGraphType
-IntGraphType
-CategoryType
Önemli bir detay “ Parametreli sorgulamalar” !!!!
Burada PostType içerisinde Post’a ait yorumları alıyoruz , last parametresi ile son X adet yorumu almamızı sağlayan sorgulamadır. Burada “last” parametresi ile görmek istediğimiz comment sayısını belirtiyoruz.
Arguments nesnesine baktığımızda çoğul bir kelime yani burada istediğimiz kadar parametre olabilir, gelen parametreleri bu şekilde filtreleyebiliriz.
var lastItemFilter = context.GetArgument<int?>(“last”);
Aynı şekilde CategoryType nesnesine şu sorguyuda ekleyebiliriz.
Hangi kategori, hangi makaleleri içeriyor sorusuna cevabımız şu şekilde olacaktır. Kategoriye bağlı bir sorgulama olduğu için CategoryType içerisinde yazıyoruz.
Queries:
Query içerisine yazılabilecek sorgulama işlemlerini tanımlıyoruz. Buraya yazdığımız tanımlamalar dışında herhangi birşey çalıştıramayız.
Tüm sorgularımızı yazabileceğimiz NewspaperQuery isminde bir class oluşturuyoruz ve içerisine Post ve Category nesneleri için query örnekleri yazdık diğer nesneler içinde yazabilirsiniz.
Mutations:
Veri eklemek, güncellemek veya silmek için kullanılabilir. Mutasyonlar şemanın bir parçası olarak tanımlanır bir başka söylemle GraphQL mutasyonu, istemcilerin sunucudaki verileri değiştirmesine izin veren bir işlem türüdür.
Post nesnesine ekleme işlemi yapmak için PostMutation isminde bir nesne oluşturuyoruz.
Ekleme işlemi için PostInputType isminde bir nesne oluşturuyoruz. Her parametre için veritabanında oluşturulan veri türlerine göre oluşturmak gerekmektedir. Null geçilemez parametreler için NonNullGraphType olarak belirtiyoruz.
Field<NonNullGraphType<StringGraphType>>(“title”);
Schema:
NewspaperGraphQLSchema adında bir nesne oluşturup, GraphQL.Type.Schema dan miras alıyoruz.
Yazdığımız Query ve Mutation işlemlerini tanımlıyoruz
GraphQL Web API Projesi
Api projesinde GraphQLController isminde bir controller oluşturuyoruz. Constructor da “ISchema schema, IDocumentExecuter documentExecuter” soyut sınıflarını enjekte (inject) ediyoruz.
Post isminde GraphQLQuery tipinde parametre alan bir method oluşturuyoruz.
Controller son görünümü bu şekilde olacaktır.
Startup.cs
Startup.cs içerisinde kullandığımız dependency injection ile veritabanı nesnelerimize , dbcontext nesnesine ve GraphQL ile ilgili inject işlemleri gerçekleştirelim.
appsetting.json
GraphiQL
GraphiQL, Graph sorguları yapmamızı kolaylaştıran ve birçok program arayüzü tarafından hazır olarak sunulan standartlaştırılmış bir arabirimdir.
Konfigürasyon işlemi için startup.cs dosyasında Configure metodu içerisinde app.UseGraphiQl(); olarak eklenmesi gerekmektedir.
Web API projesini çalıştırdığımızda GraphiQL arayüzü sizi karşılayacaktır.
GraphiQL arayüzü bize oluşturduğumuz query ve mutation’lar hakkında bilgi vermektedir. Sağ tarafta bulunan query ve mutation nesnelerine tıkladığımızda bize schema içerisinde tanımladığımız query ve mutation lar hakkında bilgi vermektedir.
Root Types
GraphQL şemamıza ait bilgileri görüyoruz.
Newspaper_Query:
GraphQL şemamız içerisinde NewspaperQuery class’ında yazmış olduğumuz query’ler görünmektedir.
Newspaper_Mutation:
GraphQL şemamız içerisinde Newspaper_Mutation class’ında yazmış olduğumuz insert , update , delete işlemlerimizi görebilirsiniz.
GraphiQL ile sorgulama işlemlerine örnek sorgular yazmaya başlayalım.
GraphiQL açıldığında Query yazılan alanda 4 adet tanım görülmektedir. CategoryInfo, CategoryList, PostInfo ve PostList bu alanlar NewspaperQuery.cs sınıfında tanımlamış olduğumuz query isimlerinden gelmektedir. Gerekli sorguları NewspaperQuery.cs sınıfına eklediğimizde önerme olarak çıktığını göreceğiz.
İşte GraphiQL’in asıl gücünü bu videolar’da görüyoruz.
1- PostList ve PostInfo nesnelerinin kullanımı.
Video’da görebileceğimiz gibi parametre ekleyerek farklı sonuçlar elde edebiliyoruz.
2- Post Mutation (Yeni Post Ekleme — Insert işlemi) kullanımı.
3- Yeni bir kategori ekleme ve listeleme işlemi.
4- Dışarıdan parametre alarak çalışan sorgular.
Bu ve bundan önceki yazılarımı yazmamda desteğini esirgemeyen Burak Selim Şenyurt üstadıma teşekkürü bir borç bilirim.
GraphQL ve GraphiQL işlemleri için anlatacaklarım şimdilik bu kadar.
Testleri GraphiQL ile değil bir Angular projesi ile arayüzden yapmayı planlıyorum, ilk fırsatta ekleyeceğim.
Saygılarımla
Adem OLGUNER…