golang快速开发功能完备的REST API框架插件Goyave的使用

Golang快速开发功能完备的REST API框架插件Goyave的使用

Goyave Logo

Goyave是一个全功能的Golang Web框架,专注于REST API开发,强调代码可靠性可维护性开发者体验

Goyave框架特点

  • 路由、控制器、中间件
  • 请求解析和高级验证
  • 业务事务
  • 认证系统
  • 配置管理
  • 测试工具
  • 数据库支持和ORM
  • 本地化
  • 高级错误处理
  • 结构化日志
  • CORS支持
  • 文件系统支持
  • Websockets
  • 动态过滤和分页
  • DTO转换和模型映射

快速开始示例

下面是一个完整的Goyave REST API示例,包含用户注册和登录功能:

package main

import (
	"goyave.dev/goyave/v5"
	"goyave.dev/goyave/v5/auth"
	"goyave.dev/goyave/v5/database"
	"goyave.dev/goyave/v5/validation"
)

// User 模型定义
type User struct {
	ID       uint   `gorm:"primaryKey"`
	Username string `gorm:"type:varchar(100);unique;not null"`
	Password string `gorm:"type:varchar(100);not null"`
}

// RegisterRequest 用户注册请求验证规则
type RegisterRequest struct {
	Username string `validate:"required|min:4|max:100"`
	Password string `validate:"required|min:8"`
}

// Register 用户注册控制器
func Register(response *goyave.Response, request *goyave.Request) {
	// 验证请求数据
	registerRequest := &RegisterRequest{}
	if err := request.ToStruct(registerRequest); err != nil {
		response.JSON(err.Status, err)
		return
	}

	// 创建用户
	user := &User{
		Username: registerRequest.Username,
		Password: auth.HashPassword(registerRequest.Password),
	}
	
	if err := database.GetConnection().Create(user).Error; err != nil {
		response.Error(err)
		return
	}

	response.JSON(http.StatusCreated, map[string]interface{}{
		"id":       user.ID,
		"username": user.Username,
	})
}

// LoginRequest 用户登录请求验证规则
type LoginRequest struct {
	Username string `validate:"required"`
	Password string `validate:"required"`
}

// Login 用户登录控制器
func Login(response *goyave.Response, request *goyave.Request) {
	// 验证请求数据
	loginRequest := &LoginRequest{}
	if err := request.ToStruct(loginRequest); err != nil {
		response.JSON(err.Status, err)
		return
	}

	// 查找用户
	user := &User{}
	if err := database.GetConnection().Where("username = ?", loginRequest.Username).First(user).Error; err != nil {
		response.JSON(http.StatusUnauthorized, map[string]string{"error": "Invalid credentials"})
		return
	}

	// 验证密码
	if !auth.CheckPassword(user.Password, loginRequest.Password) {
		response.JSON(http.StatusUnauthorized, map[string]string{"error": "Invalid credentials"})
		return
	}

	// 生成JWT令牌
	token, err := auth.GenerateToken(user.ID)
	if err != nil {
		response.Error(err)
		return
	}

	response.JSON(http.StatusOK, map[string]string{"token": token})
}

// ProtectedEndpoint 需要认证的端点
func ProtectedEndpoint(response *goyave.Response, request *goyave.Request) {
	response.JSON(http.StatusOK, map[string]string{"message": "This is a protected endpoint"})
}

func main() {
	// 注册路由
	router := goyave.NewRouter()
	router.Post("/register", Register).Validate(&RegisterRequest{})
	router.Post("/login", Login).Validate(&LoginRequest{})
	
	// 添加认证中间件的路由
	authMiddleware := &auth.Middleware{}
	router.Get("/protected", ProtectedEndpoint).Middleware(authMiddleware)
	
	// 启动服务
	goyave.Start(router)
}

数据库配置

config.json中添加数据库配置:

{
  "database": {
    "connection": "mysql",
    "host": "localhost",
    "port": 3306,
    "name": "goyave_demo",
    "username": "root",
    "password": "",
    "options": "charset=utf8mb4&parseTime=True&loc=Local"
  }
}

验证规则

Goyave提供了强大的验证功能:

// ProductRequest 产品请求验证规则
type ProductRequest struct {
	Name        string  `validate:"required|min:3|max:100"`
	Description string  `validate:"max:500"`
	Price       float64 `validate:"required|min:0.01"`
	Stock       int     `validate:"required|min:0"`
	Categories  []uint  `validate:"required|min:1|exists:categories,id"`
}

中间件示例

创建自定义中间件:

package middleware

import (
	"goyave.dev/goyave/v5"
)

// Logger 自定义日志中间件
type Logger struct{}

// Handle 中间件处理函数
func (l *Logger) Handle(next goyave.Handler) goyave.Handler {
	return func(response *goyave.Response, request *goyave.Request) {
		goyave.Logger.Infof("Request: %s %s", request.Method(), request.Path())
		next(response, request)
	}
}

测试示例

Goyave提供了强大的测试工具:

package test

import (
	"testing"
	"goyave.dev/goyave/v5"
	"goyave.dev/goyave/v5/auth"
)

