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:
- GetProducts: Mevcut ürünleri listelemek için bir sorgu (query) çalıştırır.
- 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:
- querydeğişkeni GraphQL sorgusunu tutar.
- GraphQLHelperyardı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:
- mutationyapısı GraphQL ile yeni veri eklemek için kullanılır.
- Örnek bir Productnesnesi 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ı
- Tekrar Eden Kodları Minimize Etme: GraphQLHelperyardımcı sınıfı sorguları sadeleştirir.
- JSON ile Esnek Veri Transferi: GraphQL sorguları JSON formatında düzenlenerek API ile rahat bir şekilde iletişim kurulur.
- 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…