6.3 KiB
6.3 KiB
Examples
Basic Usage
package main
import (
"fmt"
"github.com/valyala/fasthttp"
"git.sharkk.net/Go/FastRouter"
)
func main() {
r := router.New()
r.Get("/", func(ctx router.Ctx, _ []string) {
fmt.Fprintf(ctx, "Hello World!")
})
r.Get("/about", func(ctx router.Ctx, _ []string) {
fmt.Fprintf(ctx, "About page")
})
fasthttp.ListenAndServe(":8080", r.Handler())
}
Path Parameters
r := router.New()
// Single parameter
r.Get("/users/[id]", func(ctx router.Ctx, params []string) {
id := params[0]
fmt.Fprintf(ctx, "User ID: %s", id)
})
// Multiple parameters
r.Get("/posts/[category]/[id]", func(ctx router.Ctx, params []string) {
category := params[0]
id := params[1]
fmt.Fprintf(ctx, "Category: %s, Post ID: %s", category, id)
})
// Wildcard
r.Get("/files/*path", func(ctx router.Ctx, params []string) {
path := params[0]
fmt.Fprintf(ctx, "File path: %s", path)
})
Middleware
// Logging middleware
func LoggingMiddleware(next router.Handler) router.Handler {
return func(ctx router.Ctx, params []string) {
fmt.Printf("[%s] %s\n", string(ctx.Method()), string(ctx.Path()))
next(ctx, params)
}
}
// Auth middleware
func AuthMiddleware(next router.Handler) router.Handler {
return func(ctx router.Ctx, params []string) {
token := string(ctx.Request.Header.Peek("Authorization"))
if token == "" {
ctx.Error("Unauthorized", fasthttp.StatusUnauthorized)
return
}
next(ctx, params)
}
}
// Global middleware
r := router.New()
r.Use(LoggingMiddleware)
// Route-specific middleware
r.WithMiddleware(AuthMiddleware).Get("/admin", adminHandler)
Route Groups
r := router.New()
// API group
api := r.Group("/api")
api.Get("/status", statusHandler)
// Versioned API
v1 := api.Group("/v1")
v1.Get("/users", listUsersHandler)
v1.Post("/users", createUserHandler)
v2 := api.Group("/v2")
v2.Get("/users", listUsersV2Handler)
Using Standard fasthttp Handlers
r := router.New()
// Using existing fasthttp handlers
r.Get("/legacy", router.StandardHandler(func(ctx *fasthttp.RequestCtx) {
fmt.Fprintf(ctx, "Legacy fasthttp handler")
}))
// Mixing router handlers with standard handlers
r.Get("/users/[id]", func(ctx router.Ctx, params []string) {
// Get ID from params
id := params[0]
// Pass to standard handler
standardUserHandler := router.StandardHandler(func(ctx *fasthttp.RequestCtx) {
fmt.Fprintf(ctx, "Processing user: %s", id)
})
standardUserHandler(ctx, params)
})
Combining Features
r := router.New()
// Global middleware
r.Use(LoggingMiddleware)
// API group with middleware
api := r.Group("/api")
api.Use(ApiKeyMiddleware)
// Admin group with auth middleware
admin := r.Group("/admin")
admin.Use(AuthMiddleware)
// Users endpoints with versioning
users := api.Group("/v1/users")
users.Get("/", listUsersHandler)
users.Post("/", createUserHandler)
users.Get("/[id]", getUserHandler)
users.Put("/[id]", updateUserHandler)
users.Delete("/[id]", deleteUserHandler)
// Special case with route-specific middleware
api.WithMiddleware(CacheMiddleware).Get("/cached-resource", cachedResourceHandler)
Error Handling
r := router.New()
err := r.Get("/users/[id]", getUserHandler)
if err != nil {
// Handle error
}
// Custom NotFound handler
r.ServeHTTP = func(ctx *fasthttp.RequestCtx) {
path := string(ctx.Path())
method := string(ctx.Method())
h, params, found := r.Lookup(method, path)
if !found {
// Custom 404 handler
ctx.SetStatusCode(fasthttp.StatusNotFound)
fmt.Fprintf(ctx, "Custom 404: %s not found", path)
return
}
h(ctx, params)
}
Complete Application Example
package main
import (
"fmt"
"log"
"github.com/valyala/fasthttp"
"github.com/yourusername/fastrouter"
)
func main() {
r := router.New()
// Global middleware
r.Use(LoggingMiddleware)
// Basic routes
r.Get("/", homeHandler)
r.Get("/about", aboutHandler)
// API routes
api := r.Group("/api")
api.Use(ApiKeyMiddleware)
// Users API
users := api.Group("/users")
users.Get("/", listUsersHandler)
users.Post("/", createUserHandler)
users.Get("/[id]", getUserHandler)
users.Put("/[id]", updateUserHandler)
users.Delete("/[id]", deleteUserHandler)
// Admin routes with auth
admin := r.Group("/admin")
admin.Use(AuthMiddleware)
admin.Get("/", adminDashboardHandler)
admin.Get("/users", adminUsersHandler)
// Start server
log.Println("Server starting on :8080")
log.Fatal(fasthttp.ListenAndServe(":8080", r.Handler()))
}
// Handlers
func homeHandler(ctx router.Ctx, _ []string) {
fmt.Fprintf(ctx, "Welcome to the home page")
}
func aboutHandler(ctx router.Ctx, _ []string) {
fmt.Fprintf(ctx, "About us")
}
func listUsersHandler(ctx router.Ctx, _ []string) {
fmt.Fprintf(ctx, "List of users")
}
func getUserHandler(ctx router.Ctx, params []string) {
id := params[0]
fmt.Fprintf(ctx, "User details for ID: %s", id)
}
func createUserHandler(ctx router.Ctx, _ []string) {
// Parse form data or JSON body
// You can use ctx.PostBody() to get the request body
fmt.Fprintf(ctx, "User created")
}
func updateUserHandler(ctx router.Ctx, params []string) {
id := params[0]
fmt.Fprintf(ctx, "User updated: %s", id)
}
func deleteUserHandler(ctx router.Ctx, params []string) {
id := params[0]
fmt.Fprintf(ctx, "User deleted: %s", id)
}
func adminDashboardHandler(ctx router.Ctx, _ []string) {
fmt.Fprintf(ctx, "Admin Dashboard")
}
func adminUsersHandler(ctx router.Ctx, _ []string) {
fmt.Fprintf(ctx, "Admin Users Management")
}
// Middleware
func LoggingMiddleware(next router.Handler) router.Handler {
return func(ctx router.Ctx, params []string) {
log.Printf("[%s] %s", string(ctx.Method()), string(ctx.Path()))
next(ctx, params)
}
}
func ApiKeyMiddleware(next router.Handler) router.Handler {
return func(ctx router.Ctx, params []string) {
apiKey := string(ctx.Request.Header.Peek("X-API-Key"))
if apiKey == "" {
ctx.Error("API key required", fasthttp.StatusUnauthorized)
return
}
next(ctx, params)
}
}
func AuthMiddleware(next router.Handler) router.Handler {
return func(ctx router.Ctx, params []string) {
// Check session or JWT
authorized := checkUserAuth(ctx)
if !authorized {
ctx.Redirect("/login", fasthttp.StatusSeeOther)
return
}
next(ctx, params)
}
}
func checkUserAuth(ctx router.Ctx) bool {
// Implementation of auth check
return len(ctx.Request.Header.Peek("Authorization")) > 0
}