Published on

Golang Om Telolet Om Server

Authors

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.


_16
package main
_16
_16
import (
_16
"fmt"
_16
"net/http"
_16
)
_16
_16
func helloWorldHandler(w http.ResponseWriter, r *http.Request) {
_16
fmt.Fprint(w, "Hello World!")
_16
}
_16
_16
func 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
_8
HTTP/1.1 200 OK
_8
Date: Wed, 03 Jan 2018 02:13:14 GMT
_8
Content-Length: 12
_8
Content-Type: text/plain; charset=utf-8
_8
_8
$curl localhost:8080
_8
Hello 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.


_16
package main
_16
_16
import (
_16
"fmt"
_16
"net/http"
_16
)
_16
_16
func helloWorldHandler(w http.ResponseWriter, r *http.Request) {
_16
w.Header().Add("x-telolet", "OM telolet OM")
_16
fmt.Fprint(w, "Hello World!")
_16
}
_16
_16
func 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
_6
HTTP/1.1 200 OK
_6
X-Telolet: OM telolet OM
_6
Date: Wed, 03 Jan 2018 02:18:58 GMT
_6
Content-Length: 12
_6
Content-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.


_23
package main
_23
_23
import (
_23
"fmt"
_23
"net/http"
_23
)
_23
_23
// OmTeloletOm middleware
_23
func 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
_23
func helloWorldHandler(w http.ResponseWriter, r *http.Request) {
_23
fmt.Fprint(w, "Hello World!")
_23
}
_23
_23
func 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
_6
HTTP/1.1 200 OK
_6
X-Telolet: OM telolet OM pake middleware
_6
Date: Wed, 03 Jan 2018 02:34:48 GMT
_6
Content-Length: 12
_6
Content-Type: text/plain; charset=utf-8

Sangat mudah ternyata menambahkan custom header menggunakan golang. Sampai jumpa lagi di tulisan selanjutnya.