M
Mr Sugiarto
Developer
22 Aug 2026 3 min read

Sampai part sebelumnya, response dari tiap endpoint kita masih belum konsisten formatnya — ada yang langsung return object, ada yang pakai key error, ada yang pakai key errors. Di part ini kita akan rapikan itu semua dengan membuat format response standar (envelope) yang dipakai di seluruh endpoint, plus menangani endpoint yang tidak ditemukan (404).

Kenapa Perlu Response Standar?

Bayangkan kita sebagai frontend/mobile developer yang mengonsumsi API ini. Kalau tiap endpoint punya format response yang berbeda-beda, kita harus menulis logic parsing yang berbeda-beda juga di sisi client. Dengan format response yang konsisten, client cukup satu kali menulis logic untuk membaca success, message, dan data/errors di semua endpoint.

Format envelope yang kita pakai:

{
  "success": true,
  "message": "Post created successfully",
  "data": { ... }
}

atau untuk response gagal:

{
  "success": false,
  "message": "Validation failed",
  "errors": { ... }
}

Membuat Response Helper

Buat file baru app/helpers/response_helper.go:

package helpers

import "github.com/goravel/framework/contracts/http"

func Success(ctx http.Context, code int, message string, data any) http.Response {
	return ctx.Response().Json(code, http.Json{
		"success": true,
		"message": message,
		"data":    data,
	})
}

func Error(ctx http.Context, code int, message string, errors any) http.Response {
	return ctx.Response().Json(code, http.Json{
		"success": false,
		"message": message,
		"errors":  errors,
	})
}

Dua fungsi ini yang nantinya kita pakai di semua controller, menggantikan pemanggilan ctx.Response().Json(...) manual satu-satu.

Merapikan PostController

Refactor tiap method di app/http/controllers/post_controller.go supaya memakai helper di atas. Contoh untuk method Store:

func (r *PostController) Store(ctx http.Context) http.Response {
	validator, err := ctx.Request().Validate(map[string]string{
		"title": "required|max_len:255",
		"body":  "required",
	})

	if err != nil {
		return helpers.Error(ctx, http.StatusInternalServerError, "Failed to validate request", err.Error())
	}

	if validator.Fails() {
		return helpers.Error(ctx, http.StatusUnprocessableEntity, "Validation failed", validator.Errors().All())
	}

	post := models.Post{
		Title:  ctx.Request().Input("title"),
		Body:   ctx.Request().Input("body"),
		Status: "DRAFT",
	}

	if err := facades.Orm().Query().Create(&post); err != nil {
		return helpers.Error(ctx, http.StatusBadRequest, "Failed to create post", err.Error())
	}

	return helpers.Success(ctx, http.StatusCreated, "Post created successfully", post)
}

Method Index, Show, Update, dan Destroy juga dirapikan dengan pola yang sama — cukup panggil helpers.Success(...) atau helpers.Error(...) sesuai kondisinya. Lakukan hal yang sama untuk UserController (method Register dan Login).

Menangani Endpoint yang Tidak Ditemukan

Selain response envelope, satu hal lagi yang perlu dirapikan: kalau ada request ke endpoint yang tidak terdaftar, defaultnya framework akan mengembalikan response bawaan (biasanya HTML atau format yang tidak konsisten). Goravel menyediakan Fallback di router untuk menangani ini.

Tambahkan di routes/api.go:

facades.Route().Fallback(func(ctx http.Context) http.Response {
	return helpers.Error(ctx, http.StatusNotFound, "Endpoint not found", nil)
})

Sekarang semua request ke endpoint yang tidak terdaftar akan tetap mengembalikan response JSON dengan format yang sama seperti endpoint lainnya.

Testing

Jalankan ulang server, lalu coba:

curl http://127.0.0.1:3000/posts

Response sekarang akan terbungkus dalam format {"success": true, "message": "...", "data": [...]}.

Coba juga akses endpoint yang tidak ada:

curl http://127.0.0.1:3000/endpoint-ngasal

Akan mendapat response 404 dengan body {"success": false, "message": "Endpoint not found", "errors": null}.

Penutup

Response envelope ini kecil tapi penting — akan jadi fondasi buat part-part selanjutnya, termasuk saat kita menambahkan pagination, karena bagian data bisa kita isi dengan info pagination tanpa mengubah struktur response secara keseluruhan.

M
Mr Sugiarto

Developer

Bagian dari Series: Seri Tutorial Belajar Framework Goravel Rest API untuk Pemula

Overview Seri ini membahas cara membangun REST API menggunakan Goravel, framework web berbasis Golang yang terinspirasi dari Laravel. Materi mencakup...

Lihat Series Lengkap