Kodeloka
  1. Kodeloka
  2. Kelas Golang
  3. Materi

Domain 23 · 9 bab

Golang Fiber Web Framework

243. Pengenalan Fiber Framework & Fasthttp Engine

Memahami arsitektur Fiber Web Framework yang terinspirasi dari Express.js dan didukung HTTP engine super cepat Fasthttp.

Apa itu Fiber Web Framework?

Fiber adalah web framework untuk Golang yang dibangun di atas Fasthttp (HTTP engine tercepat di Go). Sintaks Fiber dibuat sangat intuitif bagi developer yang terbiasa dengan Express.js (Node.js).

⚡ Kenapa Fiber Sangat Cepat?
  • Zero Allocation: Meminimalkan alokasi memori saat menangani HTTP Request.
  • Low Memory Footprint: Konsumsi RAM sangat kecil.
  • Rich Ecosystem: Memiliki puluhan middleware resmi (CORS, JWT, Rate Limiter, Logger, Helmet).

Instalasi Fiber v2:

go get github.com/gofiber/fiber/v2

Contoh program

package main

import (
	"fmt"
)

// Simulasi Struktur Framework Fiber
type FiberApp struct {
	routes map[string]string
}

func NewFiberApp() *FiberApp {
	return &FiberApp{routes: make(map[string]string)}
}

func (a *FiberApp) Get(path string, handler string) {
	a.routes["GET "+path] = handler
}

func main() {
	fmt.Println("=== INITIALIZING FIBER WEB APP ===")
	app := NewFiberApp()
	app.Get("/", "Welcome to Fiber!")
	app.Get("/api/health", "Status OK")

	for route, handler := range app.routes {
		fmt.Printf("Registered Route: %-15s => %s\n", route, handler)
	}
}

Praktik dan kuis bab ini di kelas interaktif →

244. Inisialisasi App & Routing Dasar (GET, POST, PUT, DELETE)

Membuat aplikasi Fiber pertama, mendaftarkan HTTP methods, dan mengembalikan response text/json.

Sintaks Routing Dasar Fiber

Di Fiber, instansiasi server dilakukan dengan app := fiber.New() dan dijalankan dengan app.Listen(":3000").

📌 HTTP Method Handlers:
app.Get("/users", func(c *fiber.Ctx) error {
    return c.SendString("Get All Users")
})

app.Post("/users", func(c *fiber.Ctx) error {
    return c.Status(201).JSON(fiber.Map{"message": "User Created"})
})

app.Put("/users/:id", func(c *fiber.Ctx) error {
    return c.SendString("Update User")
})

app.Delete("/users/:id", func(c *fiber.Ctx) error {
    return c.SendStatus(204)
})

Contoh program

package main

import (
	"fmt"
)

type CtxMock struct {
	Method string
	Path   string
}

func (c *CtxMock) SendString(msg string) {
	fmt.Printf("[%s %s] Response: %s\n", c.Method, c.Path, msg)
}

func main() {
	fmt.Println("=== DEMO FIBER ROUTING ===")
	getRoute := CtxMock{Method: "GET", Path: "/api/v1/ping"}
	getRoute.SendString("pong")

	postRoute := CtxMock{Method: "POST", Path: "/api/v1/users"}
	postRoute.SendString("User Created Successfully")
}

Praktik dan kuis bab ini di kelas interaktif →

245. Fiber Context (fiber.Ctx) & Request Handling

Mengekstrak Path Parameter, Query Parameter, Request Header, dan Body Parsing menggunakan fiber.Ctx.

Membedah `fiber.Ctx`

Object *fiber.Ctx menyimpan seluruh informasi request dan response HTTP.

Tipe Data Method Context Contoh Penggunaan
Path Parameter c.Params("id") GET /users/:id
Query Parameter c.Query("page") GET /users?page=2
Request Header c.Get("Authorization") Membaca token Bearer
JSON Body Payload c.BodyParser(&user) Decode otomatis JSON request body ke struct

Contoh program

package main

import (
	"fmt"
)

type UserDTO struct {
	Name  string `json:"name"`
	Email string `json:"email"`
}

