开放 API 文档

BaseForme 的 KV 存储公开 HTTP 接口。所有公开接口统一使用 /openapi 前缀,每个 API Key 只能访问其所属应用的数据;网页控制台使用独立的 /api 接口(登录 Cookie 鉴权),两者互不影响。

概览

BaseForme 为每个应用提供独立的 KV 存储空间,对外只暴露 HTTP + JSON 接口:单键读写与删除、按 glob 模式列举与计数,写入时可设置 TTL 自动过期。一个 API Key 只能操作其所属应用的数据。

基础地址
http://localhost:3000由 .env 的 BASE_URL 配置,构建时固化
鉴权
Authorization: Bearer <API_KEY>所有 /openapi 接口都必须携带,缺少或无效时返回 401

快速开始

  1. 在控制台的「API Keys」标签页为应用创建 Key,明文只在创建成功时显示一次。
  2. 携带 Authorization: Bearer <API_KEY> 调用 insert 写入,再用 get 读回:
    写入后读回
    curl -X POST "http://localhost:3000/openapi/kv/insert" \
      -H "Authorization: Bearer $BASEFORME_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"key":"greeting","value":"hello","ttl":3600}'
    
    curl "http://localhost:3000/openapi/kv/get?key=greeting" \
      -H "Authorization: Bearer $BASEFORME_API_KEY"
    读取响应
    {
      "data": {
        "key": "greeting",
        "value": "hello",
        "expiresAt": 1763200060000
      }
    }
  3. 响应统一为 { "data": ... } 或 { "error": "..." },完整约定见「通用约定」。

接口一览

方法路径说明
GET/openapi/kv/get按完整键名读取一个未过期的键值。
GET/openapi/kv/list返回键名匹配模式的未过期键值,按 key 升序排列。
GET/openapi/kv/count统计键名匹配模式的未过期键数量,不读取 value。
POST/openapi/kv/insert写入单个键;通过 force 控制已存在的键是否被覆盖。
POST/openapi/kv/delete按完整键名删除一个键,只支持单点删除。

鉴权

在控制台的「API Keys」标签页为应用创建 Key。Key 明文只在创建成功时显示一次,请及时复制保存;之后列表只展示脱敏值。

  • 每个应用最多创建 10 个 API Key,默认永久有效。
  • 每个 Key 只授权访问创建它时所属的应用,不能跨应用读写。
  • Key 全局唯一;删除 Key 后,使用该 Key 的调用会立即返回 401。
请求头
Authorization: Bearer bfk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

也支持直接填入 Key(省略 Bearer 前缀)。缺少 Header 或 Key 无效时返回 401。

通用约定

响应结构

成功响应把业务数据放在 data 字段;失败响应把错误信息放在 error 字段,并配合对应的 HTTP 状态码。

成功
{ "data": { "count": 2 } }
失败
{ "error": "键不存在" }

键、值与过期

  • 键为非空字符串,最长 200 个字符,区分大小写。
  • 键在应用内唯一;不同应用可以使用同名 key,数据互不影响。
  • 值必须是字符串;结构化数据请先序列化为 JSON 文本。
  • expiresAt 为毫秒时间戳,null 表示永不过期;ttl 单位为秒,0 表示永不过期。
  • 过期采用惰性清理:每次请求前会删除已过期的键,因此接口不会返回过期数据。
状态码含义
200请求成功,或覆盖已有键成功
201新建键成功(insert)
400参数缺失或格式不合法
401缺少或无效的 API Key,未执行任何操作
404键不存在或已过期
409force=false 且键已存在,未做任何修改
500服务端异常,例如数据库不可用

所有请求都需要携带 Authorization Header;POST 请求还需要设置 Content-Type: application/json,并使用合法的 JSON 对象作为请求体。

模式匹配(pattern)

list 与 count 用 pattern 筛选键名。模式采用 glob 风格,匹配的是完整键名而不是子串:要按子串查找请写成 *keyword*。

通配符