func TestRegister(t *testing.T) {
	// 创建测试请求
	request := goyave.NewTestRequest(goyave.Post, "/register", nil)
	request.Data = map[string]interface{}{
		"username": "testuser",
		"password": "password123",
	}

	// 执行测试
	response := goyave.RunTest(Router, request, func(response *goyave.Response, request *goyave.Request) {
		Register(response, request)
	})

	// 验证响应
	if status := response.StatusCode; status != http.StatusCreated {
		t.Errorf("Handler returned wrong status code: got %v want %v", status, http.StatusCreated)
	}
}

Goyave框架提供了企业级REST API开发所需的所有功能,帮助开发者专注于业务逻辑而不是技术细节。通过上面的示例,你可以快速开始使用Goyave开发功能完备的API服务。


更多关于golang快速开发功能完备的REST API框架插件Goyave的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang快速开发功能完备的REST API框架插件Goyave的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Goyave - 快速开发功能完备的REST API框架

Goyave是一个基于Go语言的高性能REST API框架,专注于简洁性、速度和最佳实践。它提供了构建生产级API所需的所有功能,同时保持轻量级和易用性。

Goyave核心特性

  1. 路由系统:支持RESTful路由设计
  2. 中间件:灵活的中间件支持
  3. 请求验证:内置强大的验证系统
  4. 数据库集成:支持GORM和原生SQL
  5. 认证:JWT和基础认证支持
  6. 测试工具:内置API测试工具
  7. 配置管理:环境变量和配置文件支持

快速入门

安装

go get -u github.com/go-goyave/goyave/v3

基本示例

package main

import (
	"github.com/go-goyave/goyave/v3"
	"github.com/go-goyave/goyave/v3/database"
)

// 定义模型
type User struct {
	database.Model
	Name  string `gorm:"type:varchar(100)"`
	Email string `gorm:"type:varchar(100);uniqueIndex"`
}

// 定义路由
func RegisterRoutes(router *goyave.Router) {
	router.Get("/hello", func(response *goyave.Response, request *goyave.Request) {
		response.String(http.StatusOK, "Hello World!")
	})

	router.Post("/users", createUser).Validate(validation.RuleSet{
		"name":  {"required", "string", "between:3,50"},
		"email": {"required", "email"},
	})
}

func createUser(response *goyave.Response, request *goyave.Request) {
	user := &User{
		Name:  request.String("name"),
		Email: request.String("email"),
	}
	
	if err := database.GetConnection().Create(user).Error; err != nil {
		response.Error(err)
		return
	}
	
	response.JSON(http.StatusCreated, map[string]interface{}{
		"id":    user.ID,
		"name":  user.Name,
		"email": user.Email,
	})
}

func main() {
	// 配置数据库
	database.RegisterModel(&User{})
	
	// 启动应用
	goyave.Start(RegisterRoutes)
}

进阶功能

中间件示例

func AuthMiddleware(next goyave.Handler) goyave.Handler {
	return func(response *goyave.Response, request *goyave.Request) {
		token := request.Header.Get("Authorization")
		if token == "" {
			response.Status(http.StatusUnauthorized)
			return
		}
		
		// 验证token逻辑...
		
		next(response, request)
	}
}

// 使用中间件
router.Middleware(AuthMiddleware).Get("/protected", protectedHandler)

数据库操作

// 查询示例
func getUsers(response *goyave.Response, request *goyave.Request) {
	var users []User
	result := database.GetConnection().Find(&users)
	if result.Error != nil {
		response.Error(result.Error)
		return
	}
	
	response.JSON(http.StatusOK, users)
}

// 分页查询
func getPaginatedUsers(response *goyave.Response, request *goyave.Request) {
	page := request.Integer("page", 1)
	pageSize := request.Integer("page_size", 10)
	
	var users []User
	result := database.GetConnection().
		Offset((page-1)*pageSize).
		Limit(pageSize).
		Find(&users)
		
	// ...
}

验证系统

Goyave内置强大的验证系统:

router.Post("/products", createProduct).Validate(validation.RuleSet{
	"name":        {"required", "string", "between:3,100"},
	"description": {"string", "max:500"},
	"price":       {"required", "numeric", "min:0"},
	"category":    {"required", "in:electronics,clothing,food"},
})

测试API

Goyave提供测试工具:

func TestUserCreation(t *testing.T) {
	goyave.RunTest(t, func(t *testing.T, response *goyave.TestResponse) {
		request := goyave.NewTestRequest("POST", "/users", map[string]interface{}{
			"name":  "John Doe",
			"email": "john@example.com",
		})
		
		response.AssertStatus(http.StatusCreated)
		response.AssertJSON(map[string]interface{}{
			"name":  "John Doe",
			"email": "john@example.com",
		})
	})
}

项目结构建议

/project
├── config/          # 配置文件
├── database/        # 数据库相关
│   ├── migrations/  # 数据库迁移
│   └── seeders/     # 数据填充
├── http/            # HTTP相关
│   ├── controllers/ # 控制器
│   ├── middleware/  # 中间件
│   ├── requests/    # 请求验证
│   └── routes.go    # 路由定义
├── models/          # 数据模型
└── main.go          # 应用入口

性能优化

  1. 使用连接池:
database.Configure(config.Get("database"))
  1. 启用Gzip压缩:
goyave.Start(RegisterRoutes, goyave.Config{
	Compress: true,
})
  1. 使用缓存中间件

Goyave是一个功能丰富但保持简洁的框架,非常适合快速开发生产级REST API。它的设计哲学是"约定优于配置",提供了合理的默认值,同时允许在需要时进行自定义。

回到顶部