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)")
}
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)")
}
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"])
}
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")
}
228. Serving Static Files pada HttpRouter
Menyajikan folder file statis menggunakan method router.ServeFiles().
router.ServeFiles
router.ServeFiles("/static/*filepath", http.Dir("./public"))
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"))")
}
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!")
}
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(...)")
}
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.")
}
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!")
}