09 Cara Membuat Request Response Header Menggunakan Httprouter
Dalam pengembangan aplikasi berbasis web, pengaturan header pada HTTP request dan response sangat penting untuk mengelola data, keamanan, dan metadata lainnya. Artikel ini membahas langkah-langkah untuk mengatur header pada request dan response menggunakan library httprouter di Golang. Dengan panduan ini, bahkan programmer pemula dapat memahami konsep ini dengan mudah.
Prasyarat
Sebelum kita mulai, pastikan Anda memiliki hal-hal berikut:
- Instalasi Golang: Pastikan Go sudah terinstal di sistem Anda.
- Proyek Baru: Buat proyek baru dengan struktur file dasar.
- Library Httprouter: Pasang library httprouter dengan perintah berikut:
1go get github.com/julienschmidt/httprouter
Langkah 1: Mengatur Struktur Proyek
Buat struktur proyek berikut:
1project/
2├── main.go
3└── handlers/
4 └── headers.goLangkah 2: Mengatur Header pada Response
Header pada response dikirim ke klien melalui objek http.ResponseWriter. Mari tambahkan handler untuk mengatur header response.
1. Membuat File Handlers
Buka file handlers/headers.go dan tambahkan kode berikut:
1package handlers
2
3import (
4 "net/http"
5 "github.com/julienschmidt/httprouter"
6)
7
8// ResponseHeaderHandler menambahkan header ke response
9func ResponseHeaderHandler(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
10 w.Header().Set("Content-Type", "application/json")
11 w.Header().Set("X-Custom-Header", "Belajar Golang")
12 w.WriteHeader(http.StatusOK)
13 w.Write([]byte(`{"message":"Header berhasil disetel!"}`))
14}2. Menghubungkan Handler di main.go
Buka file main.go dan tambahkan handler baru:
1package main
2
3import (
4 "log"
5 "net/http"
6 "github.com/julienschmidt/httprouter"
7 "project/handlers"
8)
9
10func main() {
11 router := httprouter.New()
12
13 // Menambahkan handler untuk response header
14 router.GET("/set-response-header", handlers.ResponseHeaderHandler)
15
16 log.Println("Server berjalan di http://localhost:8080")
17 log.Fatal(http.ListenAndServe(":8080", router))
18}3. Menguji Endpoint
Jalankan server:
1go run main.goAkses endpoint di browser atau gunakan curl:
1curl -i http://localhost:8080/set-response-headerRespons akan menunjukkan header yang telah ditambahkan.
Langkah 3: Mengatur Header pada Request
Untuk memanipulasi header pada request, kita dapat menggunakan objek http.Request. Di sini kita membuat middleware yang membaca dan memproses header request.
1. Menambahkan Middleware
Buka kembali file handlers/headers.go dan tambahkan fungsi berikut:
1// RequestHeaderHandler memproses header dari request
2func RequestHeaderHandler(next httprouter.Handle) httprouter.Handle {
3 return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
4 headerValue := r.Header.Get("X-Requested-By")
5 if headerValue == "" {
6 http.Error(w, "X-Requested-By header missing", http.StatusBadRequest)
7 return
8 }
9
10 next(w, r, ps)
11 }
12}2. Menambahkan Handler Middleware
Modifikasi file main.go untuk menggunakan middleware:
1router.GET("/validate-request-header", handlers.RequestHeaderHandler(func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
2 w.Write([]byte("Header valid!"))
3}))3. Menguji Endpoint
Jalankan server kembali dan gunakan curl:
1curl -i -H "X-Requested-By: ClientApp" http://localhost:8080/validate-request-headerJika header valid, responsnya:
1Header valid!Jika header tidak ada, respons akan menunjukkan kesalahan:
1X-Requested-By header missingLangkah 4: Menambahkan Unit Test
Untuk memastikan bahwa fungsi-fungsi yang telah kita buat berjalan dengan benar, kita akan menambahkan unit test untuk kedua handler tersebut: ResponseHeaderHandler dan RequestHeaderHandler.
Berikut adalah contoh unit test yang dapat Anda gunakan.
1. Unit Test untuk ResponseHeaderHandler
Fungsi ResponseHeaderHandler bertugas untuk menambahkan header ke response dan mengirimkan status HTTP 200 beserta body JSON. Kita akan membuat unit test untuk memverifikasi apakah header dan status code telah disetel dengan benar.
Buat file handlers/headers_test.go dengan konten berikut:
1package handlers
2
3import (
4 "net/http"
5 "net/http/httptest"
6 "testing"
7)
8
9func TestResponseHeaderHandler(t *testing.T) {
10 type args struct {
11 image string
12 }
13 tests := []struct {
14 name string
15 args args
16 wantHTTPStatus int
17 wantContentType string
18 wantXCustomHeader string
19 wantResponse string
20 }{
21 {
22 name: "test get image",
23 args: args{
24 image: "photo.jpg",
25 },
26 wantHTTPStatus: 200,
27 wantContentType: "application/json",
28 wantXCustomHeader: "Belajar Golang",
29 wantResponse: `{"message":"Header berhasil disetel!"}`,
30 },
31 }
32 for _, tt := range tests {
33 t.Run(tt.name, func(t *testing.T) {
34 request := httptest.NewRequest(http.MethodGet, "http:localhost:8080/set-response-header", nil)
35 recorder := httptest.NewRecorder()
36 ResponseHeaderHandler(recorder, request, httprouter.Params{})
37
38 // Cek apakah status code yang dihasilkan adalah 200 OK
39 if status := recorder.Code; status != tt.wantHTTPStatus {
40 t.Errorf("Response code is %v, want %v", status, tt.wantHTTPStatus)
41 }
42
43 // Cek apakah header Content-Type yang dihasilkan adalah 'application/json'
44 if contentType := recorder.Header().Get("Content-Type"); contentType != tt.wantContentType {
45 t.Errorf("Content-Type header is %v, want %v", contentType, tt.wantContentType)
46 }
47
48 // Cek apakah header X-Custom-Header yang dihasilkan sesuai
49 if customHeader := recorder.Header().Get("X-Custom-Header"); customHeader != tt.wantXCustomHeader {
50 t.Errorf("X-Custom-Header is %v, want %v", customHeader, tt.wantXCustomHeader)
51 }
52
53 // Cek apakah body response berisi pesan yang diinginkan
54 if recorder.Body.String() != tt.wantResponse {
55 t.Errorf("Body is %v, want %v", recorder.Body.String(), tt.wantResponse)
56 }
57 })
58 }
59}2. Unit Test untuk RequestHeaderHandler
Fungsi RequestHeaderHandler adalah middleware yang memeriksa apakah header X-Requested-By ada pada request. Jika tidak ada, middleware ini akan mengembalikan status 400 dengan pesan kesalahan. Berikut adalah unit test untuk middleware ini:
Buat file handlers/headers_test.go dengan konten berikut:
1package handlers
2
3import (
4 "net/http"
5 "net/http/httptest"
6 "testing"
7)
8
9func TestRequestHeaderHandler(t *testing.T) {
10 type args struct {
11 XRequestBy string
12 }
13 tests := []struct {
14 name string
15 args args
16 wantResponse string
17 wantStatus int
18 }{
19 {
20 name: "valid request header",
21 args: args{
22 XRequestBy: "ClientApp",
23 },
24 wantResponse: "header valid",
25 wantStatus: http.StatusOK,
26 },
27 {
28 name: "invalid request header",
29 args: args{
30 XRequestBy: "",
31 },
32 wantResponse: fmt.Sprintln("X-Requested-By header missing"),
33 wantStatus: http.StatusBadRequest,
34 },
35 }
36 for _, tt := range tests {
37 t.Run(tt.name, func(t *testing.T) {
38 // Buat request dengan header yang valid
39 req, err := http.NewRequest("GET", "/validate-request-header", nil)
40 if err != nil {
41 t.Fatal(err)
42 }
43 req.Header.Set("X-Requested-By", tt.args.XRequestBy)
44
45 // Buat ResponseRecorder untuk menangkap response
46 rr := httptest.NewRecorder()
47
48 // Panggil middleware dan handler
49 handler := RequestHeaderHandler(ValidHeader)
50 handler(rr, req, httprouter.Params{})
51
52 // Cek apakah status code yang dihasilkan adalah 400 Bad Request
53 if status := rr.Code; status != tt.wantStatus {
54 t.Errorf("Response code is %v, want %v", status, tt.wantStatus)
55 }
56
57 // Cek apakah body response sesuai
58 if rr.Body.String() != tt.wantResponse {
59 t.Errorf("Body is %s, want %s", rr.Body.String(), tt.wantResponse)
60 }
61 })
62 }
63}
64
65func ValidHeader(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
66 w.Write([]byte("header valid"))
67}Kesimpulan
Dengan httprouter, Anda dapat dengan mudah meng
atur header pada HTTP request dan response. Mengatur header penting untuk komunikasi antara klien dan server, termasuk memastikan keamanan, kontrol caching, dan metadata.
Untuk pembaca yang ingin memperdalam, Anda dapat menjelajahi konsep seperti middleware chaining untuk mengelola lebih banyak alur logika secara modular. Selain itu, pertimbangkan menggunakan tools debugging seperti Postman atau Insomnia untuk menguji header secara visual, atau tambahkan logging ke middleware Anda untuk melacak header saat pengembangan.
Semoga panduan ini membantu Anda lebih memahami pengelolaan header dalam pengembangan aplikasi web di Golang. Jika ada pertanyaan, jangan ragu untuk berdiskusi!