Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
02 Oct 2023 · 4 mnt baca ·Artikel 61 / 119
Go

02 Mempelajari HTTP Router Params

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

Penggunaan HTTP Router Params

Pada httprouter.Handle memiliki parameter tambahan yaitu Params yang mana parameter tersebut digunakan untuk menyimpan parameter yang dikirim dari client tetapi Params ini bukan query dari parameter melainkan yaitu parameter dari URL. Kadang kita butuh untuk membuat URL yang tidak fix atau bisa berubah-ubah misalkan /product/1, /product/2 dan seterusnya.

Pada ServerMux tidak mendukung hal tersebut maka pada Router ada tambahan parameter tersebut salah satunya untuk menangani seperti ini. Namun agar Router kita perlu menambahkan sesuatu pada Route agar URL Path tersebut menjadi dinamis.

Cara Implementasi

Sebelumnya kita membuat sample handler yang mudah dan bagaimana cara memanggil suatu fungsinya agar bisa berjalan pada projeknya. Selanjutnya kita akan mencoba membuat satu endpoint yang menggunakan URL dinamis seperti yang dijelaskan diatas.

Sebelum kesana akan mengubag terlebih dahulu kode kita agar tersusun dengan rapi yaitu endpoint yang sudah kita buat pada postingan sebelumnya. menjadi seperti ini.

go
 1package main
 2
 3import (
 4	"net/http"
 5
 6	"github.com/julienschmidt/httprouter"
 7)
 8
 9func main() {
10	router := httprouter.New()
11
12	router.GET("/", SmpleGetHandler)
13	router.POST("/", SamplePostHandler)
14
15	server := http.Server{
16		Handler: router,
17		Addr:    "localhost:8080",
18	}
19
20	server.ListenAndServe()
21}

Kode diatas merupakan isi dari file main.go. Lalu kita buat file baru handler.go yang isinya seperti dibawah ini.

go
 1package main
 2
 3import (
 4	"fmt"
 5	"net/http"
 6
 7	"github.com/julienschmidt/httprouter"
 8)
 9
10func SampleGetHandler(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
11	fmt.Fprint(w, "Hello Get")
12}
13
14func SamplePostHandler(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
15	fmt.Fprint(w, "Hello Post")
16}

Setelah kode kita sudah rapi, lanjut kita akan menambahkan satu endpoint yang mengimplementasikan params URL dinamis. Maka, tambahkan kode dibawah ini pada file handler.go.

go
1func GetUsedParamsHandler(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
2	text := "Product " + p.ByName("id")
3	fmt.Fprint(w, text)
4}
Lalu kita panggil fungsi handler-nya itu pada fungsi main seperti ini.
go
1router.GET("/product/:id",GetUsedParamsHandler)

Jalankan project atau program diatas lalu kita coba gunakan curl untuk mengakses endpoint yang sudah kita buat seperti ini.

bash
1➜  santekno-hugo git:(main) ✗ curl --location --request GET 'http://localhost:8080/product/1'            
2Product 1%

Jika kita mengubah parameter 1 maka nanti juga akan muncul tampilan yang sesuai dengan input misalkan 2 maka akan keluar Product 2.

Menambahkan Unit Test

Setelah kita buat params handler yang diatas kita juga akan mencoba memastikan handler kita itu benar-benar sesuai dengan kebutuhan yang kita inginkan yaitu dengan cara membuat unit test dari fungsi yang tadi sudah kita buat. Berikut ini fungsi unit test untuk kode yang diatas.

go
 1func TestGetUsedParamsHandler(t *testing.T) {
 2	type args struct {
 3		params string
 4	}
 5	tests := []struct {
 6		name string
 7		args args
 8		want string
 9	}{
10		{
11			name: "test get params with product 1",
12			args: args{
13				params: "1",
14			},
15			want: "Product 1",
16		},
17		{
18			name: "test get params with product 2",
19			args: args{
20				params: "2",
21			},
22			want: "Product 2",
23		},
24	}
25	for _, tt := range tests {
26		t.Run(tt.name, func(t *testing.T) {
27			request := httptest.NewRequest(http.MethodPost, fmt.Sprintf("http://localhost/product/%s", tt.args.params), nil)
28			recorder := httptest.NewRecorder()
29			GetUsedParamsHandler(recorder, request, httprouter.Params{
30				{
31					Key:   "id",
32					Value: tt.args.params,
33				},
34			})
35
36			response := recorder.Result()
37			body, _ := io.ReadAll(response.Body)
38			bodyString := string(body)
39
40			assert.Equal(t, tt.want, bodyString)
41		})
42	}
43}
Lalu kita juga akn tambahkan unit test yang lain pada fungsi-fungsi yang sudah kita buat sebelumnya seperti ini.
go
 1func TestSampleGetHandler(t *testing.T) {
 2	tests := []struct {
 3		name string
 4		want string
 5	}{
 6		{
 7			name: "test get",
 8			want: "Hello Get",
 9		},
10	}
11	for _, tt := range tests {
12		t.Run(tt.name, func(t *testing.T) {
13			request := httptest.NewRequest(http.MethodGet, "http://localhost/", nil)
14			recorder := httptest.NewRecorder()
15			SampleGetHandler(recorder, request, nil)
16
17			response := recorder.Result()
18			body, _ := io.ReadAll(response.Body)
19			bodyString := string(body)
20
21			if !reflect.DeepEqual(bodyString, tt.want) {
22				t.Errorf("response = %v, want %v", bodyString, tt.want)
23			}
24
25			assert.Equal(t, tt.want, bodyString)
26		})
27	}
28}
29
30func TestSamplePostHandler(t *testing.T) {
31	tests := []struct {
32		name string
33		want string
34	}{
35		{
36			name: "test post",
37			want: "Hello Post",
38		},
39	}
40	for _, tt := range tests {
41		t.Run(tt.name, func(t *testing.T) {
42			request := httptest.NewRequest(http.MethodPost, "http://localhost/", nil)
43			recorder := httptest.NewRecorder()
44			SamplePostHandler(recorder, request, nil)
45
46			response := recorder.Result()
47			body, _ := io.ReadAll(response.Body)
48			bodyString := string(body)
49
50			assert.Equal(t, tt.want, bodyString)
51		})
52	}
53}

Artikel Terkait

💬 Komentar