GraphQL Nedir?

REST tabanlı web servislerindeki ilişkisel verileri daha kolay bir şekilde almak ve verileri sorgulamak için kullanılan GraphQL ile ilgili bilgiler yer alıyor.

GraphQL nedir?

GraphQL veri çekmek, sorgulamak, veriler üzerinde işlem yapmak için kullanılan REST tabanlı web servis sorgulama dilidir.

Neden GraphQL?

REST tabanlı web servislerinde birçok alana sahip ve büyük boyuttaki veriler istemciye gönderildiğinde trafiğin fazla kullanılmasına neden olur.

Örneğin; REST tabanlı bir web serviste üyelerin adı alınmak istendiğinde aşağıdaki gibi bir adrese istek yapıldığını varsayalım.

/api/users

İstek sonucu web servis kullanıcılara ait tüm verileri döndürecektir.

Üyelere ait ad alanı için diğer verileri de almış olduk.

REST tabanlı web servis hazırlarken farklı veriler için farklı adres/end-point kullanılır.

Örneğin; Üyelere ait yazıları REST tabanlı web servis ile almaya çalışalım.

İlk olarak üye listesine ulaşmamız gerekir.

/api/users

Daha sonra alınan üye bilgilerine göre farklı bir adresten yazılar alınır.

/api/posts/ID

Üyelere ait yazıları almak istediğimizde iki defa sunucuya istek göndermiş olduk.

Ayrıca üyeye ait yazıları almak için sadece ilişkili alan (ID) yeterli olacakken biz tüm kullanıcı verilerini de almış olduk.

Bu sorun için REST API sunucusuna çeşitli HTTP sorguları (?field=) eklenebilir veya GraphQL sorgulama dili kullanılabilir.

GraphQL kullanımı

GraphQL sunucu ve istemciden oluşur.

Sunucu tarafında istemciye gönderilecek olan verilerle ilgili bilgiler (GraphQL şemaları (Schema), İşlemler (Mutation) …) yer alır.

Örnek bir GraphQL şeması

type User {
  name: String!
  age: Int!
  email: String!
  street: String!
  zipcode: String!
  city: String!
}

Node.js ile GraphQL şeması aşağıdaki gibi hazırlanır.

const graphql = require('graphql');

const {
  GraphQLObjectType,
  GraphQLString,
  GraphQLInt,
} = graphql;

const User = new GraphQLObjectType({
  type: 'User',
  fields: {
    name: { type: GraphQLString },
    age: { type: GraphQLInt },
    email: { type: GraphQLString },
    street: { type: GraphQLString },
    zipcode: { type: GraphQLString },
    city: { type: GraphQLString }
  }
});

veya

const { graphql, buildSchema } = require('graphql');

const User = buildSchema(`
  type User {
    name: String!
    age: Int!
    email: String!
    street: String!
    zipcode: String!
    city: String!
  }
`);

Şemanın hazırlanması kullanılan programlama diline göre farklılık gösterir.

Şema hazırlandıktan sonra veriler veri kaynağından alınarak istemciye iletilir.

const Query = new GraphQLObjectType({
  name: 'Query',
  description: 'Açıklama',
  fields: {
    user: {
      type: User,
      args: { name: { type: GraphQLString } },
      resolve(parent, args) {
        // Veriler buradan gönderiliyor.
        // return veri.kaynagi()
      }
    }
  }
});

GraphQL veriler üzerinden işlem yapmak (ekleme, silme, güncelleme) için mutation olarak adlandırılan yapıya imkan verir.

Bu yapı bir önceki Query yapısı gibi tanımlanarak resolve gibi bir fonksiyonda ile gerekli olan işlem yapılır.

GraphQL sunucusu temel olarak sunucuya gönderilen GraphQL sorgularını işler. İstekler sunucuya query parametresi ile gönderilir.

Bu yapı istemci tarafında yazılabilir. Ancak çeşitli istemci araçların kullanımı zaman, güvenlik gibi nedenlerden dolayı faydalı olacaktır.

İstemci tarafında sıklıkla kullanılan Relay, Apollo Client yapısı kullanılabilir.

Apollo Client GraphQL sunucusuna aşağıdaki gibi bir sorgu göndererek verileri alır.

{
  User {
    name
  }
}

Sorgu sonucunda GraphQL sunucusu User şemasında yer alan name alanını döndürecektir.

GraphQL ile işlem yaparken GraphQL IDE aracının kullanılması faydalı olacaktır.

Web Servis Derslerine buradan ulaşabilirsiniz…

Hayırlı günler dilerim.

Yusuf SEZER

Yusuf SEZER

Computer Engineer who interested about web technologies, algorithms, artificial intelligence and embedded systems; constantly exploring new technologies.


Bunlara'da bakmalısın!