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:
go get github.com/julienschmidt/httprouter
Langkah 1: Mengatur Struktur Proyek
Buat struktur proyek berikut:
project/
├── main.go
└── handlers/
└── 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:
package handlers
import (
"net/http"
"github.com/julienschmidt/httprouter"
)
// ResponseHeaderHandler menambahkan header ke response
func ResponseHeaderHandler(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
w.Header().Set("Content-Type", "application/json")
w.Header().Set("X-Custom-Header", "Belajar Golang")
w.WriteHeader(http.StatusOK)
w.Write([]byte(`{"message":"Header berhasil disetel!"}`))
}
2. Menghubungkan Handler di main.go
Buka file main.go
dan tambahkan handler baru:
package main
import (
"log"
"net/http"
"github.com/julienschmidt/httprouter"
"project/handlers"
)
func main() {
router := httprouter.New()
// Menambahkan handler untuk response header
router.GET("/set-response-header", handlers.ResponseHeaderHandler)
log.Println("Server berjalan di http://localhost:8080")
log.Fatal(http.ListenAndServe(":8080", router))
}
3. Menguji Endpoint
Jalankan server:
go run main.go
Akses endpoint di browser atau gunakan curl
:
curl -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:
// RequestHeaderHandler memproses header dari request
func RequestHeaderHandler(next httprouter.Handle) httprouter.Handle {
return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
headerValue := r.Header.Get("X-Requested-By")
if headerValue == "" {
http.Error(w, "X-Requested-By header missing", http.StatusBadRequest)
return
}
next(w, r, ps)
}
}
2. Menambahkan Handler Middleware
Modifikasi file main.go
untuk menggunakan middleware:
router.GET("/validate-request-header", handlers.RequestHeaderHandler(func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
w.Write([]byte("Header valid!"))
}))
3. Menguji Endpoint
Jalankan server kembali dan gunakan curl
:
curl -i -H "X-Requested-By: ClientApp" http://localhost:8080/validate-request-header
Jika header valid, responsnya:
Header valid!
Jika header tidak ada, respons akan menunjukkan kesalahan:
X-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:
package handlers
import (
"net/http"
"net/http/httptest"
"testing"
)
func TestResponseHeaderHandler(t *testing.T) {
// Buat request dummy
req, err := http.NewRequest("GET", "/set-response-header", nil)
if err != nil {
t.Fatal(err)
}
// Buat ResponseRecorder untuk menangkap response
rr := httptest.NewRecorder()
// Panggil handler
handler := http.HandlerFunc(ResponseHeaderHandler)
handler.ServeHTTP(rr, req)
// Cek apakah status code yang dihasilkan adalah 200 OK
if status := rr.Code; status != http.StatusOK {
t.Errorf("Response code is %v, want %v", status, http.StatusOK)
}
// Cek apakah header Content-Type yang dihasilkan adalah 'application/json'
if contentType := rr.Header().Get("Content-Type"); contentType != "application/json" {
t.Errorf("Content-Type header is %v, want %v", contentType, "application/json")
}
// Cek apakah header X-Custom-Header yang dihasilkan sesuai
if customHeader := rr.Header().Get("X-Custom-Header"); customHeader != "Belajar Golang" {
t.Errorf("X-Custom-Header is %v, want %v", customHeader, "Belajar Golang")
}
// Cek apakah body response berisi pesan yang diinginkan
expectedBody := `{"message":"Header berhasil disetel!"}`
if rr.Body.String() != expectedBody {
t.Errorf("Body is %v, want %v", rr.Body.String(), expectedBody)
}
}
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:
package handlers
import (
"net/http"
"net/http/httptest"
"testing"
)
func TestRequestHeaderHandler_ValidHeader(t *testing.T) {
// Buat request dengan header yang valid
req, err := http.NewRequest("GET", "/validate-request-header", nil)
if err != nil {
t.Fatal(err)
}
req.Header.Set("X-Requested-By", "ClientApp")
// Buat ResponseRecorder untuk menangkap response
rr := httptest.NewRecorder()
// Panggil middleware dan handler
handler := RequestHeaderHandler(func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
w.Write([]byte("Header valid!"))
})
handler.ServeHTTP(rr, req)
// Cek apakah status code yang dihasilkan adalah 200 OK
if status := rr.Code; status != http.StatusOK {
t.Errorf("Response code is %v, want %v", status, http.StatusOK)
}
// Cek apakah body response sesuai
expectedBody := "Header valid!"
if rr.Body.String() != expectedBody {
t.Errorf("Body is %v, want %v", rr.Body.String(), expectedBody)
}
}
func TestRequestHeaderHandler_MissingHeader(t *testing.T) {
// Buat request tanpa header 'X-Requested-By'
req, err := http.NewRequest("GET", "/validate-request-header", nil)
if err != nil {
t.Fatal(err)
}
// Buat ResponseRecorder untuk menangkap response
rr := httptest.NewRecorder()
// Panggil middleware dan handler
handler := RequestHeaderHandler(func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
w.Write([]byte("Header valid!"))
})
handler.ServeHTTP(rr, req)
// Cek apakah status code yang dihasilkan adalah 400 Bad Request
if status := rr.Code; status != http.StatusBadRequest {
t.Errorf("Response code is %v, want %v", status, http.StatusBadRequest)
}
// Cek apakah body response sesuai
expectedBody := "X-Requested-By header missing"
if rr.Body.String() != expectedBody {
t.Errorf("Body is %v, want %v", rr.Body.String(), expectedBody)
}
}
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!