执行事务操作 (performTransactions)

POST /api/transactions

接口描述

POST /api/transactions 是思源笔记中一个核心且功能强大的 API 端点,用于批量执行一系列数据修改操作(称为"事务")。几乎所有对块、属性、文档结构等的修改都会通过此接口进行。

每个请求可以包含一个或多个事务 (transactions),每个事务又包含一个或多个具体的操作 (doOperations)。这种设计允许将多个相关的修改原子化处理或批量提交。

此接口的灵活性和复杂性都很高,因为 doOperations 中的 action 类型和对应的 data 结构多种多样。

请求参数

请求体为一个 JSON 对象,包含以下主要字段:

{
    "transactions": [
        {
            "timestamp": 0, // 后端会使用外层的 reqId 覆盖此值
            "doOperations": [
                {
                    "action": "string",     // 必需,具体的操作名称
                    "id": "string",         // 操作目标块的 ID (大多数操作需要)
                    "parentID": "string",   // 父块 ID (例如 insertBlock, moveBlock)
                    "previousID": "string", // 前一个同级块 ID (例如 insertBlock, moveBlock)
                    "nextID": "string",     // 后一个同级块 ID
                    "data": "any",          // 操作的具体数据,结构随 action 不同而变化
                    "dataType": "string",   // 数据类型,例如 "markdown", "dom"
                    "isDetached": false,    // 是否为分离的操作
                    "retData": null         // (仅用于后端返回)
                }
                // ... 更多 operations ...
            ],
            "undoOperations": [] // 可选,用于撤销的操作列表
        }
        // ... 更多 transactions ...
    ],
    "reqId": 1678886400000, // 必需,请求的唯一ID (通常是客户端生成的时间戳)
    "app": "string",        // 必需,发起请求的应用标识 (例如 "SiYuan")
    "session": "string"     // 必需,当前会话ID (例如前端的 wsClientId)
}

doOperations 常见 Action 示例

由于 action 类型繁多,这里仅列举一些常见的示例。开发者应查阅思源笔记源码 (kernel/model/ 目录下各操作函数) 以获取特定操作的准确参数结构。

1. 更新块内容 (updateBlock)

{
    "action": "updateBlock",
    "id": "块ID",
    "data": "新的 Markdown 内容",
    "dataType": "markdown"
}

2. 插入块 (insertBlock)

{
    "action": "insertBlock",
    "dataType": "markdown",
    "data": "新块的 Markdown 内容",
    "previousID": "前一个同级块的ID", // 或 nextID
    "parentID": "父块ID (如果插入到文档顶层,则为文档ID)"
}

previousIDnextID 用于指定插入位置,parentID 指定父容器。

3. 设置块属性 (setBlockAttrs)

{
    "action": "setBlockAttrs",
    "id": "块ID",
    "data": {
        "custom-attr-name": "属性值",
        "updated": "新的更新时间戳"
        // ... 其他 name-value 对 ...
    }
}

4. 删除块 (deleteBlock)

{
    "action": "deleteBlock",
    "id": "要删除的块ID"
}

5. 移动块 (moveBlock)

{
    "action": "moveBlock",
    "id": "要移动的块ID",
    "previousID": "目标位置的前一个同级块ID", // 或 nextID
    "parentID": "目标父块ID"
}

更多 action 类型包括但不限于:prependBlock, appendBlock, foldBlock, unfoldBlock, setBlockReminder, doc2Heading, heading2Doc, li2Doc, setAttrViewName (修改属性视图的名称) 等。

响应体

成功响应 (HTTP 200 OK):

API 返回一个 JSON 对象,其中 data 字段包含了处理后的 transactions 数组。每个 operation 对象内部的 retData 字段会包含该操作的执行结果(如果操作有返回数据)。

{
    "code": 0,
    "msg": "",
    "data": [
        {
            "timestamp": 1678886400000, // (与请求中的 reqId 一致)
            "doOperations": [
                {
                    "action": "updateBlock",
                    "id": "20230512000000-xxxxxxx",
                    "data": "**Updated**",
                    // ...其他输入字段...
                    "retData": { "updateCount": 1 } // 示例性的 retData
                }
            ],
            "undoOperations": []
        }
        // ...
    ]
}

响应头中还会包含 Server-Timing: total;dur=<milliseconds>,指示服务器处理请求的总时长。

失败响应:

注意: 认证失败 (如未提供 API Token、非管理员等) 会由中间件处理,并返回相应的 HTTP 错误状态码 (如 401, 403)。

认证与授权

调用此 API 端点需要有效的用户认证 (通过 Authorization HTTP头部传递 API Token)。

此外,执行此操作需要:

备注

在线测试

由于此 API 的请求结构复杂且多样,请在下方手动构造完整的 JSON 请求体来测试。请确保 JSON 格式正确,并包含 transactions, reqId, app, 和 session 字段。

响应:

点击按钮查看响应

感谢您对思源笔记的关注与支持!

在爱发电上赞助我们