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

03 Penggunaan Query Parameter

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

Pengenalan Query Parameter

Query parameter adalah salah satu fitur dari http yang biasanya kita gunakan untuk mengirim data dari client ke dalam server. Query pameter ini ditempatkan pada URL dari endpoint yang sudah kita buat. Untuk menambahkan query parameter, kita bisa gunakan ?=nama=value pada URL website kita.

Package url.URL

Package yang kita pakai untuk mengenal parameter query yaitu url.URL pada parameter request. Dari URL ini kita bisa mengambil data query parameter yang dikirim dari client dengan menggunakan method Query() dengan pengembalian data tipe map.

Contohnya kita akan membuat handler yang menerima parameter dari client seperti dibawah ini.

go
1func SayHelloParameterHandler(w http.ResponseWriter, r *http.Request) {
2	name := r.URL.Query().Get("name")
3	if name == "" {
4		fmt.Fprint(w, "Hello")
5	} else {
6		fmt.Fprintf(w, "Hello %s", name)
7	}
8}

Fungsi ini perlu kita buktikan hasil ini berjalan dengan baik, kita perlu menambahkan unit test seperti dibawah ini.

go
 1func TestSayHelloParameterHandler(t *testing.T) {
 2	type args struct {
 3		name string
 4	}
 5	tests := []struct {
 6		name string
 7		args args
 8		want string
 9	}{
10		{
11			name: "success return response with name",
12			args: args{
13				name: "santekno",
14			},
15			want: "Hello santekno",
16		},
17		{
18			name: "success return response without name",
19			args: args{
20				name: "",
21			},
22			want: "Hello",
23		},
24	}
25	for _, tt := range tests {
26		t.Run(tt.name, func(t *testing.T) {
27			request := httptest.NewRequest(http.MethodGet, fmt.Sprintf("http://localhost/say?name=%s", tt.args.name), nil)
28			recorder := httptest.NewRecorder()
29			SayHelloParameterHandler(recorder, request)
30
31			response := recorder.Result()
32			body, _ := io.ReadAll(response.Body)
33			bodyString := string(body)
34
35			if !reflect.DeepEqual(bodyString, tt.want) {
36				t.Errorf("response = %v, want %v", bodyString, tt.want)
37			}
38		})
39	}
40}

Multiple Query Parameter

Ketika kita ingin menerima lebih dari satu parameter yang dikirim oleh client maka spesifikasi URL ini sudah bisa mendukung untuk mengirim banyak parameter ke dalam server dengan cara kita bisa gunakan tanda & lalu diikuti dengan query parameter berikutnya.

Contohnya pada client dikirim dua parameter query dan nantinya akan diterima oleh server dengan handler dibawah ini.

go
1func MultipleParameterHandler(w http.ResponseWriter, r *http.Request) {
2	firstName := r.URL.Query().Get("first_name")
3	lastName := r.URL.Query().Get("last_name")
4	if firstName == "" && lastName == "" {
5		fmt.Fprint(w, "Hello")
6	} else {
7		fmt.Fprintf(w, "Hello %s %s", firstName, lastName)
8	}
9}

kita coba test hasil dari fungsi yang sudah kita buat diatas dengan membuat unit test dibawah ini.

go
 1func TestMultipleParameterHandler(t *testing.T) {
 2	type args struct {
 3		firstName string
 4		lastName  string
 5	}
 6	tests := []struct {
 7		name string
 8		args args
 9		want string
10	}{
11		{
12			name: "success return response with name",
13			args: args{
14				firstName: "Santekno",
15				lastName:  "Inc",
16			},
17			want: "Hello Santekno Inc",
18		},
19		{
20			name: "success return response without name",
21			args: args{
22				firstName: "",
23				lastName:  "",
24			},
25			want: "Hello",
26		},
27	}
28	for _, tt := range tests {
29		t.Run(tt.name, func(t *testing.T) {
30			request := httptest.NewRequest(http.MethodGet, fmt.Sprintf("http://localhost/say?first_name=%s&last_name=%s", tt.args.firstName, tt.args.lastName), nil)
31			recorder := httptest.NewRecorder()
32			MultipleParameterHandler(recorder, request)
33
34			response := recorder.Result()
35			body, _ := io.ReadAll(response.Body)
36			bodyString := string(body)
37
38			if !reflect.DeepEqual(bodyString, tt.want) {
39				t.Errorf("response = %v, want %v", bodyString, tt.want)
40			}
41		})
42	}
43}

Multiple Value Query Parameter

Query URL sebenarnya bisa kita melakukan parsing query parameter dan menyimpannya dalam tipe map[string][]string. Artinya, dalam satu key query parameter kita bisa memasukkan beberapa value. Bagaimana caranya? dengan cara menambahkan name parameter dengan nama yang sama namun value-nya berbeda-beda, misalkan:

bash
1name=Santekno&name=Ihsan

Sebelumnya kita menggunakan method Get() untuk mendapatkan datanya, karena saat ini kondisinya multiple value maka kita tidak bisa menggunakan method tersebut. Maka, ada cara lain agar data tersebut bisa kita ambil.

go
1func MultipleParameterValueHandler(w http.ResponseWriter, r *http.Request) {
2	query := r.URL.Query()
3	names := query["name"]
4	if len(names) == 0 {
5		fmt.Fprint(w, "Hello")
6	} else {
7		fmt.Fprintf(w, "Hello %s", strings.Join(names, " "))
8	}
9}

Kita coba lakukan test dengan membuat unit test agar bisa memastikan data sesuai dengan param yg dikirim.

go
 1func TestMultipleParameterValueHandler(t *testing.T) {
 2	type args struct {
 3		name []string
 4	}
 5	tests := []struct {
 6		name string
 7		args args
 8		want string
 9	}{
10		{
11			name: "success return response with name",
12			args: args{
13				name: []string{"santekno", "ihsan"},
14			},
15			want: "Hello santekno ihsan",
16		},
17	}
18	for _, tt := range tests {
19		t.Run(tt.name, func(t *testing.T) {
20			request := httptest.NewRequest(http.MethodGet, fmt.Sprintf("http://localhost/say?name=%s&name=%s", tt.args.name[0], tt.args.name[1]), nil)
21			recorder := httptest.NewRecorder()
22			MultipleParameterValueHandler(recorder, request)
23
24			response := recorder.Result()
25			body, _ := io.ReadAll(response.Body)
26			bodyString := string(body)
27
28			if !reflect.DeepEqual(bodyString, tt.want) {
29				t.Errorf("response = %v, want %v", bodyString, tt.want)
30			}
31		})
32	}
33}

Artikel Terkait

💬 Komentar