func main() {
	// Simulasi BodyParser Fiber
	dummyBody := `{"name": "Budi", "email": "[email protected]"}`

	fmt.Println("=== SIMULASI FIBER BodyParser ===")
	fmt.Println("Incoming Raw Request Body:", dummyBody)
	fmt.Println("BodyParser berhasil melakukan unmarshal JSON ke struct UserDTO!")
}

Praktik dan kuis bab ini di kelas interaktif →

246. Response Formatting & Status Codes (JSON, HTML, SendFile, SendStatus)

Mengirimkan berbagai jenis response seperti JSON terstruktur, status code, file download, dan fiber.Map.

Ragam Jenis Response di Fiber

Fiber memudahkan pembuatan response API yang konsisten.

💡 Helper Respon Populer:
  • c.JSON(data): Mengirim data sebagai JSON (Header Content-Type: application/json).
  • fiber.Map{"key": "value"}: Shortcut pembuatan map `map[string]interface{}` untuk JSON dinamis.
  • c.Status(fiber.StatusCreated): Menentukan HTTP Status Code (200, 201, 400, 500).
  • c.SendFile("./static/doc.pdf"): Mengirim file fisik ke browser klien.

Contoh program

package main

import (
	"encoding/json"
	"fmt"
)

// Simulasi fiber.Map
type FiberMap map[string]interface{}

func main() {
	response := FiberMap{
		"code":    200,
		"status":  "OK",
		"message": "Data berhasil ditemukan",
		"data": FiberMap{
			"id":   101,
			"name": "Buku Golang Fiber",
		},
	}

	bytes, _ := json.MarshalIndent(response, "", "  ")
	fmt.Println("=== FIBER JSON RESPONSE MAP ===")
	fmt.Println(string(bytes))
}

Praktik dan kuis bab ini di kelas interaktif →

247. Fiber Middleware (Logger, Recover, CORS, Limiter)

Menggunakan middleware bawaan Fiber dan mendesain custom middleware untuk autentikasi token.

Konsep Middleware di Fiber

Middleware adalah fungsi yang dieksekusi sebelum atau sesudah HTTP Handler utama dipanggil. Middleware digunakan untuk logging, menangani panic, keamanan CORS, dan proteksi autentikasi.

📌 Memasang Middleware Resmi Fiber:
import (
    "github.com/gofiber/fiber/v2/middleware/logger"
    "github.com/gofiber/fiber/v2/middleware/recover"
    "github.com/gofiber/fiber/v2/middleware/cors"
)

app.Use(logger.New())  // Logging HTTP Request ke console
app.Use(recover.New()) // Mencegah server crash akibat Panic
app.Use(cors.New())    // Izinkan Cross-Origin Resource Sharing

Contoh program

package main

import (
	"fmt"
)

// Simulasi Middleware Chain Fiber
func AuthMiddleware(token string) bool {
	if token == "secret-token-123" {
		return true
	}
	return false
}

func main() {
	tokens := []string{"secret-token-123", "wrong-token"}

	fmt.Println("=== DEMO FIBER AUTH MIDDLEWARE ===")
	for _, t := range tokens {
		if AuthMiddleware(t) {
			fmt.Printf("Token '%s' => ACCESS GRANTED (c.Next() dipanggil)\n", t)
		} else {
			fmt.Printf("Token '%s' => ACCESS DENIED (HTTP 401 Unauthorized)\n", t)
		}
	}
}

Praktik dan kuis bab ini di kelas interaktif →

248. Grouping Router & Versioning API

Mengorganisir endpoint API berukuran besar menggunakan Route Grouping dan API Versioning (v1, v2).

Grouping Route untuk Aplikasi Skala Besar

Agar file `main.go` tidak berantakan, Fiber menyediakan fungsi app.Group() untuk mengelompokkan endpoint berdasarkan prefix path atau versi API.

💡 Contoh Grouping Route:
api := app.Group("/api") // Prefix /api

v1 := api.Group("/v1")   // Prefix /api/v1
v1.Get("/users", getUsersV1)

v2 := api.Group("/v2")   // Prefix /api/v2
v2.Get("/users", getUsersV2)

Contoh program

package main

import (
	"fmt"
)

func main() {
	routes := map[string]string{
		"/api/v1/products": "Get Products Version 1 (Legacy)",
		"/api/v2/products": "Get Products Version 2 (High Performance)",
	}

	fmt.Println("=== API VERSION GROUPING ===")
	for path, desc := range routes {
		fmt.Printf("Endpoint: %-20s => %s\n", path, desc)
	}
}

