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.
Görev
KolayWeb 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
MockResponseWriteryapısı oluştur. Yanıt gövdesini bir dize olarak saklamalı ve gövdeye veri ekleyen birWrite(data []byte) (int, error)yöntemi uygulamalı. Biriken yanıtı almak için birBody() stringyöntemi ekle.Bir HTTP isteğini simüle etmek için
MockRequestvePathdize alanlarına sahip birMethodyapısı oluştur.Şimdi
http.Handlerarayüzü modelini uygulayan (birServeHTTPve*MockResponseWriteralan bir*MockRequestyöntemiyle) iki işleyici yapısı oluştur:WelcomeHandleradlı yapı, birMessagealanına sahiptir ve mesajı, ardından istek yolunu yazarMethodHandleradlı 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ü (
welcomeveyamethod) 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
ServeHTTPyöntemini çağır. Yanıt gövdesini yazdır.
Aşağıdaki girdiler sağlanacaktır:
- 1. satır: İşleyici türü (
welcomeveyamethod) - 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 supportedBu 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())
}
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
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı11Standart Kütüphane ve OOP
io.Reader ve io.Writersort.Interface Arayüzüfmt.Stringer ArayüzüStruct'lar ile encoding/jsonhttp.Handler ArayüzüÖzet - REST API Modelleri3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker PoolKendi başına pratik yap: Online Go derleyicisi