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

05 Request Form Post

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

Pengenalan Form Post

Sama halnya dengan postingan sebelumnya ketika kita menggunakan method GET maka hasil semua data di form akan menjadi query param sedangkan jika kita menggunakan POST maka semua data di form dikirim via body HTTP Request hanya berbeda methodnya saja. Semua data form post yang dikirim dari client secara otomatis akan disimpan dalam atribut Request.PostFrom. Namun sebelum kita bisa mengambil data atribut PostForm, kita wajib memanggil method Request.ParseForm() terlebih dahulu lalu method ini akan digunakan untuk melakukan parsing body. Parsing data tersebut akan menghasilkan data form, jika tidak ada maka akan menyebabkan error pada parsing-nya.

Implementasi

Berikut ini contoh bagaimana kita mengimplementasikan Form Post.

go
 1func FormPostHandler(w http.ResponseWriter, r *http.Request) {
 2	err := r.ParseForm()
 3	if err != nil {
 4		panic(err)
 5	}
 6
 7	firstName := r.PostForm.Get("first_name")
 8	lastName := r.PostForm.Get("last_name")
 9	fmt.Fprintf(w, "%s %s", firstName, lastName)
10}

Lalu bagaimana cara mengujinya apakah handler kita sudah berhasil atau belum? Seperti biasanya kita akan mengujinya dengan menggunakan unit test yang ada pada golang. Coba klik kanan pada fungsi yang sudah kita buat lalu buat unit test dan maka VSCode akan langsung otomatis dibuatkan kerangka unit test-nya. Agar lebih paham lagi bisa lihat lebih lengkap dibawah ini.

go
 1func TestFormPostHandler(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: "set form post param",
13			args: args{
14				firstName: "ihsan",
15				lastName:  "arif",
16			},
17			want: "ihsan arif",
18		},
19	}
20	for _, tt := range tests {
21		t.Run(tt.name, func(t *testing.T) {
22			requestBody := strings.NewReader(fmt.Sprintf("first_name=%s&last_name=%s", tt.args.firstName, tt.args.lastName))
23			request := httptest.NewRequest(http.MethodPost, "http://localhost/say", requestBody)
24			request.Header.Add("Content-Type", "application/x-www-form-urlencoded")
25			recorder := httptest.NewRecorder()
26			FormPostHandler(recorder, request)
27
28			response := recorder.Result()
29			body, _ := io.ReadAll(response.Body)
30			bodyString := string(body)
31
32			if !reflect.DeepEqual(bodyString, tt.want) {
33				t.Errorf("bodyString = %v, want %v", bodyString, tt.want)
34			}
35		})
36	}
37}

Artikel Terkait

💬 Komentar