Go ile basit web uygulaması nasıl geliştirilir, bunu anlatacağız. Neden Go dilini tercih ediyoruz? Bu belgemizde bir web uygulamasını ayağa kaldırıyoruz!

Bugün Go dili ile nasıl basit bir web uygulaması geliştiririz bunu öğreneceğiz. Go dilini kurmak için buradaki yazımızı inceleyebilirsiniz.

Neden Go dilini tercih ediyoruz?

Bir web sitesini ayağa kaldırmak için diğer dillerde çok fazla yardımcı paketler, bu paketleri de kurmak için paket yöneticilerine ihtiyaç duyarız. Go dilinin kendi içerisinde çok güçlü bir http paketi bulunmaktadır. En azından başlangıç için bu yeterlidir.

Web uygulamamızı ayağa kaldıralım

main() fonksiyonuna web uygulamasının ayağa kalkmasını sağlayan ve routing (yönlendirme) işlemlerini yazıyoruz.

func main() {
    mux := http.NewServeMux()
    mux.Handle("/public/", logging(public()))
    mux.Handle("/", logging(index()))

    port, ok := os.LookupEnv("PORT")
    if !ok {
        port = "8080"
    }

    addr := fmt.Sprintf(":%s", port)
    server := http.Server{
        Addr:         addr,
        Handler:      mux,
        ReadTimeout:  15 * time.Second,
        WriteTimeout: 15 * time.Second,
        IdleTimeout:  15 * time.Second,
    }
    log.Println("main: running simple server on port", port)
    if err := server.ListenAndServe(); err != nil {
        log.Fatalf("main: couldn't start simple server: %v\n", err)
    }
}

Adım adım kodları inceleyelim.

mux := http.NewServeMux()

Bu kodu basitçe anlatmak gerekirse uygulamayı bu kod ile oluşturuyoruz. Bu web uygulamasının oluşumu için Go dilinin kendi içerisinde yer alana http paketinden yararlanıyoruz.

mux.Handle("/public/", logging(public()))
mux.Handle("/", logging(index()))

Buradaki kodlar sayesinde routing (yönlendirme) işlemlerini gerçekleştiriyoruz. İlk satırda gördüğünüz gibi “/public/” yönlendirilmesi uygulanmakta. Bir başka deyişle, tarayıcıdan örnek.com**/public/ ** sorgusu yapıldığında verilecek cevaba yönlendiriyoruz. Hemen yanında gördüğünüz gibi logging fonksiyonu ile loglama karşılığında public() fonksiyonu çalışmakta. public() fonksiyonuna daha sonra göz atacağız.

port, ok := os.LookupEnv("PORT")
if !ok {
    port = "8080"
}

Bu kısımda önce uygulama adına herhangi bir port atanmış mı, bu kontrol edilir. Eğer atanmamışsa 8080 uygulamamızın portu olarak belirlenir.

addr := fmt.Sprintf(":%s", port)
    server := http.Server{
        Addr:         addr,
        Handler:      mux,
        ReadTimeout:  15 * time.Second,
        WriteTimeout: 15 * time.Second,
        IdleTimeout:  15 * time.Second,
    }
log.Println("main: running simple server on port", port)

Bu kısımda uygulamamızı yayına aldığımızda hangi port üzerinden yayına alacağımızı belirledikten sonra geri kalan ayarlar ile server değişkenine atanır. Uygulamayı kullanacak olan kişiye hangi portun açıldığını göstermek adına bu bilgi log.Println() fonksiyonu ile loglanır.

if err := server.ListenAndServe(); err != nil {
    log.Fatalf("main: couldn't start simple server: %v\n", err)
}

Bu kısım ile uygulamayı ayağa kaldırıp dinlemeye alıyoruz. Hata Yakalama ile herhangi bir problemin gerçekleşmesine karşı logluyoruz.

Şimdi de ana fonksiyonun çalışması için gerekli yan fonksiyonları inceleyelim.

func logging(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        start := time.Now()
        req := fmt.Sprintf("%s %s", r.Method, r.URL)
        log.Println(req)
        next.ServeHTTP(w, r)
        log.Println(req, "completed in", time.Now().Sub(start))
    })
}

Burada istek atıldığında istek tipi zamanı ve ne kadar sürede tamamlandığını yazdırmakta.

func public() http.Handler {
    return http.StripPrefix("/public/", http.FileServer(http.Dir("./public")))
}

Bu kısımda ana fonksiyonda ki public() fonksiyonunun detayları bulunmakta. Web uygulama üzerinde public sayfası çağırıldığında /public/ yönlendirilmesi yapılmakta.

var templates = template.Must(template.ParseFiles("./templates/base.html", "./templates/body.html"))

// index is the handler responsible for rending the index page for the site.
func index() http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        b := struct {
            Title        template.HTML
            BusinessName string
            Slogan       string
        }{
            Title:        template.HTML("Business | Landing"),
            BusinessName: "Business,",
            Slogan:       "we get things done.",
        }
        err := templates.ExecuteTemplate(w, "base", &b)
        if err != nil {
            http.Error(w, fmt.Sprintf("index: couldn't parse template: %v", err), http.StatusInternalServerError)
            return
        }
        w.WriteHeader(http.StatusOK)
    })
}

Bu kısımda ise ana sayfayı yapılandırıyor olacağız. Ana sayfa çağırıldığında /templates/base.html dosyasına yönlendiriyoruz. Altta tekrarda hata yakalama ile herhangi olası dosya kaybına karşı da kullanıcıya hatayı gösteriyoruz.

Sonuç

Son olarak belirtmeliyiz ki, Go dili diğer dillere kıyasla daha basit bir şekilde eb uygulamasını ayağa kaldırabiliyor. Tüm kodlara ulaşmak için lütfen buraya tıklayın. Dosyaları indirdikten sonra proje dizininde aşağıda ki kod ile basit web uygulamamızı ayağa kaldırabiliriz.

go run main.go

Eğer kodu hazır indirmeden kendiniz yazmayı düşünüyorsanız, hazır resim ve html kodları için public ve templates klasörlerini eklemeyi unutmayınız.