pemrograman

06 Response Code

Pengenalan Response Code

Hal yang perlu kita ketahui juga dalam HTTP yaitu response code. Ini merupakan representasi dari kode response yang mana dari kode ini kita bisa melihat apakah sebuah request yang kita kirim dari client itu sukses dilakukan proses oleh server atau gagal diproses oleh server. Maka ada banyak sekali response code yang bisa kita gunakan saat membuat web. Kamu bisa langsung lihat lebih dalam beberapa HTTP Status Code disini https://developer.mozilla.org/en-US/docs/Web/HTTP/Status

Ada 5 kelompok HTTP Response Status Code yang dijelaskan pada link diatas yaitu:

  1. Informational response (100 - 199) : biasanya ini digunakan untuk menginformasikan response dari status. Jarang sekali biasanya ini digunakan.
  2. Successful responses (200 - 299) digunakan untuk response yang sukses
  3. Redirects (300 - 399) : digunakan untuk melakukan redirect ke URL tertentu
  4. Client errors (400 - 499) : digunakan untuk menginformasikan ada beberapa param atau request yang salah
  5. Server errors (500 - 599) : digunakan untuk menginformasikan bahwa ada proses server yang bermasalah

Secara default jika kita tidak melakukan set response code maka akan mengeluarkan code 200 yang artinya sukses. Jika kita ingin mengubahnya maka kita bisa gunakan function ResponseWriter.WriteHeader(int) untuk memberikan informasi response code-nya. Semua data status code juga sudah disediakan oleh Golang, jadi jika ikita ingin menggunakannya kita tinggal memanggil variable yang sudah disediakan pada golang disini https://github.com/golang/go/blob/master/src/net/http/status.go.

Implementasi

Sekarang kita akan coba mengubah response code yang dikembalikan dari sistem kita seperti kode dibawah ini.

func ResponseCodeHandler(w http.ResponseWriter, r *http.Request) {
	name := r.URL.Query().Get("name")
	if name == "" {
		w.WriteHeader(http.StatusBadRequest)
		fmt.Fprint(w, "name is empty")
	} else {
		w.WriteHeader(http.StatusOK)
		fmt.Fprintf(w, "Hello %s", name)
	}
}

Selanjutnya kita akan uji fungsi yang sudah kita buat diatas dengan menambahkan unit test agar kita tahu proses logic yang kita buat itu sudah benar atau tidak.

func TestResponseCodeHandler(t *testing.T) {
	type args struct {
		name string
	}
	tests := []struct {
		name     string
		args     args
		wantResp string
		wantCode int
	}{
		{
			name: "sent param name with value",
			args: args{
				name: "ihsan",
			},
			wantResp: "Hello ihsan",
			wantCode: http.StatusOK,
		},
		{
			name: "does't sent param name",
			args: args{
				name: "",
			},
			wantResp: "name is empty",
			wantCode: http.StatusBadRequest,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			request := httptest.NewRequest(http.MethodGet, fmt.Sprintf("http://localhost/say?name=%s", tt.args.name), nil)
			recorder := httptest.NewRecorder()
			ResponseCodeHandler(recorder, request)

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

			if !reflect.DeepEqual(bodyString, tt.wantResp) {
				t.Errorf("response = %v, want %v", bodyString, tt.wantResp)
			}

			if !reflect.DeepEqual(code, tt.wantCode) {
				t.Errorf("code = %v, want %v", code, tt.wantCode)
			}
		})
	}
}
comments powered by Disqus