Menu
Coddy logo textTech

http.Handler Arayüzü

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 77 / 107.

http.Handler arayüzü, Go'nun web sunucusu mimarisinin temelidir. HTTP isteklerinin nasıl işlendiğini tanımlar ve bunu uygulayan her tür web isteklerine hizmet verebilir.

Arayüz oldukça basittir:

type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
}

ServeHTTP yöntemine sahip herhangi bir tür, HTTP isteklerini işleyebilir. İşte özel bir işleyici:

type GreetHandler struct {
    Greeting string
}

func (h GreetHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "%s, visitor!", h.Greeting)
}

Bu işleyiciyi bir sunucuyla doğrudan kullanabilirsiniz:

handler := GreetHandler{Greeting: "Welcome"}
http.Handle("/greet", handler)

Daha basit durumlar için Go, normal bir işlevi bir işleyiciye dönüştürmenizi sağlayan bir tür olan http.HandlerFunc sağlar:

func hello(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello!")
}

http.Handle("/hello", http.HandlerFunc(hello))

Bu arayüzün gücü, işleyicilerin diğer işleyicileri sarmalayabildiğini fark ettiğinizde ortaya çıkar. Bu, özgün işleyici mantığını değiştirmeden günlük kaydı, kimlik doğrulama veya diğer yatay kesen kaygıları ekleyebileceğiniz ara katman yazılımı kalıplarını mümkün kılar.

challenge icon

Görev

Kolay

Web isteklerinin nasıl işlendiğini simüle eden basit bir HTTP işleyici sistemi oluşturalım! Bu ortamda gerçek bir HTTP sunucusu çalıştıramadığımız için http.Handler arayüzünü uygulayan işleyiciler oluşturacak ve sahte istek/yanıt nesneleriyle çalışarak istekleri nasıl işlediklerini göstereceksin.

Kodunu iki dosyaya ayıracaksın:

  • handlers.go: Özel HTTP işleyicilerini tanımla.

    Bir HTTP yanıtına yazılacak verileri yakalayan bir MockResponseWriter yapısı oluştur. Yanıt gövdesini bir dize olarak saklamalı ve gövdeye veri ekleyen bir Write(data []byte) (int, error) yöntemi uygulamalı. Biriken yanıtı almak için bir Body() string yöntemi ekle.

    Bir HTTP isteğini simüle etmek için MockRequest ve Path dize alanlarına sahip bir Method yapısı oluştur.

    Şimdi http.Handler arayüzü modelini uygulayan (bir ServeHTTP ve *MockResponseWriter alan bir *MockRequest yöntemiyle) iki işleyici yapısı oluştur:

    • WelcomeHandler adlı yapı, bir Message alanına sahiptir ve mesajı, ardından istek yolunu yazar
    • MethodHandler adlı yapı, istek yöntemine göre farklı yanıtlar yazar: GET için "Fetching data", POST için "Creating resource" ve diğer tüm yöntemler için "Method not supported"
  • main.go: İstekleri işleyicilerin üzerinden geçir.

    Bir işleyici türünü (welcome veya method) ve ardından istek ayrıntılarını oku. Welcome işleyicisi için karşılama mesajını da oku.

    Uygun işleyiciyi oluştur, sahte bir istek oluştur ve işlemek için ServeHTTP yöntemini çağır. Yanıt gövdesini yazdır.

Aşağıdaki girdiler sağlanacaktır:

  • 1. satır: İşleyici türü (welcome veya method)
  • 2. satır: İstek yolu
  • 3. satır: İstek yöntemi
  • 4. satır (yalnızca welcome için): Karşılama mesajı

Örneğin, şu girdi verildiğinde:

welcome
/home
GET
Hello from

Çıktın şu olmalıdır:

Hello from /home

Şu girdi verildiğinde:

method
/api/users
POST

Çıktın şu olmalıdır:

Creating resource

Şu girdi verildiğinde:

method
/api/data
GET

Çıktın şu olmalıdır:

Fetching data

Şu girdi verildiğinde:

method
/api/items
DELETE

Çıktın şu olmalıdır:

Method not supported

Bu görev, http.Handler arayüzünün temel kavramını gösterir: ServeHTTP yöntemine sahip herhangi bir tür istekleri işleyebilir. Gerçek uygulamalarda http.ResponseWriter ve *http.Request, Go'nun standart kütüphanesinden gelir; ancak işleyicileri uygulama modeli tamamen aynı kalır.

Kendin dene

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// İşleyici türünü oku
	scanner.Scan()
	handlerType := scanner.Text()
	
	// İstek yolunu oku
	scanner.Scan()
	path := scanner.Text()
	
	// İstek metodunu oku
	scanner.Scan()
	method := scanner.Text()
	
	// Sahte istek oluştur
	request := &MockRequest{
		Path:   path,
		Method: method,
	}
	
	// Sahte yanıt yazıcısı oluştur
	response := &MockResponseWriter{}
	
	// TODO: handlerType'a göre uygun işleyiciyi oluştur
	// handlerType "welcome" ise, hoş geldin mesajını oku ve WelcomeHandler oluştur
	// handlerType "method" ise, MethodHandler oluştur
	// İşleyici üzerinde response ve request ile ServeHTTP'yi çağır
	
	if handlerType == "welcome" {
		scanner.Scan()
		message := scanner.Text()
		// TODO: mesaj ile WelcomeHandler oluştur ve ServeHTTP'yi çağır
		_ = message // Uygularken bu satırı kaldır
	} else if handlerType == "method" {
		// TODO: MethodHandler oluştur ve ServeHTTP'yi çağır
	}
	
	// Yanıt gövdesini yazdır
	fmt.Println(response.Body())
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Go derleyicisi