Kodeloka
  1. Kodeloka
  2. Kelas Golang
  3. Materi

Domain 21 · 9 bab

Golang HTTP Router

224. Pengenalan Library julienschmidt/httprouter

Keunggulan library httprouter dibanding http.ServeMux bawaan (high performance & zero allocation).

Library julienschmidt/httprouter

httprouter adalah library routing pihak ketiga yang sangat populer di ekosistem Go karena kecepatannya yang ekstrem (menggunakan algoritma Radix Tree) dan efisiensi alokasi memori yang sangat rendah.

Contoh program

package main

import "fmt"

func main() {
	fmt.Println("=== JULIENSCHMIDT/HTTPROUTER ===")
	fmt.Println("1. Kecepatan pencocokan URL ultra-kencang berbasis Radix Tree")
	fmt.Println("2. Mendukung Path Parameter (:id) dan Catch-All (*filepath)")
}

Praktik dan kuis bab ini di kelas interaktif →

225. Routing Method Spesifik & Handler (GET, POST, PUT, DELETE)

Mendaftarkan route spesifik HTTP Method pada instance HttpRouter.

Sintaks Route HttpRouter

router := httprouter.New()
router.GET("/users", GetUsersHandler)
router.POST("/users", CreateUserHandler)
router.DELETE("/users/:id", DeleteUserHandler)

Contoh program

package main

import "fmt"

func main() {
	fmt.Println("Sintaks Mendaftarkan Route di HttpRouter:")
	fmt.Println("router.GET("/api/products", handler)")
	fmt.Println("router.POST("/api/products", handler)")
}

Praktik dan kuis bab ini di kelas interaktif →

226. Named Path Parameters (:param)

Mengambil variabel dinamis dari segmen URL path seperti /products/:id.

Named Parameter

router.GET("/products/:id", func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
    id := ps.ByName("id")
    fmt.Fprintln(w, "Product ID:", id)
})

Contoh program

package main

import "fmt"

func main() {
	// Simulasi pembacaan params dari httprouter.Params
	mockParams := map[string]string{"id": "105", "category": "electronics"}
	
	fmt.Println("Product ID:", mockParams["id"])
	fmt.Println("Category:", mockParams["category"])
}

Praktik dan kuis bab ini di kelas interaktif →

227. Catch-All Path Parameters (*filepath)

Menggunakan wildcard catch-all (*filepath) untuk mencocokkan sisa panjang URL path.

Catch-All Parameter (*)

router.GET("/files/*filepath", func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
    filepath := ps.ByName("filepath")
    // Mengambil "/images/2026/banner.png"
})

Contoh program

package main

import "fmt"

func main() {
	fmt.Println("Wildcard Catch-All (*filepath):")
	fmt.Println("URL: /images/2026/07/photo.jpg")
	fmt.Println("Matching Route: /images/*filepath")
	fmt.Println("ps.ByName("filepath") => /2026/07/photo.jpg")
}

Praktik dan kuis bab ini di kelas interaktif →

228. Serving Static Files pada HttpRouter

Menyajikan folder file statis menggunakan method router.ServeFiles().

router.ServeFiles

router.ServeFiles("/static/*filepath", http.Dir("./public"))
💡 Catatan:

Path pertama wajib diakhiri dengan wildcard /*filepath.

Contoh program

package main

import "fmt"

func main() {
	fmt.Println("Konfigurasi Static File HttpRouter:")
	fmt.Println("router.ServeFiles("/public/*filepath", http.Dir("./static"))")
}

Praktik dan kuis bab ini di kelas interaktif →

229. Custom Panic Handler (router.PanicHandler)

Menangkap panic pada handler agar aplikasi tidak shutdown dan memberikan response 500.

router.PanicHandler

router.PanicHandler = func(w http.ResponseWriter, r *http.Request, errorData interface{}) {
    w.WriteHeader(http.StatusInternalServerError)
    fmt.Fprintln(w, "Terjadi Kesalahan Server Internal:", errorData)
}

Contoh program

package main

import "fmt"

func main() {
	fmt.Println("=== CUSTOM PANIC HANDLER ===")
	fmt.Println("router.PanicHandler = func(w, r, errData) { ... }")
	fmt.Println("Aplikasi web tetap stabil dan aman dari shutdown tak terduga!")
}

Praktik dan kuis bab ini di kelas interaktif →

230. Custom Not Found Handler (router.NotFound)

Kustomisasi response HTTP 404 Not Found saat URL endpoint tidak cocok.

router.NotFound

router.NotFound = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusNotFound)
    fmt.Fprintln(w, "404 - Endpoint Tidak Ditemukan!")
})

Contoh program

package main

import "fmt"

func main() {
	fmt.Println("Kustomisasi 404 di HttpRouter:")
	fmt.Println("router.NotFound = http.HandlerFunc(...)")
}

Praktik dan kuis bab ini di kelas interaktif →

231. Custom Method Not Allowed Handler (router.MethodNotAllowed)

Kustomisasi response HTTP 405 saat route ada tetapi HTTP Method tidak diizinkan.

router.MethodNotAllowed

router.MethodNotAllowed = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusMethodNotAllowed)
    fmt.Fprintln(w, "405 - HTTP Method Tidak Diizinkan!")
})

Contoh program

package main

import "fmt"

func main() {
	fmt.Println("HTTP Status Code 405: Method Not Allowed")
	fmt.Println("Misal: Route /users hanya menerima GET, tetapi dikirimi request POST.")
}

Praktik dan kuis bab ini di kelas interaktif →

232. Integration HttpRouter dengan Standard Middleware

Membungkus Router HttpRouter ke dalam middleware standar net/http.

Integrasi Middleware

Karena httprouter.Router mengimplementasikan http.Handler, router ini dapat langsung dibungkus oleh fungsi Middleware apa pun.

router := httprouter.New()
// ... register routes ...

// Wrap dengan Logger Middleware
server := http.Server{
    Addr: "localhost:8080",
    Handler: LogMiddleware(router),
}

Contoh program

package main

import "fmt"

func main() {
	fmt.Println("=== INTEGRASI HTTPROUTER + MIDDLEWARE ===")
	fmt.Println("httprouter.Router memenuhi interface http.Handler secara komplit!")
}

Praktik dan kuis bab ini di kelas interaktif →