Lewati ke konten

6. Proyek Akhir — Web Server

Saatnya menggabungkan semuanya: kita bangun web server kecil seperti aplikasi profil di gstnv-lab.xyz — hanya dengan pustaka standar Go.

main.go
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("GET /{$}", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Halo dari server Go!")
})
log.Println("listening on :8080")
log.Fatal(http.ListenAndServe(":8080", mux))
}
Bagian Arti
http.NewServeMux() router: mencocokkan path dengan handler
"GET /{$}" hanya method GET dan path / persis (Go 1.22+)
w http.ResponseWriter tempat menulis jawaban ke pengunjung
r *http.Request permintaan pengunjung: method, path, header
fmt.Fprintln(w, ...) seperti Println, tapi menulis ke w
http.ListenAndServe(":8080", mux) dengarkan port 8080 — fungsi ini tidak pernah selesai selama server hidup
mux.HandleFunc("GET /health", ...) // path persis
mux.HandleFunc("GET /halo/{nama}", ...) // {nama} = bagian path yang berubah
mux.HandleFunc("POST /pesan", ...) // method lain → 405 Method Not Allowed
mux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))

Nilai {nama} dibaca dengan r.PathValue("nama").

  1. go run . — server menyala. Di terminal latihan, server berjalan di background dan PID-nya ditampilkan.

  2. curl localhost:8080 — uji dari terminal yang sama.

  3. Ubah kode? Matikan server lama dulu dengan kill PID. Kalau tidak, server baru gagal karena port masih dipakai:

    listen tcp :8080: bind: address already in use
  4. go run . lagi, lalu uji ulang.

Terminal window
go build # hasil: file ./webku (nama dari go.mod)
./webku # jalan tanpa perlu Go terpasang

Binary inilah yang disalin ke server. Mau compile untuk sistem lain? Atur GOOS dan GOARCH:

Terminal window
GOOS=linux GOARCH=arm64 go build -o webku-arm # untuk Raspberry Pi / server ARM
Lab: Proyek akhir: web server Go
Misi 0/7
  1. Masuk ke webku lalu nyalakan servernya dengan go run .
    Petunjukcd webku && go run .
  2. Uji dengan curl localhost:8080.
    Petunjukcurl localhost:8080
  3. Matikan servernya dengan kill PID (lihat PID di output tadi atau di ps aux).
    Petunjukps aux | grep main lalu kill PID
  4. Tambahkan rute GET /health yang menjawab ok, nyalakan ulang, lalu curl localhost:8080/health.
    Petunjukmux.HandleFunc("GET /health", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "ok") })
  5. Tambahkan rute GET /halo/{nama} yang menjawab Halo, NAMA! memakai r.PathValue("nama"). Uji dengan curl localhost:8080/halo/budi.
    Petunjukfmt.Fprintf(w, "Halo, %s!\n", r.PathValue("nama")) — ingat: kill server lama dulu, lalu go run . lagi
  6. Matikan server lalu compile jadi satu file binary: go build.
    Petunjukkill PID lalu go build (hasilnya file ./webku)
  7. Jalankan binary-nya tanpa go: ./webku, lalu curl localhost:8080/health.
    Petunjuk./webku lalu curl localhost:8080/health

Kamu sudah menulis program Go, menangani error, menguji kode, dan membangun web server. Langkah berikutnya:

  • Ikuti Tour of Go untuk fitur yang belum dibahas: interface, goroutine, dan channel.
  • Bungkus web server-mu dengan Dockerfile, lalu pasang di balik nginx.