Golang (net/http) Web Server Oluşturma

Go programlama dili, diğer pek çok modern programlama dilinde olduğu gibi base olarak birçok ihtiyaca yönelik hazırlanmış paketler ile hızlı bir şekilde geliştirme ortamının oluşturulabilmesini sağlamakta. Bu paketlerden biri de net/http paketi.

AA

Go dili içerisinde, built-in bir paket olan net/http oldukça pratik bir şekilde web server işlemleri gerçekleştirmemizi mümkün kılmakta1. Get, Head, Post, PostForm isteklerini HTTP ve HTTPS üzerinden gerçekleştirebilen http paketi ile ilgili olarak bu yazıda ListenAndServe örneğinden bahsedeceğim.

Temel kullanımı şu şekilde:

http.Handle("/foo", fooHandler)

http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
 fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})

log.Fatal(http.ListenAndServe(":8080", nil))

Temel uygulamamızda ise 9000 nolu port üzerinden URL path değerini sayfa içeriğine basacağız. O halde başlayalım.

Go http Paketi İle Web Server Oluşturma

Örnek işlemler süresince localhost üzerinden işlemlerinizi yürütebilirsiniz. Ben remote server üzerinden örneklendirmeyi paylaşacağım.

Aşağıdaki örnek en basit haliyle ornekwebsitesi-veya-ip-adresi:9000 üzerinden yayın yapmamızı mümkün kılmakta. İlgili post adresinden sonraki slash / işareti ardındaki değeri sayfadaki Current Value satırına ekleyeceğiz.

package main

import (
    "fmt"
    "net/http"
    "html"
    "log"
)

func urlHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Current Value: %s", html.EscapeString(r.URL.Path))
}

func main() {
    http.HandleFunc("/", urlHandler)
    log.Fatal(http.ListenAndServe(":9000", nil))
}

Yukarıdaki kodu çalıştırdığınızda go run *.go komutu ile 9000 portu üzerinden yayınlanan içeriği görüntüleyebilirsiniz.

İnternet tarayıcınızdan ilgili sayfayı açtığınızda karşınıza Current Value: yazısı çıkacaktır. URL kısmında, port sonrasına ekleyeceğiniz herhangi bir değerle /deneme vb. birlikte sayfa güncelleyerek ve Current Value: satırına eklenecektir.

Örnekte yer alan html paketi URL'e eklenen değerin düzenlenmesinde1, log ise olası bir hatanın loglanmasında kullanılmaktadır2. Daha basit bir yapı içerisinde örneğimizi şu şekilde de işleme alabiliriz.

package main

import (
    "fmt"
    "net/http"
)

func urlHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Current Value: %s", r.URL.Path)
}

func main() {
    http.HandleFunc("/", urlHandler)
    http.ListenAndServe(":9000", nil)
}

Her iki örnekte de yer alan r.URL.Path URL sonrasında eklenen değeri bize verecektir. İlgili değeri çekerken port sonrası değer alınacağı için veri / (slash) işaretini de kapsamaktadır. Şayet / (slash) işareti olmadan ilgili değeri kullanmak istersek r.URL.Path[1:] ile 1. karakter sonrasını seçebiliriz.