Membuat Static File Handler di Golang dengan Httprouter
Dalam aplikasi web, seringkali kita perlu menyajikan file statis seperti gambar, file CSS, atau JavaScript dari folder publik. Dengan menggunakan library julienschmidt/httprouter, Anda dapat dengan mudah membuat handler untuk melayani file statis. Artikel ini akan membahas langkah-langkah lengkap untuk mengimplementasikan static file handler dengan cara yang sederhana dan efisien di Golang.
Prasyarat
Pemahaman Dasar Golang: Anda harus memahami dasar-dasar pemrograman Golang.
Golang Terinstal: Pastikan Golang telah terinstal pada mesin Anda.
Library
httprouter
: Anda perlu menginstal library ini. Untuk menginstalnya, gunakan perintah berikut:go get github.com/julienschmidt/httprouter
Folder Publik: Folder untuk menyimpan file statis Anda, misalnya bernama
public
.
Langkah 1: Menyiapkan Struktur Direktori
Buat struktur proyek sederhana sebagai berikut:
project-root/
├── main.go
├── public/
│ ├── index.html
│ ├── style.css
│ ├── script.js
main.go
: File utama untuk menjalankan aplikasi.public/
: Folder untuk menyimpan file statis yang akan diakses.
Langkah 2: Membuat File main.go
Buka file main.go
dan tambahkan kode berikut:
package main
import (
"log"
"net/http"
"github.com/julienschmidt/httprouter"
)
func main() {
router := httprouter.New()
// Static file handler untuk folder "public"
router.ServeFiles("/static/*filepath", http.Dir("./public"))
// Menjalankan server
log.Println("Server berjalan di http://localhost:8080")
log.Fatal(http.ListenAndServe(":8080", router))
}
Penjelasan:
router.ServeFiles
: Method bawaan darihttprouter
yang digunakan untuk melayani file statis. Parameter pertama adalah URL prefix (misalnya/static/*filepath
), sedangkan parameter kedua adalah direktori di mana file statis berada (./public
).http.Dir("./public")
: Mengarahkan handler untuk membaca file dari folderpublic
.ListenAndServe
: Menjalankan server pada port 8080.
Langkah 3: Menyiapkan File Statis
Buat beberapa file di dalam folder public/
:
public/index.html
:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Static Files</title> <link rel="stylesheet" href="/static/style.css"> </head> <body> <h1>Welcome to Static Files in Golang!</h1> <script src="/static/script.js"></script> </body> </html>
public/style.css
:body { font-family: Arial, sans-serif; text-align: center; margin-top: 50px; background-color: #f4f4f9; } h1 { color: #333; }
public/script.js
:console.log("Static file loaded successfully!");
Langkah 4: Menjalankan Aplikasi
Jalankan aplikasi dengan perintah berikut:
go run main.go
Server akan berjalan di http://localhost:8080
.
Pengujian
Buka browser Anda dan akses:
- http://localhost:8080/static/index.html: Untuk membuka file HTML.
- http://localhost:8080/static/style.css: Untuk melihat file CSS.
- http://localhost:8080/static/script.js: Untuk melihat file JavaScript.
Periksa file-file diakses dengan benar dan pastikan tidak ada error pada konsol browser.
Langkah 5: Menambahkan Header untuk File Statis
Untuk menambahkan header pada respon file statis (misalnya header keamanan), Anda dapat membuat middleware sederhana:
func WithHeaders(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Cache-Control", "max-age=3600")
h.ServeHTTP(w, r)
})
}
Kemudian gunakan middleware tersebut sebelum handler file statis:
staticHandler := WithHeaders(http.StripPrefix("/static/", http.FileServer(http.Dir("./public"))))
router.Handler("GET", "/static/*filepath", staticHandler)
Penjelasan:
http.HandlerFunc
: Membungkus handler untuk menambahkan header ke setiap respons.Cache-Control
: Menetapkan waktu cache file statis agar browser tidak mengunduh ulang setiap kali file diakses.
Kesimpulan
Pada artikel ini, kita telah membuat file handler untuk melayani file statis menggunakan library httprouter
di Golang. Dengan menambahkan header kustom atau middleware, Anda dapat meningkatkan fungsionalitas sesuai kebutuhan aplikasi Anda.
Cobalah mengembangkan lebih lanjut dengan mengintegrasikan endpoint dinamis atau menambahkan sistem logging untuk respons file statis. Selamat mencoba!