Routing
Sejauh ini API kita hanya memiliki satu endpoint: GET /users. Aplikasi nyata membutuhkan banyak endpoint dengan berbagai method HTTP (GET, POST, PUT, DELETE) dan parameter di URL (seperti /users/{id}). Di sinilah routing berperan.
Bab ini akan membangun dua jenis router:
CLI Router β untuk perintah command line (migrate, seed, scheduler dll)
HTTP Router β untuk REST API endpoints
π Kode Lengkap Bab Ini: Seluruh kode yang dibahas di bab ini tersedia di GitHub:
10.1 Routing di Go 1.22+
Sejak Go 1.22, package net/http memiliki kemampuan routing yang jauh lebih baik. Kita tidak perlu lagi library eksternal seperti gorilla/mux atau chi untuk kebutuhan dasar.
Fitur baru yang tersedia:
Method-based routing:
mux.HandleFunc("GET /users", handler)Path parameters:
mux.HandleFunc("GET /users/{id}", handler)Wildcard:
mux.HandleFunc("GET /files/{path...}", handler)
10.2 CLI Router
CLI router bertugas memetakan perintah dari terminal ke fungsi yang sesuai. Pola yang umum digunakan adalah switch-case berdasarkan argumen pertama.
Struktur Router CLI
Buat file internal/router/cli.go:
Update CLI Main
cmd/cli/main.go sekarang lebih sederhana β hanya bertugas parsing argumen dan memanggil router:
Penggunaan CLI sekarang:
10.3 HTTP Router (REST API)
HTTP router memetakan method HTTP + path ke handler function. Dengan Go 1.22+, kita bisa menulis routing yang ekspresif dan aman tipe.
Struktur Router API
Buat file internal/router/api.go:
Sintaks Method + Path: "GET /users" adalah format baru di Go 1.22+. Jika method tidak cocok, otomatis mengembalikan 405 Method Not Allowed.
Update Server Main
cmd/server/main.go sekarang lebih bersih β cukup memanggil router.Api() sebagai handler:
10.4 Menambahkan Endpoint Baru (Contoh)
Untuk menambahkan endpoint baru, cukup tambahkan di router/api.go:
Dan implementasikan method handler yang sesuai di user_handler.go.
10.5 Struktur Direktori Setelah Routing
10.6 Perbandingan Sebelum dan Sesudah
CLI handling
Langsung di main()
router.Cli() dengan switch-case
HTTP routing
Hardcoded di main()
router.Api() terpusat
Method support
Semua method masuk ke handler yang sama
Method-specific routing
Path parameters
Tidak ada (parsing manual)
Dukungan bawaan /{id}
Penambahan endpoint
Mengubah main()
Cukup tambah di router.Api()
Ringkasan Bab 10
Di bab ini kita telah belajar:
CLI Router β Memetakan perintah terminal ke fungsi menggunakan switch-case
HTTP Router (Go 1.22+) β Routing dengan method + path dalam satu baris
Pemisahan tanggung jawab β Router bertugas memetakan, handler tetap fokus pada logika bisnis
Struktur yang scalable β Endpoint baru mudah ditambahkan tanpa mengganggu main()
Manfaat yang kita peroleh:
β CLI dan HTTP routing terpisah dan terorganisir
β Sintaks routing Go 1.22+ lebih bersih dan tidak perlu library eksternal
β main() menjadi sangat ramping β hanya orchestrasi
β Persiapan untuk CRUD lengkap di bab berikutnya
Yang akan datang:
Saat ini kita hanya memiliki endpoint GET /users (READ)
Bab selanjutnya: CRUD β menambahkan Create, Read (by ID), Update, dan Delete untuk resource User
Last updated