Go ile Temel HTTP Web Sunucusu Geliştirme

Go ile web sunucusu yazmak, mutfağa girip “Ben bugün internet pişireceğim” demek gibidir: az malzemeyle şaşırtıcı derecede doyurucu sonuç alırsın. Go’nun standart kütüphanesindeki net/http paketi, harici framework kurmadan HTTP isteklerini dinleyen, yönlendiren ve yanıtlayan sade ama güçlü bir sunucu ayağa kaldırmamızı sağlar. ``

HTTP Mantığını Kısaca Isıtalım

HTTP, istemci ile sunucu arasında yapılan istek-yanıt tabanlı bir protokoldür. Tarayıcı istemcidir; Go ile yazdığımız uygulama ise sunucudur. İstemci “Bana / adresini ver” der, sunucu da “Buyur, içerik burada” diye yanıt döner.

Bu model basitçe şöyle düşünülebilir:

\[İstek + İşleyici = Yanıt\]

Daha teknik bir bakışla yanıt süresi şu şekilde modellenebilir:

\[T_{yanıt} = T_{ağ} + T_{işleme} + T_{veri}\]

Yani iyi bir web sunucusu yalnızca çalışmakla kalmaz; istekleri doğru yakalar, hızlı işler ve anlaşılır yanıt üretir.

Kavram Ne İşe Yarar? Go’daki Karşılığı
Client İstek gönderen taraf Tarayıcı, Postman, curl
Server İstekleri dinleyen uygulama http.ListenAndServe
Route URL yoluna göre yönlendirme /, /api, /hello
Handler İsteğe cevap veren fonksiyon http.HandleFunc
Response İstemciye dönen çıktı http.ResponseWriter

İlk Go HTTP Sunucusu

Aşağıdaki örnek, kök adrese gelen HTTP isteklerini karşılayan sade bir Go web sunucusudur:

package main

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

func homeHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Merhaba! Go HTTP sunucusu çalışıyor.")
}

func main() {
    http.HandleFunc("/", homeHandler)

    log.Println("Sunucu http://localhost:8080 üzerinde çalışıyor...")
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal(err)
    }
}

Bu kodda http.HandleFunc, belirli bir URL yolunu fonksiyona bağlar. / yoluna istek geldiğinde homeHandler çalışır. http.ResponseWriter, istemciye yanıt yazmamızı sağlar. *http.Request ise gelen isteğin metodunu, başlıklarını, yolunu ve gövdesini taşır.

Programı çalıştırmak için:

go run main.go

Ardından tarayıcıda http://localhost:8080 adresine gittiğinde mesajı görürsün. Tebrikler, artık kendi mini web sunucun var!

İstek Metodunu Kontrol Etmek

HTTP’de her istek aynı değildir. GET veri okumak, POST veri göndermek için kullanılır. Handler içinde metodu kontrol ederek daha bilinçli davranabiliriz:

func helloHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method != http.MethodGet {
        http.Error(w, "Sadece GET desteklenir", http.StatusMethodNotAllowed)
        return
    }

    name := r.URL.Query().Get("name")
    if name == "" {
        name = "Gopher"
    }

    fmt.Fprintf(w, "Merhaba, %s!", name)
}

Bu fonksiyon /hello?name=Ayse gibi bir istek aldığında kişiselleştirilmiş yanıt üretir. Boş gelirse varsayılan olarak Gopher der. Küçük ama üretim mantığına yakın bir davranış!

Yaklaşım Avantaj Ne Zaman Kullanılır?
Sadece / handler Çok basit ve hızlı Deneme, prototip
Çoklu route Daha düzenli yapı Küçük API’ler
Method kontrolü Güvenli davranış REST mantığı
JSON yanıt Modern istemcilerle uyum API geliştirme

JSON Yanıt Döndürmek

Web sunucuları çoğu zaman HTML değil JSON döndürür. Go’da bu da standart kütüphane ile mümkündür:

func statusHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    fmt.Fprintln(w, `{"status":"ok","message":"Sunucu ayakta"}`)
}

Header ayarı önemlidir; istemciye “Benim yanıtım JSON formatında” demiş oluruz. Bu küçük detay, API tüketen uygulamaların doğru davranmasını sağlar.

Sonuç

Go ile temel HTTP sunucusu geliştirmek, web’in çalışma mantığını öğrenmek için harika bir başlangıçtır. Framework kullanmadan route, handler, request, response ve method gibi temel kavramları çıplak gözle görürsün. Bu sayede ileride Gin, Echo veya Fiber gibi framework’lere geçtiğinde arka planda neler döndüğünü çok daha iyi anlarsın. Kısacası Go’nun net/http paketi, küçük projeler için yeterince sade; büyük fikirler içinse yeterince güçlüdür.

Yorumlar