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).
- 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)
}
}
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").
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")
}
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!")
}
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.
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))
}
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.
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)
}
}
}
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.
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)
}
}
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.
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))
}
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.
app.Static("/public", "./public") // Mengakses file ./public/logo.png via URL /public/logo.png
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!")
}
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.
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())
}