C# İle Restful Apı Üzerinden Json Verisi Nasıl Yapılır?

C# İle Restful Apı Üzerinden Json Verisi Nasıl Yapılır?
C# İle Restful Apı Üzerinden Json Verisi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Başarılı bir uygulama geliştirmek için sisteminizde aşağıdaki araçların ve kütüphanelerin yüklü olduğundan emin olmalısınız. 2026 yılı standartlarına göre .NET 9 SDK kullanılması tavsiye edilmektedir.

  • .NET 9 SDK: Microsoft'un güncel geliştirme ortamı.
  • Visual Studio 2022 (Güncel Sürüm) veya VS Code: Kod editörü olarak tercih edilebilir.
  • System.Net.Http ve System.Text.Json: .NET içerisinde yerleşik olarak gelen, harici kütüphane gerektirmeyen temel kütüphaneler.
  • Postman veya Swagger: Yazdığınız API endpoint'lerini test etmek için kullanacağınız yardımcı araçlar.

HttpClient Kullanarak Veri Çekme (GET İsteği)

RESTful API üzerinden veri almanın en temel yolu GET isteğidir. C#'ta HttpClient sınıfı, bu işlemler için optimize edilmiş en güçlü araçtır. Aşağıdaki kod bloğu, uzak bir sunucudan JSON formatında veri çeken temel bir örneği göstermektedir.

using System.Net.Http.Json;

public async Task GetProductsAsync()
{
    using HttpClient client = new HttpClient();
    // API adresine istek gönderilir
    var response = await client.GetAsync("https://api.ornek.com/products");
    
    // İstek başarılı mı kontrol edilir
    response.EnsureSuccessStatusCode();
    
    // JSON verisi nesne listesine dönüştürülür
    return await response.Content.ReadFromJsonAsync();
}

Burada ReadFromJsonAsync metodu, .NET'in modern JSON kütüphanesi olan System.Text.Json'ı kullanarak veriyi otomatik olarak ilgili sınıfa dönüştürür. Bu yöntem, manuel ayrıştırma (parsing) işlemlerine göre çok daha hızlı ve güvenlidir.

Veri Gönderme (POST İsteği)

API'ye veri gönderirken, nesnelerimizi JSON formatına dönüştürerek HTTP gövdesine (body) yerleştirmemiz gerekir. Aşağıdaki örnekte, yeni bir veri kaydı oluşturmak için nesnenin nasıl serialize edildiğini görebilirsiniz.

public async Task PostProductAsync(Product newProduct)
{
    using HttpClient client = new HttpClient();
    
    // Nesne JSON formatına dönüştürülerek isteğe eklenir
    var response = await client.PostAsJsonAsync("https://api.ornek.com/products", newProduct);
    
    if (response.IsSuccessStatusCode)
    {
        Console.WriteLine("Veri başarıyla gönderildi.");
    }
}

PostAsJsonAsync metodu, veriyi otomatik olarak JSON formatına çevirir ve Content-Type başlığını "application/json" olarak ayarlar. Bu, manuel olarak içerik tipi belirleme hatalarının önüne geçer.

JSON Verisini Yönetme: Serialization ve Deserialization

API'den gelen veriler bazen doğrudan nesneye dönüştürülemeyecek kadar karmaşık olabilir. Bu durumlarda JsonSerializerOptions kullanarak veriyi özelleştirebiliriz. Özellikle API'nin büyük harf/küçük harf duyarlılığı veya tarih formatları gibi durumlarda bu ayarlar hayati önem taşır.

using System.Text.Json;

var options = new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true, // Büyük/küçük harf duyarlılığını kapatır
    WriteIndented = true // Okunabilir (girintili) JSON çıktısı üretir
};

string jsonString = JsonSerializer.Serialize(myObject, options);

Bu yöntem, özellikle API'den gelen verilerin yerel sınıflarınızla tam eşleşmediği durumlarda (örneğin JSON'da "user_name" iken C#'ta "UserName" olması) esneklik sağlar.

Hata Yönetimi ve Güvenlik Uyarıları

RESTful API işlemleri sırasında ağ hataları, zaman aşımları veya geçersiz JSON formatları gibi durumlarla karşılaşabilirsiniz. Bu durumları try-catch blokları ile yönetmek uygulamanızın çökmesini engeller.

Kritik Güvenlik Uyarısı: API anahtarlarınızı (API Keys) veya kullanıcı kimlik bilgilerini asla kod içerisinde doğrudan yazmayın. Üretim ortamında (Production) mutlaka User Secrets veya Azure Key Vault gibi güvenli yapılandırma servislerini kullanın. Ayrıca, dışarıdan gelen JSON verilerini her zaman doğrulamadan (validation) veritabanına kaydetmeyin.

try
{
    var response = await client.GetAsync("https://api.ornek.com/data");
    response.EnsureSuccessStatusCode();
}
catch (HttpRequestException e)
{
    Console.WriteLine($"İstek hatası: {e.Message}");
}
catch (JsonException e)
{
    Console.WriteLine($"JSON ayrıştırma hatası: {e.Message}");
}

Yöntem Karşılaştırma Tablosu

Yöntem Avantaj Dezavantaj
HttpClient (Modern) Yüksek performans, async desteği Bağlantı havuzu yönetimi gerektirir
RestSharp Kullanımı kolay, zengin özellikler Harici kütüphane bağımlılığı
WebClient (Eski) Basit sözdizimi Deprecated (kullanımı önerilmez)

Sıkça Sorulan Sorular

