Skip to content

单端点设计

VEF Framework 采用单端点设计模式,所有 API 请求都通过统一的入口点进行处理。这种设计简化了路由管理,提供了一致的请求响应格式。

设计理念

传统的 RESTful API 为每个资源和操作定义独立的端点:

GET    /api/users
POST   /api/users
GET    /api/users/:id
PUT    /api/users/:id
DELETE /api/users/:id

VEF Framework 采用不同的方式,所有请求都通过单一端点:

POST /api        # Internal API endpoint
POST /openapi    # External API endpoint (for third-party integrations)

请求格式

所有 API 请求使用统一的 JSON 格式:

json
{
    "resource": "app/sys/user",
    "action": "find_page",
    "params": {
        "page": 1,
        "pageSize": 10,
        "username": "john"
    },
    "meta": {
        "requestId": "req-123456"
    }
}

请求字段说明

字段类型必填说明
resourcestring资源标识符,格式为 {app}/{domain}/{entity}
actionstring操作名称,如 find_allcreateupdate
paramsobject请求参数,根据不同操作传递不同参数
metaobject元数据,用于传递请求 ID、追踪信息等

Params vs Meta

  • params: 业务参数,直接影响 API 的执行逻辑
  • meta: 元数据,用于日志、追踪、审计等非业务目的
go
// Example: params contains business data
// meta contains tracking information
{
    "resource": "app/order/order",
    "action": "create",
    "params": {
        "customerId": "cust-001",
        "items": [
            {"productId": "prod-001", "quantity": 2}
        ]
    },
    "meta": {
        "requestId": "req-789",
        "traceId": "trace-abc",
        "clientVersion": "1.0.0"
    }
}

响应格式

所有 API 响应也使用统一的 JSON 格式:

成功响应

json
{
    "success": true,
    "data": {
        "id": "user-001",
        "username": "john",
        "email": "john@example.com"
    }
}

分页响应

json
{
    "success": true,
    "data": {
        "items": [
            {"id": "user-001", "username": "john"},
            {"id": "user-002", "username": "jane"}
        ],
        "total": 100,
        "page": 1,
        "pageSize": 10
    }
}

错误响应

json
{
    "success": false,
    "message": "User not found",
    "code": "USER_NOT_FOUND"
}

响应字段说明

字段类型说明
successboolean请求是否成功
dataany成功时返回的数据
messagestring错误消息(失败时)
codestring错误代码(失败时)

预置操作

VEF Framework 提供了一组预置的操作名称:

操作说明
find_one查询单条记录
find_all查询所有记录
find_page分页查询
find_tree树形结构查询
find_options选项列表查询
find_tree_options树形选项查询
create创建记录
update更新记录
delete删除记录
create_many批量创建
update_many批量更新
delete_many批量删除
import导入数据
export导出数据

代码示例

定义资源

go
package resources

import (
    "github.com/ilxqx/vef-framework-go/api"
    "github.com/ilxqx/vef-framework-go/apis"
)

// UserResource defines the user API resource
// The resource name "app/sys/user" determines the API endpoint
type UserResource struct {
    api.Resource
    apis.FindPageApi[models.User, payloads.UserSearch]
    apis.CreateApi[models.User, payloads.UserParams]
}

func NewUserResource() api.Resource {
    return &UserResource{
        // Resource name follows {app}/{domain}/{entity} pattern
        Resource:    api.NewResource("app/sys/user"),
        FindPageApi: apis.NewFindPageApi[models.User, payloads.UserSearch](),
        CreateApi:   apis.NewCreateApi[models.User, payloads.UserParams](),
    }
}

调用 API

bash
# Query users with pagination
curl -X POST http://localhost:8080/api \
  -H "Content-Type: application/json" \
  -d '{
    "resource": "app/sys/user",
    "action": "find_page",
    "params": {
        "page": 1,
        "pageSize": 10
    }
  }'

# Create a new user
curl -X POST http://localhost:8080/api \
  -H "Content-Type: application/json" \
  -d '{
    "resource": "app/sys/user",
    "action": "create",
    "params": {
        "username": "newuser",
        "email": "newuser@example.com"
    }
  }'

优势

1. 简化路由管理

不需要为每个资源定义多个路由,所有请求通过统一入口处理。

2. 一致的接口规范

所有 API 遵循相同的请求响应格式,降低学习成本。

3. 便于权限控制

基于 resourceaction 的组合进行权限验证,逻辑清晰。

4. 易于监控和日志

统一的入口点便于添加中间件进行日志记录、性能监控等。

5. 支持批量操作

可以在单个请求中执行多个操作(通过自定义处理器实现)。

OpenAPI 端点

对于外部集成,VEF Framework 提供了 /openapi 端点,支持 OpenAPI 签名认证:

bash
# External API call with signature
curl -X POST http://localhost:8080/openapi \
  -H "Content-Type: application/json" \
  -H "X-App-Key: your-app-key" \
  -H "X-Signature: calculated-signature" \
  -H "X-Timestamp: 1234567890" \
  -d '{
    "resource": "app/sys/user",
    "action": "find_all"
  }'

下一步

基于 Apache License 2.0 许可发布