Antarmuka http.Handler
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 77 dari 107.
Interface http.Handler adalah dasar arsitektur server web Go. Interface ini menentukan cara permintaan HTTP diproses, dan tipe apa pun yang mengimplementasikannya dapat melayani permintaan web.
Antarmukanya sangat sederhana:
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}Setiap tipe yang memiliki method ServeHTTP dapat menangani permintaan HTTP. Berikut handler khusus:
type GreetHandler struct {
Greeting string
}
func (h GreetHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "%s, visitor!", h.Greeting)
}Kamu bisa menggunakan handler ini langsung dengan server:
handler := GreetHandler{Greeting: "Welcome"}
http.Handle("/greet", handler)Untuk kasus yang lebih sederhana, Go menyediakan http.HandlerFunc, tipe yang memungkinkan kamu mengubah fungsi biasa menjadi handler:
func hello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello!")
}
http.Handle("/hello", http.HandlerFunc(hello))Kekuatan antarmuka ini terlihat jelas saat kamu menyadari bahwa handler dapat membungkus handler lain. Hal ini memungkinkan pola middleware, sehingga kamu dapat menambahkan pencatatan log, autentikasi, atau hal lain yang berlaku lintas bagian tanpa mengubah logika handler asli.
Tantangan
MudahMari buat sistem handler HTTP sederhana yang menyimulasikan cara permintaan web diproses! Karena kita tidak bisa menjalankan server HTTP sungguhan di lingkungan ini, kamu akan membuat handler yang mengimplementasikan interface http.Handler dan menunjukkan cara handler tersebut memproses permintaan dengan menggunakan object permintaan/respons tiruan.
Kamu akan mengatur kodemu dalam dua file:
handlers.go: Definisikan handler HTTP kustommu.Buat struct
MockResponseWriteryang menangkap data yang akan ditulis ke respons HTTP. Struct ini harus menyimpan isi respons sebagai string dan mengimplementasikan methodWrite(data []byte) (int, error)yang menambahkan data ke isi respons. Tambahkan methodBody() stringuntuk mengambil respons yang sudah terkumpul.Buat struct
MockRequestdengan field stringPathdanMethoduntuk menyimulasikan permintaan HTTP.Sekarang buat dua struct handler yang mengikuti pola interface
http.Handlerdengan methodServeHTTPyang menerima*MockResponseWriterdan*MockRequest:WelcomeHandlerdengan fieldMessage, menulis pesan diikuti path permintaanMethodHandler, menulis respons berbeda berdasarkan method permintaan:"Fetching data"untuk GET,"Creating resource"untuk POST, dan"Method not supported"untuk yang lainnya
main.go: Proses permintaan melalui handler-mu.Baca tipe handler (
welcomeataumethod), lalu baca detail permintaan. Untuk handler welcome, baca juga pesan sambutannya.Buat handler yang sesuai, buat request tiruan, lalu panggil
ServeHTTPuntuk memprosesnya. Cetak isi respons.
Input berikut akan diberikan:
- Baris 1: Tipe handler (
welcomeataumethod) - Baris 2: Path permintaan
- Baris 3: Method permintaan
- Baris 4 (hanya untuk welcome): Pesan sambutan
Sebagai contoh, jika diberikan:
welcome
/home
GET
Hello fromOutputmu seharusnya:
Hello from /homeDan jika diberikan:
method
/api/users
POSTOutputmu seharusnya:
Creating resourceDan jika diberikan:
method
/api/data
GETOutputmu seharusnya:
Fetching dataDan jika diberikan:
method
/api/items
DELETEOutputmu seharusnya:
Method not supportedTantangan ini menunjukkan konsep inti interface http.Handler: tipe apa pun yang memiliki method ServeHTTP dapat menangani permintaan. Dalam aplikasi nyata, http.ResponseWriter dan *http.Request berasal dari standard library Go, tetapi pola implementasi handler tetap sama persis.
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Baca tipe handler
scanner.Scan()
handlerType := scanner.Text()
// Baca path request
scanner.Scan()
path := scanner.Text()
// Baca method request
scanner.Scan()
method := scanner.Text()
// Buat request tiruan
request := &MockRequest{
Path: path,
Method: method,
}
// Buat penulis response tiruan
response := &MockResponseWriter{}
// TODO: Berdasarkan handlerType, buat handler yang sesuai
// Jika handlerType adalah "welcome", baca pesan sambutan dan buat WelcomeHandler
// Jika handlerType adalah "method", buat MethodHandler
// Panggil ServeHTTP pada handler dengan response dan request
if handlerType == "welcome" {
scanner.Scan()
message := scanner.Text()
// TODO: Buat WelcomeHandler dengan pesan tersebut dan panggil ServeHTTP
_ = message // Hapus baris ini saat mengimplementasikannya
} else if handlerType == "method" {
// TODO: Buat MethodHandler dan panggil ServeHTTP
}
// Cetak isi respons
fmt.Println(response.Body())
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP di Go
File EksternalWorkspace Go dan modulePaket dan ImporNama yang Diekspor dan Tidak DieksporPengantar OOP di Gostruct sebagai classMendefinisikan method pada structPointer receiver vs value receiverInisialisasi structFungsi KonstruktorUlasan: Kalkulator Sederhana4Interface
Pengenalan InterfaceImplementasi ImplisitInterface sebagai KontrakInterface Kosong (any)Type AssertionType SwitchKomposisi InterfaceInterface Stringer & ErrorUlasan: Kalkulator Bentuk7Enkapsulasi
Field yang Diekspor vs Tidak DieksporEnkapsulasi Tingkat PackageMethod Getter dan SetterPenyembunyian Informasi di GoRingkasan: Data Siswa10Generics (Go 1.18+)
Pengantar GenericsParameter TipeBatasan TipeStruct GenerikCara Alternatif untuk Method GenerikRingkasan Koleksi Generik2Mendalami Tipe dan Struct
Tipe Dasar dan KompositDefinisi Tipe KustomTag StructStruct AnonimStruct BersarangNilai Nol dan Nilai BawaanRangkuman: Buku Kontak5Komposisi daripada Pewarisan
Mengapa Go Tidak Memiliki PewarisanDasar Penyematan StructPromosi methodMenyematkan Beberapa StructPenyematan vs AgregasiMembayangi method yang DisematkanRangkuman: Hierarki Karyawan8Penanganan Error & OOP
Interface errorTipe Error KustomPembungkusan Error (fmt.Errorf)Error Sentinelerrors.Is() dan errors.As()Panic, Defer, dan RecoverRangkuman: Parser File11Pustaka Standar & OOP
io.Reader & io.Writersort.InterfaceAntarmuka fmt.Stringerencoding/json dengan StructAntarmuka http.HandlerRingkasan, Model REST API3Pointer dan Memori
Dasar-Dasar Pointer di GoPointer ke StructPass by Value vs ReferenceFungsi new()Garbage Collection di GoRekap: Pembuat Linked List6Polimorfisme di Go
Polimorfisme melalui InterfaceDuck Typing di GoAturan Pemenuhan InterfaceKoleksi PolimorfikInjeksi DependensiRangkuman: Pemroses Pembayaran9Konkruensi & OOP
Dasar-dasar GoroutineChannel & KomunikasiChannel Ber-buffer vs Tanpa BufferPernyataan selectsync.Mutex & sync.RWMutexsync.WaitGroupDesain Struct yang Aman untuk ThreadRingkasan: Worker PoolLatihan sendiri: Compiler Go online