Mehmet Oya

Hap Bilgi 11: GraphQL Kullanımı ve Avantajları

Feb 02, 2024
6 minutes

Developer hap bilgi sever; 11. bölüm: GraphQL Web geliştirme dünyasında, API’lerin etkili bir şekilde yönetilmesi ve veri alışverişi önemli bir konudur. GraphQL, bu ihtiyaca karşılık veren ve REST API’lerinin bazı sınırlamalarını aşan bir teknolojidir. Bu bölümde GraphQL’in ne olduğunu, nasıl çalıştığını ve avantajlarını örneklerle ele alacağız.

GraphQL Nedir?

GraphQL, Facebook tarafından geliştirilen bir sorgu dilidir. Bir API için veri alışverişini kolaylaştıran ve istemcilerin ihtiyaç duyduğu veriyi özelleştirmelerine olanak tanıyan bir teknolojidir. REST’in karşılaştığı over-fetching (fazla veri çekme) ve under-fetching (yetersiz veri çekme) sorunlarını çözmek için tasarlanmıştır.

GraphQL Avantajları

  • a. Esnek Sorgular: GraphQL, istemcinin ihtiyacına özel sorgular yapabilmesine olanak tanır. Bu, istemcinin sadece istediği veriyi almasını sağlar, bu da over-fetching sorununu ortadan kaldırır.

  • b. Tek Bir Endpoint: GraphQL, genellikle bir endpoint sunar. Bu, birkaç farklı API çağrısına gerek olmadan birçok veri parçasına ulaşabilmenizi sağlar.

  • c. İleriye Dönük Uyum: API’nizi güncellediğinizde veya yeni özellikler eklediğinizde, mevcut istemcilerinizi etkilemeden yeni alanlar ekleyebilirsiniz.

  • d. Dökümantasyon: GraphQL, sorgular ve mutasyonlar için otomatik olarak interaktif dökümantasyon üretebilir. Bu, geliştiricilerin API’yi kullanmayı hızlı ve etkili hale getirir.

GraphQL Örnekleri

  • a. Sorgular:
query {
  user(id: 1) {
    id
    name
    email
    posts {
      title
    }
  }
}

  • b. Mutasyonlar:
mutation {
  createUser(name: "Harry Kane", email: "harry@example.com") {
    id
    name
    email
  }
}
  • c. Fragments:
fragment userInfo on User {
  id
  name
  email
}

query {
  user(id: 1) {
    ...userInfo
    posts {
      title
    }
  }
}

GraphQL Kullanımı İçin İpuçları

  • Optimizasyon ve Performans:

Sorgularınızı optimize etmek için gereksiz alanları çekmekten kaçının.

  • Güvenlik:

Mutasyonlar ve sorgular üzerinde güvenlik önlemleri alın.

  • Dökümantasyon:

API’nizi doğru bir şekilde belgeleyin, böylece geliştiriciler kullanımını anlamakta zorlanmaz.

Sonuç

GraphQL, API geliştirmenin yeni ve güçlü bir yolunu sunar. Esneklik, performans ve dökümantasyon avantajları, bu teknolojiyi birçok geliştirici için tercih edilebilir kılar.

Senaryo

Çok basit bir senaryo ile mantığını kavramaya çalışalım. GraphQL sorgularını alıp işleyen ve GraphQL üzerinden bir kullanıcı listesi sağlayan bir .NET Core uygulaması;

using System;
using System.Collections.Generic;
using System.Linq;
using GraphQL;
using GraphQL.Types;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;

public class UserType : ObjectGraphType<User>
{
    public UserType()
    {
        Field(x => x.Id);
        Field(x => x.Name);
        Field(x => x.Email);
        Field<ListGraphType<PostType>>(
            "posts",
            resolve: context => context.Source.Posts
        );
    }
}

public class PostType : ObjectGraphType<Post>
{
    public PostType()
    {
        Field(x => x.Id);
        Field(x => x.Title);
    }
}

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public List<Post> Posts { get; set; }
}

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
}

