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.
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