Skip to content

Latest commit

History

History
87 lines (56 loc) 路 3.28 KB

B-20-custom-mux-multiplexer.md

File metadata and controls

87 lines (56 loc) 路 3.28 KB

B.20. Custom Multiplexer

Pada bab ini, kita akan belajar membuat custom multiplexer sendiri, lalu memanfaatkannya untuk mempermudah manajemen middleware.

Silakan salin projek sebelumnya, Bab B.19. Middleware http.Handler, ke folder baru untuk keperluan pembelajaran.

B.20.1. Pembuatan Custom Mux

Pada bab sebelumnya, default mux milik Go digunakan untuk routing dan implementasi middleware. Kali ini default mux tersebut tidak digunakan, kita akan buat mux baru.

Namun pembuatan mux baru tidaklah cukup, karena naturally mux baru tersebut tidak akan ada beda dengan default mux. Oleh karena itu agar lebih berguna, kita akan buat tipe mux baru, meng-embed http.ServeMux kedalamnya, lalu membuat beberapa hal dalam struct tersebut.

OK, langsung saja kita praktekan. Ubah isi fungsi main menjadi seperti berikut.

mux := new(CustomMux)

mux.HandleFunc("/student", ActionStudent)

mux.RegisterMiddleware(MiddlewareAuth)
mux.RegisterMiddleware(MiddlewareAllowOnlyGet)

server := new(http.Server)
server.Addr = ":9000"
server.Handler = mux

fmt.Println("server started at localhost:9000")
server.ListenAndServe()

Objek mux dicetak dari struct CustomMux yang jelasnya akan di buat. Struct ini di dalamnya meng-embed http.ServeMux.

Registrasi middleware juga diubah, sekarang menggunakan method .RegisterMiddleware() milik mux.

Pada file middleware.go, siapkan struct CustomMux. Selain meng-embed objek mux milik Go, siapkan juga satu variabel bertipe slice-dari-tipe-fungsi-middleware.

type CustomMux struct {
    http.ServeMux
    middlewares []func(next http.Handler) http.Handler
}

Buat fungsi RegisterMiddleware(). Middleware yang didaftarkan ditampung oleh slice .middlewares.

func (c *CustomMux) RegisterMiddleware(next func(next http.Handler) http.Handler) {
    c.middlewares = append(c.middlewares, next)
}

Lalu buat method ServeHTTP. Method ini diperlukan dalam custom mux agar memenuhi kriteria interface http.Handler.

func (c *CustomMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    var current http.Handler = &c.ServeMux

    for _, next := range c.middlewares {
        current = next(current)
    }

    current.ServeHTTP(w, r)
}

Method ServeHTTP() milik mux adalah method yang pasti dipanggil pada web server, di setiap request yang masuk.

Dengan perubahan di atas, setiap kali ada request masuk pasti akan melewati middleware-middleware terlebih dahulu secara berurutan. Jika lolos middleware ke-1, lanjut ke-2; jika lolos middleware ke-2, lanjut ke-3; dan seterusnya.

B.20.2. Testing

Jalankan aplikasi.

Run the server

Lalu test menggunakan curl, hasilnya adalah sama dengan pada bab sebelumnya.

Consume API

Jika ada keperluan untuk menambahkan middleware baru lainnya, cukup registrasikan lewat .RegisterMiddleware(). Source code menjadi lebih rapi dan nyaman untuk dilihat.


Source code praktek pada bab ini tersedia di Github
https://github.com/novalagung/dasarpemrogramangolang-example/.../chapter-B.20...