RaisFastRaisFast
Content Types

API 参考

自动生成的路由、访问控制级别、规则引擎、查询参数和缓存。

每个内容类型自动获得 REST API。本页介绍生成的路由、访问控制、过滤和查询参数。

自动生成的路由

Collection 类型(默认)

RESTful 模式(默认):

方法路由操作
GET/api/v1/cms/{plural}列表
GET/api/v1/cms/{plural}/{id}详情
POST/api/v1/cms/{plural}创建
PUT/api/v1/cms/{plural}/{id}更新
DELETE/api/v1/cms/{plural}/{id}删除

Simple 模式(当 api_restful = false 时):

方法路由操作
GET/api/v1/cms/{plural}列表
GET/api/v1/cms/{plural}/{id}详情
POST/api/v1/cms/{plural}/create创建
POST/api/v1/cms/{plural}/{id}/update更新
POST/api/v1/cms/{plural}/{id}/delete删除

Single 类型

方法路由操作
GET/api/v1/cms/{singular}获取唯一记录(首次请求自动创建)
PUT/api/v1/cms/{singular}更新唯一记录

管理路由

每个内容类型还会在 /api/v1/admin/cms/ 下获得管理路由:

方法路由操作
GET/api/v1/admin/cms/{plural}列出所有记录(绕过过滤器)
GET/api/v1/admin/cms/{plural}/{id}获取任意记录
POST/api/v1/admin/cms/{plural}创建记录
PUT/api/v1/admin/cms/{plural}/{id}更新记录
DELETE/api/v1/admin/cms/{plural}/{id}删除记录

管理路由绕过 filterfilter_auth 规则,且始终显示 private 字段。

访问控制

在 TOML 定义中控制每个端点的访问权限:

[content_type.api.list]
access = "public"
cache = true
filter = 'status = "published"'
fields = ["title", "cover", "price"]

[content_type.api.create]
access = "admin"

[content_type.api.update]
access = "admin"

[content_type.api.delete]
access = "admin"

访问级别

级别含义
none完全拒绝 — 返回 403
public无需认证
member任何已登录用户
admin需要管理员角色

默认访问级别

端点默认
listpublic
getpublic
createmember
updatemember
deleteadmin

端点选项

选项类型说明
accessstring访问级别:nonepublicmemberadmin
filterstring对所有请求生效的规则表达式
filter_authstring为已登录用户额外添加 OR 规则
cachebool启用服务端响应缓存
fieldsstring[]返回字段白名单

规则引擎

用表达式过滤数据,编译为 SQL WHERE 子句:

[content_type.api.list]
filter = 'status = "published" && price > 0'
filter_auth = 'created_by = @request.auth.id'

filter所有请求生效。filter_auth 为已登录用户添加 OR 条件。组合逻辑:filter OR (已认证 AND filter_auth)

运算符

运算符含义示例
=等于status = "published"
!=不等于status != "draft"
> >= < <=比较price > 0
~LIKE 匹配title ~ "%rust%"
!~NOT LIKEtitle !~ "%spam%"
&&ANDa = 1 && b = 2
||ORa = 1 || b = 2

变量

变量说明
@request.auth.id当前登录用户 ID
@request.auth.role当前用户角色
@request.body.*请求体字段值
@request.query.*URL 查询参数值
@now当前时间戳

特殊语法

语法含义示例
field:isset字段非空avatar:isset
field:length > N字符串/数组长度tags:length > 0
null空值deleted_at = null
true / false布尔值is_free = false

示例

# 公开仅可见已发布的内容
filter = 'status = "published"'

# 已发布或属于当前用户
filter = 'status = "published"'
filter_auth = 'created_by = @request.auth.id'

# 复杂过滤(带分组)
filter = '(status = "published" && price > 0) || featured = true'

查询参数

GET /api/v1/cms/courses?page=2&page_size=10&sort=created_at:desc&status=published&include=instructor,tags
参数类型默认值说明
pageint1页码
page_sizeint20每页条数(有上限)
sortstring排序:field:ascfield:desc,逗号分隔多个
searchstring全文搜索词
includestring逗号分隔的关联字段,填充为完整记录
skip_totalboolfalse跳过 COUNT 查询,返回 total: -1,提升性能
{field}string按字段值精确过滤
__meta.{path}string按 JSON 元数据路径过滤

分页响应

{
  "items": [...],
  "total": 42,
  "page": 2,
  "page_size": 10
}

排序示例

# 单字段
?sort=created_at:desc

# 多字段
?sort=status:asc,created_at:desc

过滤示例

# 精确匹配
?status=published

# 多个过滤
?status=published&level=beginner

# 元数据过滤(需要 metaable 协议)
?__meta.featured=true

响应缓存

按端点启用缓存:

[content_type.api.list]
cache = true

缓存响应存储在内存中,以查询哈希为键。对该内容类型的任何写操作(创建、更新、删除)都会自动清除缓存。

缓存 TTL 通过 cms_cache_ttl_secs 配置(默认 30 秒)。

私有字段

标记为 private = true 的字段会从公开 API 响应中排除:

[[fields]]
name = "internal_notes"
field_type = "text"
private = true
  • 公开 API/api/v1/cms/):私有字段从响应中移除
  • 管理 API/api/v1/admin/cms/):私有字段始终包含

错误响应

状态码含义
400请求体或查询参数无效
401需要认证
403访问被拒(角色不匹配或 access = "none"
404记录不存在
409冲突(乐观锁不匹配 — lockable 协议)
422验证失败(响应体含字段级详情)

On this page