public class BlogQuery : ObjectGraphType
{
    public BlogQuery()
    {
        Field<UserType>(
            "user",
            arguments: new QueryArguments(new QueryArgument<IntGraphType> { Name = "id" }),
            resolve: context => GetUserById(context.GetArgument<int>("id"))
        );

        Field<ListGraphType<UserType>>(
            "users",
            resolve: context => GetUsers()
        );
    }

    private User GetUserById(int id) => GetUsers().FirstOrDefault(u => u.Id == id);

    private List<User> GetUsers() => new List<User>
    {
        new User
        {
            Id = 1,
            Name = "Harry Kane",
            Email = "harry@example.com",
            Posts = new List<Post>
            {
                new Post { Id = 1, Title = "Anatomy of scoring goals" },
                new Post { Id = 2, Title = "The art of goth throwing" }
            }
        },
        new User
        {
            Id = 2,
            Name = "Sadio Mane",
            Email = "sadio@example.com",
            Posts = new List<Post>
            {
                new Post { Id = 3, Title = "Liverpool memories" },
                new Post { Id = 4, Title = "African striker" }
            }
        }
    };
}

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<IDocumentExecuter, DocumentExecuter>();
        services.AddSingleton<IDocumentWriter, DocumentWriter>();
        services.AddSingleton<BlogQuery>();
        services.AddSingleton<UserType>();
        services.AddSingleton<PostType>();

        services.AddSingleton<ISchema>(new Schema
        {
            Query = services.BuildServiceProvider().GetRequiredService<BlogQuery>()
        });
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseGraphQL<ISchema>("/graphql");
        app.UseGraphiQL("/graphql");
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseUrls("http://localhost:5000")
            .UseStartup<Startup>()
            .Build();

        host.Run();
    }
}

Bu örnek, GraphQL .NET kütüphanesini kullanarak GraphQL sorgularını işleyen ve bir kullanıcı listesi sağlayan bir GraphQL sunucusu oluşturuyor. Startup sınıfında, BlogQuery, UserType, ve PostType sınıfları kaydedilir ve bir ISchema uygulanır. GraphQL sorgularını işlemek için bir /graphql endpoint’i ve sorguları test etmek için GraphiQL arayüzü sağlayan bir /graphiql endpoint’i konfigüre edilmiştir.

Kaynak ⬇️

Her zaman olduğu gibi kaynaklara mutlaka göz atılmasını tavsiye ediyorum.

  • GraphQL Resmi Belgeleri:

GraphQL Resmi Belgeleri: GraphQL’in temellerini anlamak ve kullanımı hakkında ayrıntılı bilgi almak için resmi belgelere başvurabilirsiniz.

  • GraphQL .NET GitHub Reposu:

GraphQL .NET GitHub: GraphQL .NET kütüphanesinin kaynak kodu ve belgelerine ulaşabilirsiniz. Bu, kütüphanenin güncellenmiş versiyonlarını takip etmek için yararlı olabilir.

  • Apollo GraphQL Learning Resources:

Apollo GraphQL Learning Resources: Apollo GraphQL tarafından sunulan kaynaklar, GraphQL’i daha iyi anlamak ve kullanmak isteyenler için çeşitli eğitim materyallerini içerir.

GraphQL.org Blog: GraphQL ekosistemi ve topluluğundaki gelişmeler hakkında güncel bilgileri içeren resmi GraphQL blogunu takip edebilirsiniz.

  • GraphQL - A Guide for Beginners:

GraphQL - A Guide for Beginners: FreeCodeCamp’in GraphQL’e giriş niteliğindeki rehberi, temel kavramları anlamanıza yardımcı olabilir.

  • GraphQL Mimarisi ve Çeşitli Kullanım Senaryoları:

Designing GraphQL APIs: GitHub tarafından sunulan bu kaynak, GraphQL API’lerini nasıl tasarlayacağınız ve kullanacağınız konusunda rehberlik eder.

  • GraphQL Best Practices:

Best Practices for GraphQL: GraphQL kullanımında en iyi uygulamaları ve önerileri içeren resmi belgeler.

  • GraphQL Security Best Practices:

Securing Your GraphQL API from Malicious Queries: Apollo GraphQL tarafından paylaşılan bu blog yazısı, GraphQL API’lerini kötü amaçlı sorgulara karşı koruma konusunda faydalı bilgiler içerir.