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)
}
})
}
}