Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
19 Jan 2025 · 6 mnt baca ·Artikel 68 / 119
Go

09 Cara Membuat Request Response Header Menggunakan Httprouter

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

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:

  1. Instalasi Golang: Pastikan Go sudah terinstal di sistem Anda.
  2. Proyek Baru: Buat proyek baru dengan struktur file dasar.
  3. Library Httprouter: Pasang library httprouter dengan perintah berikut:
    bash
    1go get github.com/julienschmidt/httprouter

Langkah 1: Mengatur Struktur Proyek

Buat struktur proyek berikut:

bash
1project/
2├── main.go
3└── handlers/
4    └── headers.go

Langkah 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:

go
 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:

go
 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:

bash
1go run main.go

Akses endpoint di browser atau gunakan curl:

bash
1curl -i http://localhost:8080/set-response-header

Respons 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:

go
 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:

go
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:

bash
1curl -i -H "X-Requested-By: ClientApp" http://localhost:8080/validate-request-header

Jika header valid, responsnya:

bash
1Header valid!

Jika header tidak ada, respons akan menunjukkan kesalahan:

bash
1X-Requested-By header missing

Langkah 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:

go
 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:

go
 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!

Artikel Terkait

💬 Komentar