Praktik dan kuis bab ini di kelas interaktif →

249. Fiber Error Handling & Custom Error Handler

Menangani error secara terpusat menggunakan fiber.ErrorHandler dan fiber.NewError.

Centralized Error Handling

Fiber mendukung pengelolaan error terpusat. Jika suatu handler mengembalikan `error`, Fiber akan menangkapnya dan memprosesnya di Custom Error Handler Global.

📌 Mengatur Custom Error Handler Global:
app := fiber.New(fiber.Config{
    ErrorHandler: func(c *fiber.Ctx, err error) error {
        code := fiber.StatusInternalServerError
        if e, ok := err.(*fiber.Error); ok {
            code = e.Code
        }
        return c.Status(code).JSON(fiber.Map{
            "error": true,
            "message": err.Error(),
        })
    },
})

Contoh program

package main

import (
	"encoding/json"
	"fmt"
)

type CustomErrorResponse struct {
	Error   bool   `json:"error"`
	Code    int    `json:"code"`
	Message string `json:"message"`
}

func main() {
	errResp := CustomErrorResponse{
		Error:   true,
		Code:    404,
		Message: "Resource Data User Tidak Ditemukan",
	}

	bytes, _ := json.MarshalIndent(errResp, "", "  ")
	fmt.Println("=== CENTRALIZED ERROR RESPONSE FIBER ===")
	fmt.Println(string(bytes))
}

Praktik dan kuis bab ini di kelas interaktif →

250. Template Engine (HTML Render) & Static File Serving

Menyajikan file statis (CSS, JS, Gambar) dan melakukan render template HTML dinamis di Fiber.

Static Files & HTML Views

Selain membuat REST API, Fiber juga sangat powerful untuk menyajikan aplikasi Server-Side Rendered (SSR) atau assets statis.

💡 Menyajikan Folder Statis:
app.Static("/public", "./public") // Mengakses file ./public/logo.png via URL /public/logo.png
📌 Menggunakan Engine Template HTML:
import "github.com/gofiber/template/html/v2"

engine := html.New("./views", ".html")
app := fiber.New(fiber.Config{
    Views: engine,
})

app.Get("/", func(c *fiber.Ctx) error {
    return c.Render("index", fiber.Map{"Title": "Home Page"})
})

Contoh program

package main

import (
	"fmt"
)

func main() {
	fmt.Println("=== FIBER STATIC & TEMPLATE ENGINE DEMO ===")
	fmt.Println("Folder ./public berhasil di-bind ke route static '/public'")
	fmt.Println("Template Engine HTML berhasil merender file views/index.html!")
}

Praktik dan kuis bab ini di kelas interaktif →

251. Studi Kasus: RESTful API CRUD Produk dengan Fiber & In-Memory Storage

Membangun aplikasi REST API Produk lengkap (Create, Read, Update, Delete) dengan Fiber Web Framework.

Studi Kasus Lengkap: RESTful API Fiber

Mari kita gabungkan seluruh konsep Fiber (Routing, Ctx, JSON Response, Error Handling) ke dalam sebuah API CRUD Produk yang utuh.

📌 Endpoint API yang Dibangun:
  • GET /api/products: Mengambil semua daftar produk.
  • GET /api/products/:id: Mengambil detail produk spesifik.
  • POST /api/products: Menambah produk baru.
  • DELETE /api/products/:id: Menghapus produk.

Contoh program

package main

import (
	"encoding/json"
	"fmt"
)

type Product struct {
	ID    int     `json:"id"`
	Name  string  `json:"name"`
	Price float64 `json:"price"`
}

var db = []Product{
	{ID: 1, Name: "Keyboard Mechanical", Price: 750000},
	{ID: 2, Name: "Monitor Gaming 144Hz", Price: 2300000},
}

func GetAllProducts() string {
	bytes, _ := json.MarshalIndent(db, "", "  ")
	return string(bytes)
}

func main() {
	fmt.Println("=== FULL DEMO RESTFUL API PRODUCTS (FIBER) ===")
	fmt.Println("GET /api/products Response:")
	fmt.Println(GetAllProducts())
}

Praktik dan kuis bab ini di kelas interaktif →