golang快速开发功能完备的REST API框架插件Goyave的使用
Golang快速开发功能完备的REST API框架插件Goyave的使用
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核心特性
- 路由系统:支持RESTful路由设计
- 中间件:灵活的中间件支持
- 请求验证:内置强大的验证系统
- 数据库集成:支持GORM和原生SQL
- 认证:JWT和基础认证支持
- 测试工具:内置API测试工具
- 配置管理:环境变量和配置文件支持
快速入门
安装
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 # 应用入口
性能优化
- 使用连接池:
database.Configure(config.Get("database"))
- 启用Gzip压缩:
goyave.Start(RegisterRoutes, goyave.Config{
Compress: true,
})
- 使用缓存中间件
Goyave是一个功能丰富但保持简洁的框架,非常适合快速开发生产级REST API。它的设计哲学是"约定优于配置",提供了合理的默认值,同时允许在需要时进行自定义。