CodeBlanks Logo Icon CodeBlanks

http.HandleFunc

HandleFunc ile yol karşılığı öğrenirsin.

http.HandleFunc ve ServeMux

http.ServeMux gelen isteği yola göre doğru işleyiciye yönlendirir. Go 1.22 ile kalıplar yöntem ve yol değişkeni içerebilir:

mux := http.NewServeMux()
mux.HandleFunc("GET /urunler", liste)
mux.HandleFunc("POST /urunler", ekle)
mux.HandleFunc("GET /urunler/{id}", getir)
mux.Handle("/statik/", http.StripPrefix("/statik/", http.FileServer(http.Dir("web"))))
http.ListenAndServe(":8080", mux)

/ ile biten kalıp alt yolları da yakalar; en özel (uzun) kalıp kazanır.

Sunucu ayarları

http.ListenAndServe zaman aşımı içermez; yavaş istemciler bağlantıları sonsuza dek tutabilir. Üretimde bir http.Server yapılandırılır:

srv := &http.Server{
    Addr:              ":8080",
    Handler:           mux,
    ReadHeaderTimeout: 5 * time.Second,
    ReadTimeout:       10 * time.Second,
    WriteTimeout:      15 * time.Second,
    IdleTimeout:       60 * time.Second,
}
log.Fatal(srv.ListenAndServe())

Uygulama Rotalar

Bir ServeMux'a "GET /merhaba/{ad}" rotasını ekle; "Merhaba " + r.PathValue("ad") yazsın. /merhaba/Ada için GET ve POST istekleri gönder; GET gövdesini ve POST'un durum kodunu yazdır.

Başlangıç kodu

main.go
package main

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

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

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

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("GET /merhaba/{ad}", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Merhaba "+r.PathValue("ad"))
    })
    get := httptest.NewRecorder()
    mux.ServeHTTP(get, httptest.NewRequest("GET", "/merhaba/Ada", nil))
    post := httptest.NewRecorder()
    mux.ServeHTTP(post, httptest.NewRequest("POST", "/merhaba/Ada", nil))
    fmt.Println(get.Body.String())
    fmt.Println(post.Code)
}

Beklenen çıktı

Merhaba Ada
405

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 <code>"GET /urunler"</code> kalıbına <code>POST</code> isteği gelirse ne olur?

  • İşleyici yine çalışır
  • 404 döner
  • Sunucu çöker
  • 405 Method Not Allowed döner Doğru cevap

Açıklama: Go 1.22 ServeMux yol eşleşip yöntem eşleşmediğinde otomatik olarak 405 ve Allow başlığı döndürür.

2 Rota kaydet

Soru
mux := http.NewServeMux()
mux.____("GET /saglik", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("ok"))
})
Cevap
mux := http.NewServeMux()
mux.HandleFunc("GET /saglik", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("ok"))
})

Açıklama: HandleFunc bir fonksiyonu kalıba işleyici olarak kaydeder.

3 Kalıp ve eşleşen yol

Kavram Anlamı
"GET /urunler" Yalnızca GET /urunler
"/statik/" /statik/ altındaki her şey
"GET /urunler/{id}" /urunler/7
"/" Eşleşmeyen tüm yollar

Orta seviye bölümündeki tüm dersler