HttpClient nesnesini her istekte yeni oluşturmalı mıyım?

Hayır, HttpClient nesnesi "singleton" veya statik olarak tanımlanmalıdır. Her istekte yeni bir nesne oluşturmak "socket exhaustion" (soket tükenmesi) sorununa yol açar.

JSON verisi içerisindeki tarih formatı hatası nasıl çözülür?

Tarih formatları için JsonSerializerOptions içerisinde JsonConverter kullanarak özel bir tarih formatlayıcı tanımlayabilirsiniz.

API'den gelen veriyi nasıl güvenli bir şekilde doğrularım?

Gelen veriyi bir sınıfa bağladıktan sonra FluentValidation kütüphanesini kullanarak nesne alanlarının beklenen kriterlere uygun olup olmadığını kontrol etmelisiniz.

HTTPS kullanmak zorunlu mudur?

Evet, verilerin yolda çalınmasını (man-in-the-middle attack) engellemek için her zaman HTTPS protokolü kullanılmalıdır.

API'ye nasıl yetkilendirme (token) eklerim?

İstek göndermeden önce client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "token_degeriniz"); satırını kullanarak yetkilendirme başlığını ekleyebilirsiniz.

Yasal Uyarı: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Yazılımlarınızın güvenliğini sağlamak, veri sızıntılarını önlemek ve yasal uyumluluğu (KVKK vb.) korumak tamamen geliştiricinin sorumluluğundadır. Kodunuzu üretim ortamına almadan önce mutlaka güvenlik taramalarından geçirin.

API İletişiminde Performans Optimizasyonu: HttpClientFactory Kullanımı

Modern .NET uygulamalarında HttpClient nesnesini doğrudan new anahtar kelimesiyle oluşturmak, yüksek trafikli uygulamalarda "socket exhaustion" (soket tükenmesi) sorununa yol açar. Bu sorunu aşmak ve performanslı bir API iletişimi sağlamak için IHttpClientFactory kullanmalısınız.

IHttpClientFactory, HttpClient örneklerinin yaşam döngüsünü yönetir ve alt katmandaki HttpMessageHandler nesnelerini havuzlayarak (pooling) kaynak kullanımını optimize eder.

// Startup.cs veya Program.cs içerisinde servis kaydı
builder.Services.AddHttpClient("MyApiClient", client =>
{
    client.BaseAddress = new Uri("https://api.ornek.com/");
    client.DefaultRequestHeaders.Add("Accept", "application/json");
});

// Kullanım örneği
public class MyApiService
{
    private readonly IHttpClientFactory _httpClientFactory;

    public MyApiService(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
    }

    public async Task GetDataAsync()
    {
        var client = _httpClientFactory.CreateClient("MyApiClient");
        var response = await client.GetAsync("data");
        // İşlemler...
    }
}

API Entegrasyonlarında Hata Ayıklama (Debugging) ve Loglama

RESTful API'ler ile çalışırken karşılaşılan en büyük zorluk, ağ katmanında veya JSON şemasında oluşan hataları tespit etmektir. API'den dönen verinin neden deserialization hatasına yol açtığını anlamak için ham yanıtı (raw response) loglamak kritik bir adımdır.

Ham Yanıtı İzleme

API'den gelen veriyi doğrudan nesneye dönüştürmeden önce, içeriği bir string olarak okumak hata ayıklama sürecini hızlandırır:

var response = await client.GetAsync("api/endpoint");
string rawJson = await response.Content.ReadAsStringAsync();

if (!response.IsSuccessStatusCode)
{
    Console.WriteLine($"Hata Kodu: {response.StatusCode}");
    Console.WriteLine($"Hata Detayı: {rawJson}");
}
else
{
    // Başarılı durumda deserialization işlemi
    var data = JsonSerializer.Deserialize(rawJson);
}

Polly ile Hata Toleransı (Resilience)

API'ler geçici olarak erişilemez olabilir veya zaman aşımına (timeout) uğrayabilir. Bu tür durumlarda uygulamanızın çökmemesi için Polly kütüphanesini kullanarak "Retry" (yeniden deneme) stratejileri uygulayabilirsiniz.

  • Exponential Backoff: Hata durumunda bekleme süresini artırarak tekrar deneme.
  • Circuit Breaker: API sürekli hata veriyorsa, belirli bir süre isteği tamamen durdurma.
// Polly ile 3 kez deneme yapan bir politika
var retryPolicy = HttpPolicyExtensions
    .HandleTransientHttpError()
    .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));

// Bu politikayı HttpClientFactory ile entegre edebilirsiniz.

Sonuç

C# ile RESTful API üzerinden JSON verisi işlemek, .NET'in sunduğu güçlü kütüphaneler sayesinde oldukça verimli bir süreçtir. Bu rehberde öğrendiğiniz HttpClient kullanımı, JSON serileştirme teknikleri ve hata yönetimi stratejileri, profesyonel bir yazılım geliştirme sürecinin temel taşlarıdır. Bir sonraki adım olarak, asenkron programlamayı (async/await) daha derinlemesine inceleyebilir ve API'niz için bir "Service Layer" mimarisi kurarak kodunuzun sürdürülebilirliğini artırabilirsiniz.

Bu yazıya tepkinizi paylaşın:
Zeynep Arslan

Kullanıcı deneyimi odaklı içerik üretiminde uzmanlaşmış bir editörüm. Özellikle DIY projeleri ve teknik rehberler üzerine detaylı içerikler üretiyorum.

Yorumlar (0)

Yorum Yaz