pemrograman

05 Request Form Post

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.

func FormPostHandler(w http.ResponseWriter, r *http.Request) {
	err := r.ParseForm()
	if err != nil {
		panic(err)
	}

	firstName := r.PostForm.Get("first_name")
	lastName := r.PostForm.Get("last_name")
	fmt.Fprintf(w, "%s %s", firstName, lastName)
}

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.

func TestFormPostHandler(t *testing.T) {
	type args struct {
		firstName string
		lastName  string
	}
	tests := []struct {
		name string
		args args
		want string
	}{
		{
			name: "set form post param",
			args: args{
				firstName: "ihsan",
				lastName:  "arif",
			},
			want: "ihsan arif",
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			requestBody := strings.NewReader(fmt.Sprintf("first_name=%s&last_name=%s", tt.args.firstName, tt.args.lastName))
			request := httptest.NewRequest(http.MethodPost, "http://localhost/say", requestBody)
			request.Header.Add("Content-Type", "application/x-www-form-urlencoded")
			recorder := httptest.NewRecorder()
			FormPostHandler(recorder, request)

			response := recorder.Result()
			body, _ := io.ReadAll(response.Body)
			bodyString := string(body)

			if !reflect.DeepEqual(bodyString, tt.want) {
				t.Errorf("bodyString = %v, want %v", bodyString, tt.want)
			}
		})
	}
}
Previous post
04 Request Header
comments powered by Disqus