M
Mr Sugiarto
Developer
20 Aug 2026 3 min read

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.

M
Mr Sugiarto

Developer

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
Artikel Terkait