Di part sebelumnya kita sudah punya server GoFiber pertama dengan satu route sederhana langsung di main.go. Di part ini kita akan rapikan itu dengan memisahkan handler ke package sendiri, sekaligus membahas dasar routing di Fiber: parameter, grouping, dan HTTP method.
Membuat Handler
Daripada menulis semua logic langsung di main.go, kita pisahkan ke package handlers. Misalnya kita akan membuat handler untuk resource Post dengan method Index, Show, Create, Update, dan Delete.
Buat file handlers/post_handler.go:
package handlers
import (
"strconv"
"github.com/gofiber/fiber/v2"
)
type PostHandler struct {
// Dependent services (diisi belakangan setelah DB terhubung)
}
func NewPostHandler() *PostHandler {
return &PostHandler{}
}
func (h *PostHandler) Index(c *fiber.Ctx) error {
posts := []fiber.Map{
{"id": 1, "title": "Hello World", "body": "Post pertama kita"},
{"id": 2, "title": "Belajar GoFiber", "body": "Post kedua kita"},
}
return c.JSON(fiber.Map{
"data": posts,
})
}
func (h *PostHandler) Show(c *fiber.Ctx) error {
id, err := strconv.Atoi(c.Params("id"))
if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"message": "id harus berupa angka",
})
}
return c.JSON(fiber.Map{
"data": fiber.Map{"id": id, "title": "Hello World", "body": "Post pertama kita"},
})
}
func (h *PostHandler) Create(c *fiber.Ctx) error {
return c.Status(fiber.StatusCreated).JSON(fiber.Map{
"message": "Post berhasil dibuat.",
})
}
func (h *PostHandler) Update(c *fiber.Ctx) error {
return c.JSON(fiber.Map{
"message": "Post berhasil diupdate.",
})
}
func (h *PostHandler) Delete(c *fiber.Ctx) error {
return c.SendStatus(fiber.StatusNoContent)
}
Untuk sekarang data masih statis (hardcoded), belum tersambung ke database — itu akan kita bahas di part berikutnya setelah koneksi MySQL siap.
Route Parameter
Perhatikan method Show di atas. Kita ambil parameter id dari URL lewat c.Params("id"). Misalnya untuk route /posts/:id, request ke /posts/5 akan membuat c.Params("id") bernilai "5".
Route Grouping
Alih-alih mendaftarkan tiap route satu-satu dengan path lengkap, Fiber punya Group() untuk mengelompokkan route dengan prefix yang sama. Buat file routes/routes.go:
package routes
import (
"github.com/gofiber/fiber/v2"
"blogfiber/handlers"
)
func Setup(app *fiber.App) {
postHandler := handlers.NewPostHandler()
api := app.Group("/api/v1")
posts := api.Group("/posts")
posts.Get("/", postHandler.Index)
posts.Get("/:id", postHandler.Show)
posts.Post("/", postHandler.Create)
posts.Put("/:id", postHandler.Update)
posts.Delete("/:id", postHandler.Delete)
}
Dengan grouping seperti ini, semua route di atas otomatis punya prefix /api/v1/posts. Kalau nanti kita tambah resource baru (misalnya users atau categories), tinggal buat group baru tanpa mengulang prefix.
Menghubungkan ke main.go
Panggil routes.Setup(app) di main.go:
package main
import (
"log"
"github.com/gofiber/fiber/v2"
"blogfiber/routes"
)
func main() {
app := fiber.New()
app.Get("/", func(c *fiber.Ctx) error {
return c.JSON(fiber.Map{
"message": "Hello from GoFiber!",
})
})
routes.Setup(app)
log.Fatal(app.Listen(":3000"))
}
Testing Endpoint
Jalankan servernya:
go run main.go
Lalu coba beberapa endpoint:
curl http://127.0.0.1:3000/api/v1/posts
curl http://127.0.0.1:3000/api/v1/posts/1
curl -X POST http://127.0.0.1:3000/api/v1/posts
Kalau semua mengembalikan response JSON sesuai handler masing-masing, berarti routing dan pola handler kita sudah berjalan dengan baik. Di part berikutnya kita akan hubungkan project ini ke database MySQL menggunakan GORM.
Bagian dari Series: GoFiber Dasar - Belajar Fundamental Lewat REST API Blog
Belajar konsep-konsep dasar GoFiber (routing, handler, GORM, MySQL, JWT auth) dengan membangun REST API blog sederhana dari nol - lengkap dengan auten...
Lihat Series Lengkap