- Published on
Golang Om Telolet Om Server
- Authors
- Name
- Moch Lutfi
- @kaptenupi
Tahun 2016 lalu ramai sekali tentang om telolet om, dan disalah satu website e-commerse di Indonesia menambahkan x-om-telolet-om
di response header. Mungkin banyak yang tidak mengetahuinya, karena hanya tambahan response header dan tidak terlihat di tampilan website.
Golang Om Telolet Om Server
Pertanyaannya bagaimana menambahkan respon http header menggunakan golang? Jawabnya tentu bisa dan sangat mudah sekali bahkan tidak perlu menggunakan eksternal dependensi tambahan.
Pertama perlu kita buat web server sederhana menggunakan net/http
package seperti dibawah ini.
_16package main_16_16import (_16 "fmt"_16 "net/http"_16)_16_16func helloWorldHandler(w http.ResponseWriter, r *http.Request) {_16 fmt.Fprint(w, "Hello World!")_16}_16_16func main() {_16 http.HandleFunc("/", helloWorldHandler)_16 http.ListenAndServe(":8080", nil)_16}_16// run dengan perintah `go run main.go`
Kita tes menggunakan curl
hasilnya seperti di bawah ini masih tanpa ada tambahan om telolet om di header dan response body menampilkan string Hello World!
_8$curl -X HEAD -I localhost:8080_8HTTP/1.1 200 OK_8Date: Wed, 03 Jan 2018 02:13:14 GMT_8Content-Length: 12_8Content-Type: text/plain; charset=utf-8_8_8$curl localhost:8080_8Hello World!
Cara sederhana menambahkan header x-telolet hanya dengan menambahkan code w.Header().Add("x-telolet", "OM telolet OM")
sebelum fmt.Fprint(w, "Hello World!")
sehingga jadi seperti ini.
_16package main_16_16import (_16 "fmt"_16 "net/http"_16)_16_16func helloWorldHandler(w http.ResponseWriter, r *http.Request) {_16 w.Header().Add("x-telolet", "OM telolet OM")_16 fmt.Fprint(w, "Hello World!")_16}_16_16func main() {_16 http.HandleFunc("/", helloWorldHandler)_16 http.ListenAndServe(":8080", nil)_16}
Jika dicek menggunakan curl hasilnya sudah berubah.
_6$curl -X HEAD -I localhost:8080_6HTTP/1.1 200 OK_6X-Telolet: OM telolet OM_6Date: Wed, 03 Jan 2018 02:18:58 GMT_6Content-Length: 12_6Content-Type: text/plain; charset=utf-8
Middleware
Kemudian muncul pertanyaan bagaimana jika handlernya banyak tidak hanya HelloWorldHandler
saja? Untuk keperluan seperti ini bisa menggunakan middleware
. Jadi menjalankan satu atau lebih fungsi tertentu sebelum menjalankan handler utama seperti helloWorldHandler
.
Struktur middleware
yang akan kita buat menggunakan func(w http.ResponseWriter, r *http.Request)
sebagai tipe data. Jadi passing fungsi kedalam fungsi dan return fungsi lagi. Lebih jelasnya kita lihat code dibawah ini.
_23package main_23_23import (_23 "fmt"_23 "net/http"_23)_23_23// OmTeloletOm middleware_23func OmTeloletOm(handler func(w http.ResponseWriter, r *http.Request)) func(w http.ResponseWriter, r *http.Request) {_23 return func(w http.ResponseWriter, r *http.Request) {_23 w.Header().Add("x-telolet", "OM telolet OM pake middleware")_23 handler(w, r)_23 }_23}_23_23func helloWorldHandler(w http.ResponseWriter, r *http.Request) {_23 fmt.Fprint(w, "Hello World!")_23}_23_23func main() {_23 http.HandleFunc("/", OmTeloletOm(helloWorldHandler))_23 http.ListenAndServe(":8080", nil)_23}
Jika kita cek lagi dengan curl hasilnya seperti ini.
_6$curl -X HEAD -I localhost:8080_6HTTP/1.1 200 OK_6X-Telolet: OM telolet OM pake middleware_6Date: Wed, 03 Jan 2018 02:34:48 GMT_6Content-Length: 12_6Content-Type: text/plain; charset=utf-8
Sangat mudah ternyata menambahkan custom header menggunakan golang. Sampai jumpa lagi di tulisan selanjutnya.