C# ile Hava Durumu Uygulaması Yapımı — API Entegrasyonu
C# öğrenmenin en iyi yolu gerçek bir proje yapmaktır, Hava durumu uygulaması da bu iş için mükemmel bir başlangıç noktası: hem API kullanmayı öğretir, hem JSON işlemeyi, hem de Windows Forms ile arayüz geliştirmeyi. Bu yazıda sıfırdan çalışan bir C# hava durumu uygulaması yapacağız.
Hazırsan başlayalım!
İÇİNDEKİLER
- 1 Projede Neler Öğreneceksin?
- 2 Gereksinimler
- 3 Adım 1 — Proje Oluşturma ve NuGet Paketi Kurulumu
- 4 Adım 2 — API Anahtarı Alma
- 5 Adım 3 — Veri Modelini Oluşturma
- 6 Adım 4 — API Servis Sınıfı
- 7 Adım 5 — Windows Forms Arayüzü
- 8 Adım 6 — Form Kodunu Yazma
- 9 Projeyi Çalıştır ve Test Et
- 10 Sık Karşılaşılan Hatalar ve Çözümleri
- 11 Projeyi Geliştirmek İçin Fikirler
- 12 Sonuç
Projede Neler Öğreneceksin?
Bu proje boyunca şu konulara hakim olacaksın:
- REST API nedir, nasıl çağrılır
- HttpClient ile web istekleri atmak
- JSON verisini C# nesnelerine dönüştürmek (Newtonsoft.Json)
- Windows Forms ile basit bir arayüz tasarlamak
- async/await ile asenkron programlama temelleri
Bu becerilerin hepsi iş dünyasında sıklıkla kullanılan, CV’ne değer katan beceriler. Tek bir proje ile hepsini pratiğe dökeceğiz.
Gereksinimler
Başlamadan önce şunlara ihtiyacın var:
- Visual Studio 2022 (Community sürümü ücretsiz)
- .NET 6.0 veya üzeri
- Ücretsiz bir OpenWeatherMap hesabı ve API anahtarı
- Temel C# bilgisi (değişkenler, metotlar, sınıflar)
Not: OpenWeatherMap’in ücretsiz planı günde 1.000 istek hakkı veriyor. Bu proje için fazlasıyla yeterli.
Adım 1 — Proje Oluşturma ve NuGet Paketi Kurulumu
Visual Studio’yu aç, yeni bir Windows Forms App (.NET) projesi oluştur. Proje adı olarak HavaDurumuApp kullanabilirsin.
Sonra NuGet Paket Yöneticisi’ni aç (Tools → NuGet Package Manager → Manage NuGet Packages) ve şu paketi yükle:
|
1 2 |
Newtonsoft.Json |
Bu paket, API’den gelen JSON verisini C# nesnelerine kolayca dönüştürmemizi sağlayacak.
Adım 2 — API Anahtarı Alma
OpenWeatherMap sitesine gidip ücretsiz hesap oluştur. Kayıt sonrası API Keys sekmesinde sana bir anahtar verilecek. Bu anahtarı kopyalayıp bir yere not et — birazdan kullanacağız.
API anahtarın şuna benzer bir formatta olacak:
|
1 2 |
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6 |
⚠️ Güvenlik notu: API anahtarını asla GitHub gibi herkese açık platformlara yükleme. Gerçek projelerde bu tür hassas bilgileri
.envdosyasında veyaappsettings.jsoniçinde tutmalısın.
Adım 3 — Veri Modelini Oluşturma
OpenWeatherMap API’sinin döndürdüğü JSON verisini karşılayacak C# sınıflarını oluşturalım. Projeye yeni bir sınıf dosyası ekle (WeatherData.cs):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
using Newtonsoft.Json; namespace HavaDurumuApp { public class WeatherData { [JsonProperty("name")] public string CityName { get; set; } [JsonProperty("main")] public MainInfo Main { get; set; } [JsonProperty("weather")] public List<WeatherInfo> Weather { get; set; } [JsonProperty("wind")] public WindInfo Wind { get; set; } } public class MainInfo { [JsonProperty("temp")] public double Temperature { get; set; } [JsonProperty("feels_like")] public double FeelsLike { get; set; } [JsonProperty("humidity")] public int Humidity { get; set; } } public class WeatherInfo { [JsonProperty("description")] public string Description { get; set; } } public class WindInfo { [JsonProperty("speed")] public double Speed { get; set; } } } |
Bu sınıflar API’den gelen JSON alanlarını ("name", "temp", "humidity" vb.) doğrudan C# özelliklerine bağlıyor. [JsonProperty] attribute’u bu eşleştirmeyi yapıyor.
Adım 4 — API Servis Sınıfı
Şimdi API ile iletişimi yönetecek servis sınıfını yazalım. WeatherService.cs adında yeni bir dosya ekle:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
using System.Net.Http; using Newtonsoft.Json; namespace HavaDurumuApp { public class WeatherService { private readonly HttpClient _httpClient; private const string ApiKey = "BURAYA_API_ANAHTARINI_YAZ"; private const string BaseUrl = "https://api.openweathermap.org/data/2.5/weather"; public WeatherService() { _httpClient = new HttpClient(); } public async Task<WeatherData> GetWeatherAsync(string cityName) { string url = $"{BaseUrl}?q={cityName}&appid={ApiKey}&units=metric&lang=tr"; HttpResponseMessage response = await _httpClient.GetAsync(url); if (!response.IsSuccessStatusCode) { throw new Exception($"Şehir bulunamadı veya API hatası: {response.StatusCode}"); } string jsonContent = await response.Content.ReadAsStringAsync(); WeatherData weatherData = JsonConvert.DeserializeObject<WeatherData>(jsonContent); return weatherData; } } } |
URL’deki parametreleri açıklayalım:
q={cityName}→ sorguladığımız şehir adıappid={ApiKey}→ kimlik doğrulamaunits=metric→ sıcaklığı Celsius cinsinden almak içinlang=tr→ hava durumu açıklamalarını Türkçe almak için
Adım 5 — Windows Forms Arayüzü
Form1.cs tasarım görünümünü aç ve şu bileşenleri ekle:
| Bileşen | Name | Text / Placeholder |
|---|---|---|
| TextBox | txtCity |
“Şehir adı girin…” |
| Button | btnSearch |
“Sorgula” |
| Label | lblCityName |
— |
| Label | lblTemperature |
— |
| Label | lblDescription |
— |
| Label | lblHumidity |
— |
| Label | lblWind |
— |
| Label | lblError |
— |
Adım 6 — Form Kodunu Yazma
Form1.cs kod görünümüne geçip şu kodu yaz:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
using System; using System.Windows.Forms; namespace HavaDurumuApp { public partial class Form1 : Form { private readonly WeatherService _weatherService; public Form1() { InitializeComponent(); _weatherService = new WeatherService(); } private async void btnSearch_Click(object sender, EventArgs e) { string cityName = txtCity.Text.Trim(); if (string.IsNullOrEmpty(cityName)) { lblError.Text = "Lütfen bir şehir adı girin."; return; } try { lblError.Text = "Yükleniyor..."; btnSearch.Enabled = false; WeatherData data = await _weatherService.GetWeatherAsync(cityName); // Verileri ekranda göster lblCityName.Text = $"📍 {data.CityName}"; lblTemperature.Text = $"🌡️ {data.Main.Temperature:F1}°C " + $"(Hissedilen: {data.Main.FeelsLike:F1}°C)"; lblDescription.Text = $"☁️ {data.Weather[0].Description}"; lblHumidity.Text = $"💧 Nem: %{data.Main.Humidity}"; lblWind.Text = $"💨 Rüzgar: {data.Wind.Speed} m/s"; lblError.Text = string.Empty; } catch (Exception ex) { lblError.Text = $"Hata: {ex.Message}"; } finally { btnSearch.Enabled = true; } } private void txtCity_KeyPress(object sender, KeyPressEventArgs e) { // Enter tuşuna basınca da sorgu yapsın if (e.KeyChar == (char)Keys.Enter) { btnSearch_Click(sender, e); } } } } |
Projeyi Çalıştır ve Test Et
Artık F5 tuşuna basıp projeyi çalıştırabilirsin. Arama kutusuna “Istanbul”, “Ankara” veya “Izmir” yaz ve “Sorgula” butonuna bas. Birkaç saniye içinde ekranda güncel hava durumu bilgileri belirecek.
Çalışıyorsa tebrikler — ilk API entegrasyonunu başarıyla tamamladın! 🎉
Sık Karşılaşılan Hatalar ve Çözümleri
“401 Unauthorized” hatası alıyorum: API anahtarını yeni oluşturduysan etkinleşmesi 10-15 dakika sürebilir. Bir süre bekleyip tekrar dene.
“404 Not Found” hatası alıyorum: Şehir adını İngilizce yazmayı dene. Örneğin “Istanbul” yerine “Istanbul, TR” formatını kullan.
Uygulama donuyor: async/await kullanımında bir sorun var demektir. btnSearch_Click metodunun async void olarak tanımlandığından emin ol.
Projeyi Geliştirmek İçin Fikirler
Bu projeyi daha da ileri taşıyabilirsin:
- 5 günlük hava tahmini ekle (OpenWeatherMap’in
/forecastendpoint’i) - Şehir geçmişi özelliği ile son aranan şehirleri kaydet
- Hava durumuna göre arka plan rengi değiştir (güneşliyse sarı, yağmurluysa gri)
- Sistem tepsisine (system tray) küçült ve arka planda çalıştır
- Uygulamayı WPF ile yeniden yaz ve daha modern bir arayüz tasarla
Sonuç
Bu projede sadece bir hava durumu uygulaması yapmadın. HttpClient ile API çağırmasını, JSON verisini parse etmeyi, async/await ile asenkron programlamayı ve Windows Forms ile arayüz geliştirmeyi öğrendin. Bunların hepsi gerçek iş projelerinde her gün kullandığın beceriler.
Kodlarınla ilgili sorularını veya projeye eklediğin yeni özellikleri forumda paylaşmayı unutma — MühendisinEvi topluluğu olarak birlikte öğreniyoruz!
Üye değil misin? Hemen kayıt ol, her haftaki yeni proje içeriklerini kaçırma.
İlgili Yazılar (İç Bağlantılar):
Dış Bağlantılar (Kaynaklar):
