Pengenalan File Server
Pada Golang memiliki sebuah fitur yang bernama FileServer. Dengan ini kita bisa membuat Handler di Golang Web yang telah kita gunakan itu sebagai static file server dan FileServer ini tidak perlu manual melakukan load lagi. Sehingga kita bisa tambahkan ke dalam http.Server
atau http.ServeMux
.
Menerapkan pada Handler Project
Pada project sebelumnya kita telah membuat Handler yang bisa kita jalankan. Maka kita akan coba mengubah dan menambahkan FileServer
ini pada handler yang sudah kita buat.
Kita akan memperbaiki program pada file main.go
menjadi seperti ini.
func main() {
directory := http.Dir("./resources")
fileServer := http.FileServer(directory)
mux := http.NewServeMux()
mux.Handle("/static/", fileServer)
...
...
...
server := http.Server{
Addr: "localhost:8080",
Handler: mux,
}
err := server.ListenAndServe()
if err != nil {
panic(err)
}
}
Pastikan kode program berjalan dengan baik dengan melakukan build dan menjalankan programnya.
go build && ./learn-golang-web
Jika sudah berjalan kita akan coba mengakses path url dari FileServer
kita yang sudah kita tambahakn pada program.
http://localhost:8080/static
Terjadi 404 Not Found
Ketika program kita berjalan dan membuka /static/index.html
atau /static/index.js
terjadi error 404 Not found. Kenapa ini bisa terjadi? Karena FileServer
akan membaca url tersebut lalu mencari file berdasarkan URL-nya. Misalkan jika kita membuka /static/index.html
, maka FileServer
akan mencari file di /resources/static/index.html
, jika tidak ditemukan maka akan menyebabkan error 404 Not Found. Oleh karena itu, kita bisa menggunakan fungsi http.StripPrefix()
untuk menghapus prefix dari URL.
Maka kita perlu ubah kode program menjadi seperti ini.
mux.Handle("/static/", http.StripPrefix("/static", fileServer))
Saat kita coba membuka file kembali maka otomatis file yang sudah kita buat sudah bisa diakses dan dibuka oleh browser.
Menggabungkan FileServer dengan Golang Embed
Pada artikel sebelumnya pernah kita bahas yaitu tentang Pengenalan Implementasi Embeded. Jadi untuk mengenal suatu folder dan membaca semua file yang ada pada folder tersebut kita juga bisa menggunakan Embed. Nah, lalu bagaimana caranya?
Pertama kita akan menambahkan Embed
ini pada program kita seperti dibawah ini.
//go:embed resources
var resources embed.FS
func main() {
fileServer := http.FileServer(http.FS(resources))
mux := http.NewServeMux()
mux.Handle("/static/", http.StripPrefix("/static", fileServer))
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "hello world")
})
mux.HandleFunc("/hi", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hi")
})
mux.HandleFunc("/req", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, r.Method)
fmt.Fprintln(w, r.RequestURI)
})
mux.HandleFunc("/set-cookie", SetCookieHandler)
mux.HandleFunc("/get-cookie", GetCookieHandler)
server := http.Server{
Addr: "localhost:8080",
Handler: mux,
}
err := server.ListenAndServe()
if err != nil {
panic(err)
}
}
Lalu kita jalankan program kita dan buka browser dan akses kembali URL yang tadi kita buat. Jika terjadi error 404 dikarenakan Golang embed itu akan membaca nama folder mengikuti dengan dengan path dari URL-nya sehingga jika kita menyimpan di folder resources
maka untuk membuka file di folder tersebut perlu menambahkan nama foldernya ke dalam path URL menjadi seperti ini /static/resources/index.css
.
Dan bagaimana caranya kita tidak ingin menambahkan nama folder tersebut dalam path URL web kita? Maka caranya yaitu kita bisa menggunakan fungsi fs.Sub()
untuk mendapatkan sub directory-nya.
directory, _ := fs.Sub(resources, "resources")
fileServer := http.FileServer(http.FS(directory))
Jalankan kembali program yang sudah kita buat dan buka browser dan akses path file-nya maka skrng sudah bisa file tersebut terbuka tanpa harus menambahkan path nama folder.