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 SecretsveyaAzure Key Vaultgibi 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.


Yorumlar (0)
Yorum Yaz