.Net Core’da GraphQL API İstekleri: Kodların Düzenlenmiş Hali

Posted by

Merhaba arkadaşlar, önceki iki yazımızda GraphQL ile Ürün Listeleme ve Ürün Ekleme örneği yapmıştık. Bu yazımızda da yazdığımız bu kodları düzenleyeceğiz. Düzenlemeler yaparak hem GraphQL API İstekleri konusunun üzerinden tekrardan geçmiş olacağız hem de daha az tekrarlayan kod satırımız olacak ve temiz, okunabilir bir kod yapımız olacaktır.

Kodumuzun Amacı

Bu kod, örnek bir GraphQL API’sine sorgu göndermek ve veri almak üzerine kuruludur. Aşağıdaki iki ana işlevi yerine getirir:

  1. GetProducts: Mevcut ürünleri listelemek için bir sorgu (query) çalıştırır.
  2. AddProduct: Yeni bir ürün eklemek için bir mutasyon (mutation) çalıştırır.

Model sınıflarını bir önceki yazılar üzerinden kontrol edebilirsiniz.

GraphQL ile .NET Core’da Veri Çekme: Ürün Listesi Örneği

.NET Core’da GraphQL ile Veri Kaydetme: Ürün Ekleme Örneği

1. Ana Akış

Kodun başlangıcında API URL’si belirlenir ve iki metodumuz Console uygulaması çalıştığında çağırılarak ürün ekleme ve listeleme işlemlerini gerçekleştiriyor.

string apiUrl = "http://localhost:4000/graphql";

GetProducts(apiUrl);
AddProduct(apiUrl);

Console.Read();

2. GetProducts

Bu metot, API’den mevcut ürünleri listelemek için bir GraphQL sorgusu çalıştırır.

async static void GetProducts(string apiUrl)
{
    string query = @"
        query {
            products {
                id
                name
                price
                description
                category
                stock
            }
        }";

    var productResponse = await GraphQLHelper.ExecuteGraphQLQueryAsync<ProductResponse<ProductsData>>(apiUrl, query);

    if (productResponse?.Data?.Products != null)
    {
        Console.WriteLine($"Ürün Sayısı: {productResponse.Data.Products.Count}");
        foreach (var product in productResponse.Data.Products)
        {
            Console.WriteLine($"Ürün: {product.Name}, Fiyat: {product.Price}");
        }
    }
    else
    {
        Console.WriteLine("Ürünler bulunamadı!");
    }
}

Açıklama:

  • query değişkeni GraphQL sorgusunu tutar.
  • GraphQLHelper yardımcı sınıfı kullanılarak API’ye istek gönderilir.
  • Gelen yanıt, JSON’dan ProductResponse<ProductsData> tipi bir nesneye dönüştürülür.
  • Elde edilen veriler konsola yazdırılır.

3. AddProduct

Bu metot, API’ye yeni bir ürün eklemek için bir mutasyon çalıştırır.

async static void AddProduct(string apiUrl)
{
    string query = @"
        mutation AddProduct($product: ProductInput!) {
            addProduct(product: $product) {
                id
                category
                description
                name
                price
                stock
            }
        }";

    Product p1 = new Product
    {
        Name = "TEST",
        Price = 10.0m,
        Description = "Description",
        Category = "Category",
        Stock = 10
    };

    var variables = new
    {
        product = new
        {
            name = p1.Name,
            price = p1.Price,
            description = p1.Description,
            category = p1.Category,
            stock = p1.Stock
        }
    };

    var productResponse = await GraphQLHelper.ExecuteGraphQLQueryAsync<ProductResponse<ProductAddData>>(apiUrl, query, variables);

    if (productResponse?.Data?.Product != null)
    {
        Console.WriteLine($"Ürün Eklendi: {productResponse.Data.Product.Name}");
    }
    else
    {
        Console.WriteLine("Ürün eklenemedi!");
    }
}

Açıklama:

  • mutation yapısı GraphQL ile yeni veri eklemek için kullanılır.
  • Örnek bir Product nesnesi oluşturulur ve GraphQL mutasyonu için JSON formatında değişkenler belirlenir.
  • Sonuç JSON’dan ProductResponse<ProductAddData> tipine dönüştürülür ve konsola yazdırılır.

4. GraphQLHelper Yardımcı Sınıf

GraphQL sorgularını daha esnek bir hale getirmek için GraphQLHelper sınıfını yazacağız. Bu sınıf ile GraphQL isteklerimizi gerçekleştireceğiz.

public static class GraphQLHelper
{
    public static async Task<TResponse?> ExecuteGraphQLQueryAsync<TResponse>(string apiUrl, string query, object? variables = null)
    {
        string jsonQuery = JsonSerializer.Serialize(new { query, variables });

        using (var httpClient = new HttpClient())
        {
            try
            {
                var content = new StringContent(jsonQuery, Encoding.UTF8, "application/json");
                var response = await httpClient.PostAsync(apiUrl, content);

                if (response.IsSuccessStatusCode)
                {
                    string responseString = await response.Content.ReadAsStringAsync();
                    return JsonSerializer.Deserialize<TResponse>(responseString);
                }
                else
                {
                    Console.WriteLine($"Hata: {response.StatusCode}");
                    Console.WriteLine(await response.Content.ReadAsStringAsync());
                    return default;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Hata: {ex.Message}");
                return default;
            }
        }
    }
}

İşleyiş:

  • JSON formatında GraphQL sorgusu oluşturur.
  • HTTP isteği yapar ve yanıtı belirtilen türe dönüştürür.
  • Hataları yakalar ve loglar.

Kodun Avantajları

  1. Tekrar Eden Kodları Minimize Etme: GraphQLHelper yardımcı sınıfı sorguları sadeleştirir.
  2. JSON ile Esnek Veri Transferi: GraphQL sorguları JSON formatında düzenlenerek API ile rahat bir şekilde iletişim kurulur.
  3. Veri Modelleme: İşlevlerde kullanılan model sınıfları, yanıtın kolayca işlenmesini sağlar.

Sonuç

GraphQL, RESTful API’lere göre daha optimize ve çok yönlü bir yaklaşım sunar. Örnek kod, .NET Core, C# kullanarak bir GraphQL API’sine nasıl bağlanılabileceğinizi ve sorgularını nasıl çalıştırılabileceğinizi gösterir. Projenizde bu yapıyı kullandığınızda, hem zaman tasarrufu hem de daha temiz kod yazma şansınız olacaktır.

Umarım faydalı olur.

Bir sonraki yazıda görüşmek üzere…

Leave a Reply

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir