JavaScript aktifken sayfa daha iyi gözükür.

#1 Go'da Hava Durumu Uygulaması Yazalım

 ·  ☕ 5 dk okuma süresi  ·  🐧 ksckaan1

Bu yazıda sizlere Go programlama dilinde Webview ve Statik kütüphanesini kullanarak nasıl masaüstü uygulaması yazabileceğimizi anlatacağım.

Bu programın yazımını seri halinde paylaşacağım. Birkaç bölümden oluşacak.

Öncelikle kullanacağım kütüphanelerden biraz bahsedeyim.

Webview

Webview kütüphanesi ile web sayfası oluşturarak, bu sayfayı bir uygulama olarak gösteriyoruz. Tıpkı bir tarayıcı mantığı gibi. Webview kütüphanesi pencereyi oluşturmamızı, ön ve arka ucun haberleşmesini sağlıyor.

Statik

Statik kütüphanesi ise dosya ve klasörleri şifreleyip programa iliştirmemizi sağlıyor. Yani normalde programın çalıştırılabilir dosyasının dizininde bulunduracağımız resim, ses, html, css ve js gibi dosyalarımızı uygulama içerisine gömmemize yarıyor. Böylece program derklendikten sonra bu kaynaklara ihtiyacımız olmayacak.

Uygulama Hakkında

Aslında uygulamayı başta sqlite3 kullanan bir To-Do uygulaması yapmayı düşünüyordum. Sonra herkes To-Do App yapmak zorunda mı diyerek, JSON data çeken bir hava durumu uygulaması yapayım dedim. Böylece JSON örneği de yapmış oluruz.

Hava durumlarını ücretsiz olarak json formatında çekebileceğimiz bir site buldum.

İşte bu site => Weather API

Üye oldum ve bana bir API anahtarı verdi. Hesap ücretsiz olduğu için burada da paylaşacağım bu anahtarı zaten.

Örnek bir istek adresi:

https://api.weatherapi.com/v1/current.json?key=8421aae0c3c74077b37164423201210&q=trabzon

Yukarıdaki adrese istek atarak Trabzon’un hava durumunu öğrenebileceğiz.

Kod Yazmaya Başlayalım

Bir proje klasörü ve içerisine main.go dosyası oluşturalım.

Go tarafında JSON verimizi kaydedilmemiz için bir struct oluşturmamız gerekiyor. Bunun içinde JSON dosyamızı incelememiz gerekiyor. JSON datamız şöyle bir çıktı verecektir.

 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
{
  "location": {
    "name": "Trabzon",
    "region": "Trabzon",
    "country": "Turkey",
    "lat": 41.01,
    "lon": 39.73,
    "tz_id": "Europe/Istanbul",
    "localtime_epoch": 1602522191,
    "localtime": "2020-10-12 20:03"
  },
  "current": {
    "last_updated_epoch": 1602521110,
    "last_updated": "2020-10-12 19:45",
    "temp_c": 22,
    "temp_f": 71.6,
    "is_day": 1,
    "condition": {
      "text": "Sunny",
      "icon": "//cdn.weatherapi.com/weather/64x64/day/113.png",
      "code": 1000
    },
    "wind_mph": 5.6,
    "wind_kph": 9,
    "wind_degree": 150,
    "wind_dir": "SSE",
    "pressure_mb": 1015,
    "pressure_in": 30.4,
    "precip_mm": 0,
    "precip_in": 0,
    "humidity": 78,
    "cloud": 0,
    "feelslike_c": 24.5,
    "feelslike_f": 76.1,
    "vis_km": 10,
    "vis_miles": 6,
    "uv": 6,
    "gust_mph": 7.4,
    "gust_kph": 11.9
  }
}

Ben örnek uzasın istemediğim için sadece şehir ismi, ülke ismi, sıcaklık, hava durumu ve hava durumu ikonunu kullanacağım.

İsteklerim de aşağıdaki verilere tekabül ediyor.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
    "location": {
        "name": "Trabzon",
        "country": "Turkey"
    },
    "current": {
        "temp_c": 22,
        "condition": {
            "text": "Sunny",
            "icon": "//cdn.weatherapi.com/weather/64x64/day/113.png"
        }
    }
}

Yukarıdaki veriler benim uygulamam için yeterli olacak.

main.go dosyamızda yukarıdaki json yapımızın structlarını oluşturalım. Yukarıdaki yapımız için 4 tane struct oluşturmak işimizi görüyor. Struct’larımızı oluşturalım.

 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

// Bu bizim ana structımız
// JSON nesnemizin temelinde bu struct olacak
type Şehir struct {
	Knm Konum `json:"location"`
	Drm Durum `json:"current"`
}

//json'daki location bölümünü oluşturalım
type Konum struct {
	İsim string `json:"name"`
	Ülke string `json:"country"`
}

//json'dali current bölümü
type Durum struct {
	Sıcaklık float64    `json:"temp_c"`
	HDrumu   HavaDurumu `json:"condition"`
}

//json'daki contidion bölümü için
type HavaDurumu struct {
	Metin string `json:"text"`
	İkon  string `json:"icon"`
}

Struct’ların içindeki değişkenlerin yanında JSON’daki verilemizde hangi bölümü temsil ettiğini belirmemiz gerekiyor. Bu sayede JSON’daki veriyi programımıza ayrıştırabiliriz.

Daha sonra main() fonksiyonumun içerisinde json’a sorgu atma işlemini yapalım.

 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
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

// Bu bizim ana structımız
// JSON nesnemizin temelinde bu struct olacak
type Şehir struct {
	Knm Konum `json:"location"`
	Drm Durum `json:"current"`
}

//json'daki location bölümünü oluşturalım
type Konum struct {
	İsim string `json:"name"`
	Ülke string `json:"country"`
}

//json'dali current bölümü
type Durum struct {
	Sıcaklık float64    `json:"temp_c"`
	HDrumu   HavaDurumu `json:"condition"`
}

//json'daki contidion bölümü için
type HavaDurumu struct {
	Metin string `json:"text"`
	İkon  string `json:"icon"`
}

func main() {
	//Hava durumu api'ına sorgu gerçekleştirelim.
	// _ değişkeni yerine hata değişkeni oluşturabilirsiniz.
	cevap, _ := http.Get("https://api.weatherapi.com/v1/current.json?key=8421aae0c3c74077b37164423201210&q=trabzon")

	//main() fonksiyonunun sonunda sorgu işleminin
	//kapanmasını isteyelim.
	defer cevap.Body.Close()

	//cevap değişkenindeki body kısmını yani json verimizin
	//bulunduğı kısmı jsonVeri değişkenine atıyoruz.
	jsonVeri, _ := ioutil.ReadAll(cevap.Body)

	//tabi ki bu beri byte tipindedir. okuyabilmemiz için
	//önce string'e dönüştürmeliyiz.
	fmt.Println(string(jsonVeri))
}

Programızın çıktısı en baştaki örnek JSON dosyamız gibi olacaktır. Tabi ki komut satırında görüntülediğimiz için daha karışık bir çıktımız olacak.

main() fonksiyonumuzun içerisinde JSON Unmarshall işlemi yapalım. Bunun için öncelikle encoding/json paketini içe aktarmalıyız.

1
import "encoding/json"

Yukarıdaki örnekte JsonVeri değişkenini ekrana bastırmayacağız. Bunun için ekrana bastırdığımız tarafın kodlarını silelim.

JSON Unmarshall işlemi direkt byte tipinde iken yapacağız.

 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
package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

type Şehir struct {
	Knm Konum `json:"location"`
	Drm Durum `json:"current"`
}
type Konum struct {
	İsim string `json:"name"`
	Ülke string `json:"country"`
}
type Durum struct {
	Sıcaklık float64    `json:"temp_c"`
	HDrumu   HavaDurumu `json:"condition"`
}
type HavaDurumu struct {
	Metin string `json:"text"`
	İkon  string `json:"icon"`
}

func main() {
	cevap, _ := http.Get("https://api.weatherapi.com/v1/current.json?key=8421aae0c3c74077b37164423201210&q=trabzon")

	defer cevap.Body.Close()
	jsonVeri, _ := ioutil.ReadAll(cevap.Body)

	//Şehir tipinde şehirVeri değişkeni oluşturalım.
	//Ayrıştırdığımız JSON verisini bu
	//değişkene atayacağız.
	var şehirVeri Şehir

	//Unmarshall fonksiyonunda byte tipindeki jsonVeri'yi
	//şehirVeri nesnesini & ile bellek adresini veriyoruz.
	hata := json.Unmarshal(jsonVeri, &şehirVeri)

	//hata sorgulama
	if hata != nil {
		log.Println(hata)
	}

	//Ekrana şehirVeri'deki ülke bilgisini bastıralım.
	fmt.Println("ülke:", şehirVeri.Knm.Ülke)

	//Diğer Örnekler
	fmt.Println("şehir:", şehirVeri.Knm.İsim)
	fmt.Println("derece:", şehirVeri.Drm.Sıcaklık)
	fmt.Println("metin:", şehirVeri.Drm.HDrumu.Metin)
	fmt.Println("icon_adresi:", şehirVeri.Drm.HDrumu.İkon)

}

Buraya kadar JSON dosyasını çekmeyi ve parse etmeyi gördük. Serinin devamında Webview ve Statik kütüphanesi ile yapacaklarımıza değineceğim.

Şurada Paylaş