Внести изменения

Редактировать эту документацию

Переведите документацию или откройте весь проект на своём компьютере.

Ничего не будет опубликовано, пока вы не решите отправить свою работу.

Использование Gin для маршрутизации

Подробное руководство по интеграции веб-фреймворка Gin с приложениями Wails v3

В этом руководстве показано, как интегрировать веб-фреймворк Gin с Wails v3. Gin — это высокопроизводительный HTTP-фреймворк, написанный на Go и упрощающий создание веб-приложений и API.

Введение

Wails v3 предоставляет гибкую систему ресурсов, которая позволяет использовать любой обработчик HTTP, включая популярные веб-фреймворки, такие как Gin. Благодаря этой интеграции вы можете:

  • Обслуживать веб-контент с помощью маршрутизации и промежуточного ПО Gin
  • Создавать RESTful API, доступные из приложения Wails
  • Использовать возможности Gin, сохраняя интеграцию с настольными приложениями Wails

Настройка Gin для работы с Wails

Чтобы интегрировать Gin с Wails, создайте маршрутизатор Gin и настройте его как обработчик ресурсов в приложении Wails. Ниже приведено пошаговое руководство:

1. Установите зависимости

Сначала убедитесь, что пакет Gin установлен:

bash
go get -u github.com/gin-gonic/gin

2. Создайте промежуточное ПО для Gin

Создайте функцию промежуточного ПО, которая обеспечит интеграцию Wails и Gin:

go
// GinMiddleware creates a middleware that passes requests to Gin if they're not handled by Wails
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 the `/wails` route
			if strings.HasPrefix(r.URL.Path, "/wails") {
				next.ServeHTTP(w, r)
				return
			}
			// Let Gin handle everything else
			ginEngine.ServeHTTP(w, r)
		})
	}
}

Это промежуточное ПО передаёт все HTTP-запросы маршрутизатору Gin.

3. Настройте маршрутизатор Gin

Настройте маршрутизатор Gin, добавив маршруты, промежуточное ПО и обработчики:

go
// Create a new Gin router
ginEngine := gin.New() // Using New() instead of Default() to add custom middleware

// Add middlewares
ginEngine.Use(gin.Recovery())
ginEngine.Use(LoggingMiddleware()) // Your custom middleware

// Define routes
ginEngine.GET("/", func(c *gin.Context) {
    // Serve your main page
})

ginEngine.GET("/api/hello", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
        "message": "Hello from Gin API!",
        "time":    time.Now().Format(time.RFC3339),
    })
})

4. Интегрируйте маршрутизатор с приложением Wails

Настройте приложение Wails так, чтобы оно использовало маршрутизатор Gin в качестве обработчика ресурсов:

go
// Create a new Wails application
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),
    },
})

// Create window
app.Window.NewWithOptions(application.WebviewWindowOptions{
    Title:    "Wails + Gin Example",
    Width:    900,
    Height:   700,
    URL:      "/", // This will load the route handled by Gin
})

Обслуживание статического контента

Используйте пакет Go embed, чтобы встроить статические файлы в исполняемый файл:

go
//go:embed static
var staticFiles embed.FS

ginEngine.StaticFS("/static", http.FS(staticFiles))
ginEngine.GET("/", func(c *gin.Context) {
    file, _ := staticFiles.ReadFile("static/index.html")
    c.Data(http.StatusOK, "text/html; charset=utf-8", file)
})

Во время разработки обслуживайте файлы непосредственно с диска с помощью ginEngine.Static("/static", "./static").

Пользовательское промежуточное ПО

Gin позволяет создавать пользовательское промежуточное ПО для различных задач. Ниже приведён пример промежуточного ПО для журналирования:

go
// LoggingMiddleware is a Gin middleware that logs request details
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,
        )
    }
}

Обработка запросов к API

Gin упрощает создание RESTful API. Вот как определить конечные точки API:

go
// GET endpoint
ginEngine.GET("/api/users", func(c *gin.Context) {
    c.JSON(http.StatusOK, users)
})

// POST endpoint with JSON binding
ginEngine.POST("/api/users", func(c *gin.Context) {
    var newUser User
    if err := c.ShouldBindJSON(&newUser); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }
    // Process the new user...
    c.JSON(http.StatusCreated, newUser)
})

// Path parameters
ginEngine.GET("/api/users/:id", func(c *gin.Context) {
    id := c.Param("id")
    // Find user by ID...
    c.JSON(http.StatusOK, user)
})

// Query parameters
ginEngine.GET("/api/search", func(c *gin.Context) {
    query := c.DefaultQuery("q", "")
    limit := c.DefaultQuery("limit", "10")
    // Perform search...
    c.JSON(http.StatusOK, results)
})

Использование возможностей Wails

Веб-контент, обслуживаемый Gin, может взаимодействовать с функциями Wails с помощью пакета @wailsio/runtime.

Обработка событий

Зарегистрируйте обработчики событий в Go:

go
app.Event.On("my-event", func(event *application.CustomEvent) {
    log.Printf("Received event: %v", event.Data)
})

Вызовите их из JavaScript с помощью среды выполнения:

html
<script type="module">
    import { Events } from '@wailsio/runtime';

    Events.Emit("my-event", { message: "Hello from frontend" });
    Events.On("response-event", (data) => console.log(data));
</script>

Расширенная конфигурация

Настройка режима Gin

Для рабочей среды переведите Gin в режим release:

go
gin.SetMode(gin.ReleaseMode)  // Use gin.DebugMode for development
ginEngine := gin.New()

Обработка WebSocket-соединений

WebSocket можно интегрировать с Gin с помощью таких библиотек, как Gorilla WebSocket:

go
import "github.com/gorilla/websocket"

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    CheckOrigin: func(r *http.Request) bool {
        return true // Allow all connections
    },
}

// In your route handler:
ginEngine.GET("/ws", func(c *gin.Context) {
    conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
    if err != nil {
        log.Println(err)
        return
    }
    defer conn.Close()
    
    // Handle WebSocket connection...
})

Рекомендации

  • Используйте пакет embed из Go: встраивайте статические файлы в исполняемый файл, чтобы упростить распространение приложения.
  • Разделяйте ответственность: храните логику API отдельно от логики пользовательского интерфейса.
  • Обрабатывайте ошибки: реализуйте надлежащую обработку ошибок как в маршрутах Gin, так и в коде фронтенда.
  • Учитывайте требования безопасности: уделяйте особое внимание безопасности, особенно при обработке пользовательского ввода.
  • Производительность: используйте режим release Gin в рабочей среде для повышения производительности.
  • Тестирование: пишите тесты для маршрутов Gin с помощью средств тестирования Gin.

Заключение

Интеграция Gin с Wails предоставляет мощное сочетание средств для создания настольных приложений с использованием веб-технологий. Производительность и набор возможностей Gin дополняют средства интеграции Wails с настольными системами, позволяя создавать сложные приложения, сочетающие преимущества обеих технологий.

Дополнительные сведения см. в документации Gin и документации Wails.

Редактировать страницу

Последнее обновление: