Pengenalan Header
Selain query parameter pada HTTP juga kita bisa menggunakan Header. Header adalah informasi tambahan yang biasa dikirim dari client ke server atau pun sebaliknya. Dalam Header, tidak hanya ada pada HTTP Request tetapi pada HTTP Respone pun kita bisa menambahkan informasi header. Saat kita menggunakan browser pada komputer kita, biasanya secara otomatis header akan ditampilkan oleh browser seperti informasi browser, jenis tipe content yang dikirim dan diterima oleh browser dan masih banyak lagi.
Memahami Request Header
Pada Golang kita bisa menangkap request Header yang dikirim oleh client itu kita bisa mengambilnya pada Request.Header
. Sama halnya seperti Query Parameter, isi dari Header tersebut berupa map[string][]string
. Tetapi ada perbedaan dengan Query Parameter yaitu tidak case sensitive
.
Response Header
Selanjutnya jika kita ingin menambahkan header pada response, kita juga bisa menggunakan ResponseWriter.Header()
. Kita bisa set header response pada program kita seperti dibawah ini.
w.Header().Add(X_POWERED_BY, poweredBy)
Implementasi
Kita coba lanjutkan untuk mengimplementasikan untuk menangkap header request yang dikirim oleh client. Kita buat handler-nya seperti dibawah ini.
const X_POWERED_BY = "X-Powered-By"
func RequestHedaerHandler(w http.ResponseWriter, r *http.Request) {
poweredBy := r.Header.Get(X_POWERED_BY)
w.Header().Add(X_POWERED_BY, poweredBy)
fmt.Fprint(w, poweredBy)
}
Pada kode diatas kita akan menangkap header dengan key X-Powered-By
yang dikirim oleh client lalu kita akan cetak dan melakukan pengujian dengan membuat unit test seperti dibawah ini.
func TestRequestHedaerHandler(t *testing.T) {
type args struct {
name string
}
tests := []struct {
name string
args args
want string
}{
{
name: "set powered by",
args: args{
name: "santekno",
},
want: "santekno",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
request := httptest.NewRequest(http.MethodGet, "http://localhost/say", nil)
request.Header.Add(X_POWERED_BY, tt.args.name)
recorder := httptest.NewRecorder()
RequestHedaerHandler(recorder, request)
response := recorder.Result()
poweredBy := response.Header.Get(X_POWERED_BY)
if !reflect.DeepEqual(poweredBy, tt.want) {
t.Errorf("poweredBy = %v, want %v", poweredBy, tt.want)
}
})
}
}