Episode ini membangun HTTP server pertama dengan net/http dan http.ServeMux Go 1.22, termasuk middleware dan routing dengan method serta wildcard. Kalian juga mengenal router modern chi, gin, echo, dan best practice desain REST API.

Setelah menguasai data, konfigurasi, dan database, saatnya aplikasi Go kalian berbicara dengan dunia luar. Episode 10 adalah titik di mana program kalian berubah menjadi service nyata dengan HTTP server, routing, dan REST API.
Kita mulai dari fondasi: net/http dan handler. Lalu routing dengan http.ServeMux yang sejak Go 1.22 mendukung method dan wildcard di path. Setelah itu pola middleware untuk menangani cross-cutting concerns, perbandingan router modern seperti chi, gin, dan echo, serta best practice desain route.
Dua konsep inti net/http: http.Handler adalah interface dengan method ServeHTTP, dan http.ServeMux adalah router bawaan yang mencocokkan request ke handler.
package main
import (
"fmt"
"net/http"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Halo dari server Go")
})
http.ListenAndServe(":8080", mux)
}Jalankan go run main.go lalu uji dengan curl http://localhost:8080 dari terminal lain. http.ResponseWriter menulis respons, http.Request membawa semua data dari klien.
Setiap request melewati alur: router mencocokkan path dan method ke handler, handler memproses, lalu menulis status dan body. http.StatusOK, http.StatusNotFound, dan konstanta status lainnya menjaga kode tetap terbaca.
mux.HandleFunc("/api/health", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
fmt.Fprintln(w, `{"status":"ok"}`)
})Sebelum Go 1.22, ServeMux hanya mencocokkan path. Kini pattern bisa menyebut method dan wildcard dengan sintaks {nama}:
mux := http.NewServeMux()
mux.HandleFunc("GET /api/pengguna", daftarPengguna)
mux.HandleFunc("GET /api/pengguna/{id}", detailPengguna)
mux.HandleFunc("POST /api/pengguna", buatPengguna)Nilai wildcard dibaca dari request path:
func detailPengguna(w http.ResponseWriter, r *http.Request) {
id := r.PathValue("id")
fmt.Fprintf(w, "detail pengguna %s", id)
}r.PathValue("id") mengambil nilai segmen {id} dari URL. Routing bawaan ini menghilangkan kebutuhan router eksternal untuk banyak kasus, sambil tetap menjaga kode bebas refleksi dan performa tinggi.
Middleware adalah fungsi yang membungkus handler untuk menambah perilaku: logging, autentikasi, timeout, atau recovery. Pola idiomatiknya memakai function type yang mengembalikan handler.
func loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Printf("%s %s", r.Method, r.URL.Path)
next.ServeHTTP(w, r)
})
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("GET /", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "halaman utama")
})
http.ListenAndServe(":8080", loggingMiddleware(mux))
}Middleware dijalankan berurutan dari luar ke dalam: request masuk melewati middleware terluar dulu. Urutan pemasangan menentukan urutan eksekusi — pasang recovery di lapisan terluar dan logging sebelum handler.
chi adalah router ringan yang kompatibel penuh dengan net/http, sehingga middleware standar tetap berfungsi. Ini pilihan paling idiomatis untuk tim yang ingin kontrol penuh tanpa framework besar.
go get github.com/go-chi/chi/v5package main
import (
"net/http"
"github.com/go-chi/chi/v5"
)
func main() {
r := chi.NewRouter()
r.Get("/api/pengguna/{id}", func(w http.ResponseWriter, r *http.Request) {
chi.URLParam(r, "id")
})
http.ListenAndServe(":8080", r)
}gin menawarkan performa tinggi dengan middleware bawaan seperti recovery dan logger, serta helper binding JSON yang nyaman. echo menyerupai gin dengan API yang rapi dan dukungan middleware yang luas. Pilihannya bergantung kebutuhan: chi untuk kesederhanaan net/http, gin untuk produktivitas dan ekosistem, echo untuk keseimbangan keduanya.
Beberapa pedoman yang menjaga API tetap konsisten:
/api/pengguna, bukan /api/ambilPengguna./api/pengguna/{id}/posting.GET membaca, POST membuat, PUT memperbarui, DELETE menghapus.200, 201 untuk created, 400 untuk bad request, 404 untuk tidak ditemukan./api/v1/pengguna.Desain route yang konsisten memudahkan klien, mengurangi bug integrasi, dan membuat API kalian siap dipakai tim lain.
Episode 10 mengubah program kalian menjadi service: membangun HTTP server dengan net/http, routing dengan http.ServeMux Go 1.22 yang mendukung method dan wildcard, pola middleware untuk cross-cutting concern, perbandingan router chi, gin, dan echo, serta best practice desain REST API.
Inti yang harus dibawa pulang:
http.Handler adalah kontrak utama net/http.ServeMux Go 1.22 mendukung method dan wildcard {id}.r.PathValue membaca nilai segmen path.chi ringan dan idiomatis; gin dan echo menawarkan lebih banyak helper.Di episode 11 selanjutnya kita akan membahas keamanan API, TLS, dan otentikasi — menyediakan HTTPS dengan TLS, implementasi JWT, OAuth2, dan session, serta praktik keamanan API seperti input validation, CORS, rate limiting, dan security headers.