语法含义示例
*匹配任意长度的字符,包括空串user:* 匹配 user:1、user:alice
?匹配恰好一个字符(按字符计,不是字节)user:? 匹配 user:1,不匹配 user:12
\转义下一个字符,使其只按字面匹配;末尾单独的 \ 匹配字面反斜杠\* 只匹配键名 *;\\ 只匹配键名 \
其他字符按字面匹配;% _ ! 不是通配符,无需转义100% 只匹配键名 100%

示例

patternURL 编码后匹配不匹配
**全部键—
user:*user:*user:1、user:aliceuser、User:1
user:?user:%3Fuser:1、user:auser:12、user:alice
order:1*order:1*order:1、order:100order:200
*:name*:nameuser:name、user:1:namename
\*%5C*键名 *user:1
100%100%25键名 100%键名 100x

注意事项

  • 模式匹配的是完整键名,不是子串搜索;要按子串查找,请在关键词前后各加一个星号。
  • 匹配区分大小写,与数据库的 utf8mb4_bin 排序规则一致。
  • 只作用于当前 API Key 所属应用,且查询前已清理过期键。
  • 查询参数需要 URL 编码:? 写成 %3F、\ 写成 %5C、% 写成 %25、# 写成 %23;* 可以直接书写。
  • pattern 首尾空白会被去除;空 pattern 返回 400,匹配全部请使用 *。
  • 模式以 * 开头时无法命中键名索引,数据量大时建议先用 count 预估结果数量。
GET/openapi/kv/get

查询单个键

返回指定 key 的 value 与过期时间。键不存在、已过期,或在请求开始清理过期数据时被删除,都会返回 404。键名区分大小写,查询参数需要经过 URL 编码。

请求参数

参数位置类型必填说明
keyquerystring是要查询的键,最大 200 个字符,首尾空白会被忽略。

响应字段

响应字段类型说明
keystring键名,保持写入时的大小写。
valuestring键对应的值。
expiresAtnumber | null过期时间戳(毫秒),null 表示永不过期。
成功响应示例
{
  "data": {
    "key": "greeting",
    "value": "hello",
    "expiresAt": 1763200060000
  }
}

状态码

  • 200查询成功
  • 400缺少 key,或 key 为空、超长
  • 401缺少或无效的 API Key
  • 404键不存在或已过期

特性与注意事项

  • 只能访问该 API Key 所属应用的数据。
  • 每次读写前都会先清理过期的键,因此不会返回已过期的数据。
  • 键名区分大小写,greeting 与 Greeting 是两个不同的键。
cURL 示例
curl "http://localhost:3000/openapi/kv/get?key=greeting" \
  -H "Authorization: Bearer $BASEFORME_API_KEY"
GET/openapi/kv/list

按模式列出键值

pattern 为必填参数,支持 glob 风格的通配符,语法见「模式匹配」小节。返回结果包含完整的 value,按 key 升序排列,暂不分页;结果集较大时请使用更精确的 pattern,或先用 count 预估数量。

请求参数

参数位置类型必填说明
patternquerystring是键名匹配模式:* 匹配任意长度,? 匹配单个字符,\ 用于转义通配符;使用 * 可匹配全部键。完整规则见「模式匹配」小节。

响应字段

响应字段类型说明
dataKVEntry[]匹配到的键值数组。
data[].keystring键名,区分大小写。
data[].valuestring键对应的值。
data[].expiresAtnumber | null过期时间戳(毫秒),null 表示永不过期。
成功响应示例
{
  "data": [
    {
      "key": "user:1",
      "value": "alice",
      "expiresAt": null
    },
    {
      "key": "user:2",
      "value": "bob",
      "expiresAt": 1763200060000
    }
  ]
}

状态码

  • 200查询成功,未匹配时返回空数组
  • 400缺少 pattern 或 pattern 为空
  • 401缺少或无效的 API Key

特性与注意事项

  • 只能访问该 API Key 所属应用的数据。
  • 只返回未过期的键;过期数据会在查询前被清理。
  • 结果按 key 升序排列(二进制排序,区分大小写),暂不支持分页。
cURL 示例
curl "http://localhost:3000/openapi/kv/list?pattern=user:*" \
  -H "Authorization: Bearer $BASEFORME_API_KEY"
GET/openapi/kv/count

统计匹配数量

匹配规则与 list 完全一致,但只返回数量。适合在批量读取前预估结果规模,或用于分页、限额等场景的前置判断。

请求参数

参数位置类型必填说明
patternquerystring是键名匹配模式,语法与 list 相同;使用 * 统计全部键。完整规则见「模式匹配」小节。

响应字段

响应字段类型说明
countnumber匹配到的未过期键数量。
成功响应示例
{
  "data": {
    "count": 2
  }
}

状态码

  • 200统计成功,无匹配时 count 为 0
  • 400缺少 pattern 或 pattern 为空
  • 401缺少或无效的 API Key

特性与注意事项

  • 只能访问该 API Key 所属应用的数据。
  • 只统计未过期的键;过期数据会在统计前被清理。
  • pattern 的语法与转义规则见「模式匹配」小节。
cURL 示例
curl "http://localhost:3000/openapi/kv/count?pattern=user:*" \
  -H "Authorization: Bearer $BASEFORME_API_KEY"
POST/openapi/kv/insert

插入单个键值

force=true(默认)时执行新增或覆盖:键不存在返回 201,已存在则覆盖并返回 200。force=false 时只做新增:键已存在返回 409,原值保持不变。存在性判断在事务内加行锁完成,并发写入同一个键时行为稳定。

请求参数

参数位置类型必填说明
forcequeryboolean否是否允许覆盖已存在的键。省略时默认为 true;只接受 true 或 false。
keybodystring是键名,非空且不超过 200 个字符,首尾空白会被忽略。
valuebodystring是值,必须是字符串;结构化数据请先序列化为 JSON 字符串。
ttlbodynumber否存活时间(秒),省略或设为 0 表示永不过期;更新已有键时会重置过期时间。
请求体示例
{
  "key": "greeting",
  "value": "hello",
  "ttl": 60
}

响应字段

响应字段类型说明
keystring写入的键名。
valuestring写入的值。
expiresAtnumber | null过期时间戳(毫秒),null 表示永不过期。
createdbooleantrue 表示本次新建,false 表示本次覆盖了已有键。
成功响应示例
{
  "data": {
    "key": "greeting",
    "value": "hello",
    "expiresAt": 1763200060000,
    "created": true
  }
}

状态码

  • 201新建成功
  • 200覆盖已有键成功
  • 400force、key、value 或 ttl 不合法
  • 401缺少或无效的 API Key
  • 409force=false 且键已存在,原值未被修改

特性与注意事项

  • 只能访问该 API Key 所属应用的数据。
  • 请求头需要包含 Content-Type: application/json。
  • 已过期的键视为不存在:即使 force=false,也可以重新插入一个刚过期的键。
  • force=false 的并发写入最多只有一个请求成功,其余请求返回 409。
  • 非法 JSON 请求体同样返回 400,不会写入任何数据。
cURL 示例
curl -X POST "http://localhost:3000/openapi/kv/insert?force=false" \
  -H "Authorization: Bearer $BASEFORME_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"key":"greeting","value":"hello","ttl":60}'
POST/openapi/kv/delete

删除单个键

删除指定 key 及其值,操作不可恢复。键不存在或已过期时返回 404。公开 API 不提供批量删除,需要通过多次单点调用完成。

请求参数

参数位置类型必填说明
keybodystring是要删除的键名,非空且不超过 200 个字符。
请求体示例
{
  "key": "greeting"
}

响应字段

响应字段类型说明
keystring被删除的键名。
deletedboolean固定为 true;键不存在时接口返回 404,而不是该字段为 false。
成功响应示例
{
  "data": {
    "key": "greeting",
    "deleted": true
  }
}

状态码

  • 200删除成功
  • 400请求体不是合法 JSON 对象,或 key 为空、超长
  • 401缺少或无效的 API Key
  • 404键不存在或已过期

特性与注意事项

  • 只能访问该 API Key 所属应用的数据。
  • 请求头需要包含 Content-Type: application/json。
  • 删除前会先清理过期数据,因此已过期的键同样返回 404。
  • 删除不可恢复,请谨慎操作。
cURL 示例
curl -X POST "http://localhost:3000/openapi/kv/delete" \
  -H "Authorization: Bearer $BASEFORME_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"key":"greeting"}'