v3/examples/gin-example/README.md
This example demonstrates how to use the Gin web framework with Wails.
This example shows how to:
cd v3/examples/gin-example
go mod tidy
go run .
The example uses Gin's HTTP router to serve the frontend content whilst still allowing Wails to handle its internal routes. This is achieved through:
The key part of the integration is the middleware function:
func GinMiddleware(ginEngine *gin.Engine) application.Middleware {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Let Wails handle its internal routes
if r.URL.Path == "/wails/runtime.js" || r.URL.Path == "/wails/ipc" {
next.ServeHTTP(w, r)
return
}
// Let Gin handle everything else
ginEngine.ServeHTTP(w, r)
})
}
}
This allows you to leverage Gin's powerful routing and middleware capabilities whilst still maintaining full access to Wails features.
The example also demonstrates how to create custom Gin middleware:
func LoggingMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// Start timer
startTime := time.Now()
// Process request
c.Next()
// Calculate latency
latency := time.Since(startTime)
// Log request details
log.Printf("[GIN] %s | %s | %s | %d | %s",
c.Request.Method,
c.Request.URL.Path,
c.ClientIP(),
c.Writer.Status(),
latency,
)
}
}
This middleware is applied to all Gin routes and logs details about each request.
The Wails application is configured to use Gin as follows:
app := application.New(application.Options{
Name: "Gin Example",
Description: "A demo of using Gin with Wails",
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
Assets: application.AssetOptions{
Handler: ginEngine,
Middleware: GinMiddleware(ginEngine),
},
})
This configuration tells Wails to: