嵌入接口清单
第三方系统可调用的 /api/embed/** 接口清单:认证方式、参数、返回值,含目录树、报表参数、后端直接导出、外部数据集、会话管理的 curl 示例。
概述
/api/embed/** 是 Sight Report 面向第三方系统开放的一组接口。这些接口不使用平台登录态(satoken),而是使用两种嵌入认证方式之一:
| 认证方式 | 说明 |
|---|---|
_s 签名 |
每次请求在查询参数 _s(个别接口为请求体 signature)里带签名。无状态,不需要预先建立会话,适合服务端调用。签名规则见签名免登。 |
| 嵌入会话 | 先用签名调用 POST /api/embed/auth 换取 sessionToken,之后在请求头带 X-Embed-Session: <sessionToken>。适合浏览器内嵌入页面。 |
所有接口的响应统一为 {"code":200,"success":true,"message":"...","data":...} 的信封(导出类接口直接返回文件流)。
注意:每个客户端 IP 对
/api/embed/**的请求上限为每分钟 120 次,超出返回 HTTP 状态 429,提示「请求频率超限,请稍后再试」。
功能入口
- 接口所属的应用在
系统 > 三方集成中创建,参见三方集成应用。 - 「三方集成」页面的应用详情里带有各场景的调用说明与多语言代码样例,可与本文对照。
接口一览
| 接口 | 方法 | 认证 | 用途 |
|---|---|---|---|
/api/embed/auth |
POST | 签名(请求体) | 校验签名,换取嵌入会话,见签名免登 |
/api/embed/access/auth |
POST | 无 | 公开链接换取会话,见报表公开链接 |
/api/embed/session/validate |
GET | 会话头 | 校验会话是否有效 |
/api/embed/session/logout |
POST | 会话头 | 注销会话 |
/api/embed/report/type-tree |
GET | _s |
按文件类型获取目录树 |
/api/embed/report/tag-list |
GET | _s |
按标签查询报表列表 |
/api/embed/report/parameters |
GET | _s |
读取报表的参数定义 |
/api/embed/report-file/source |
GET | 会话头 | 读取已发布的报表模板正文 |
/api/embed/export/pdf |
GET | _s 或会话头 |
导出 PDF |
/api/embed/export/excel |
GET | _s 或会话头 |
导出 Excel |
/api/embed/export/word |
GET | _s 或会话头 |
导出 Word |
/api/embed/export/csv |
GET | _s 或会话头 |
导出 CSV |
/api/embed/export/ofd |
GET | _s 或会话头 |
导出 OFD |
/api/embed/export/excel |
POST | 会话头 | 创建大数据量 Excel 导出任务 |
/api/embed/export/excel/task/{taskId} |
GET | 会话头 | 查询导出任务状态 |
/api/embed/export/excel/download/{taskId} |
GET | 会话头 | 下载导出任务生成的文件 |
/api/embed/staged-dataset/set |
POST | 签名(请求体) | 上传外部数据集,返回 token |
/api/embed/staged-dataset/clear |
POST | 签名(请求体) | 按 token 清除外部数据集 |
/api/embed/print/* |
GET/POST | _s 或会话头 |
续打宿主接入,见下文 |
以下示例中的变量沿用签名免登里的脚本。先定义一个生成 _s 的函数:
BASE=https://your-domain
APP_ID=erp-system
SECRET='在三方集成页面保存的 appSecret'
# 用法:make_s <account> <userName> <reportId,可为空>
make_s() {
local EXPIRE=$(( $(date +%s) + 600 ))
local SIGN=$(printf '%s' "$APP_ID|$1|$2|$3|$EXPIRE" \
| openssl dgst -sha256 -hmac "$SECRET" -hex | awk '{print $NF}')
printf '{"appId":"%s","account":"%s","userName":"%s","reportId":"%s","expireAt":%s,"signature":"%s"}' \
"$APP_ID" "$1" "$2" "$3" "$EXPIRE" "$SIGN" | base64 | tr -d '\n=' | tr '+/' '-_'
}
报表查询接口
三个接口都用 _s 认证,签名里的 reportId 可以为空。如果应用配置了「允许访问的报表」白名单,且签名里带了 reportId,该 reportId 必须在白名单内,否则返回「无权访问该报表」。
获取目录树
GET /api/embed/report/type-tree
| 参数 | 说明 | 取值/默认值 |
|---|---|---|
_s |
签名 | 必填 |
fileType |
文件类型 | 必填。枚举:grid、document、dashboard、datawall、mobile、directory |
data 是树形数组,节点包含 id、parentId、name、fileType、version、description、createTime、updateTime、creatorName、updaterName、tags,有子节点时带 children。
S=$(make_s zhangsan 张三 "")
curl -s "$BASE/api/embed/report/type-tree?fileType=grid&_s=$S"
按标签查询报表
GET /api/embed/report/tag-list
| 参数 | 说明 | 取值/默认值 |
|---|---|---|
_s |
签名 | 必填 |
tag |
标签名 | 必填 |
data 为报表数组,字段同目录树节点。
curl -s "$BASE/api/embed/report/tag-list?tag=%E6%9C%88%E6%8A%A5&_s=$S"
读取报表参数定义
GET /api/embed/report/parameters
| 参数 | 说明 | 取值/默认值 |
|---|---|---|
_s |
签名 | 必填 |
reportId |
报表 ID | 可选 |
data 结构:
| 字段 | 说明 |
|---|---|
reportId / reportName |
报表标识与名称 |
parameters[].name |
参数名 |
parameters[].dataType |
参数数据类型 |
parameters[].elementType |
集合参数的元素类型,仅 dataType 为 List 且元素类型不是文本时有值 |
parameters[].defaultValue |
默认值 |
parameters[].defaultValueMode / defaultValuePreset |
默认值的模式与预设,用于自建查询表单时还原默认值 |
三方自建查询表单时,可先读取参数定义,再把用户填写的值通过嵌入链接的 parameters 传给报表,见报表嵌入。
S=$(make_s zhangsan 张三 rpt_sales)
curl -s "$BASE/api/embed/report/parameters?reportId=rpt_sales&_s=$S"
后端直接导出
服务端可以不打开页面,直接下载导出文件。
GET /api/embed/export/{pdf|excel|word|csv|ofd}
| 参数 | 说明 | 取值/默认值 |
|---|---|---|
fileId |
报表 ID | 必填 |
_s |
签名 | 使用签名认证时必填;改用 X-Embed-Session 头时省略 |
parameters |
报表参数,JSON 字符串,需 URL 编码 | 可选 |
fileVersion |
指定报表版本 | 可选 |
pageIndex |
只导出指定页(页码从 1 起) | 可选 |
sheetId |
多 sheet 报表指定要导出的 sheet | 可选 |
使用 _s 时有两条规则:
- 签名里的
reportId必须非空,并与请求的fileId完全一致,否则返回「签名中的 reportId 与请求的 fileId 不匹配」。 - 签名有效期内该链接可重复使用,服务端不保存会话。
S=$(make_s zhangsan 张三 rpt_sales)
curl -s -o sales.pdf \
"$BASE/api/embed/export/pdf?fileId=rpt_sales&_s=$S¶meters=%7B%22dept%22%3A%22%E5%86%85%E7%A7%91%22%7D"
上例的 parameters 解码后是 {"dept":"内科"}。
大数据量 Excel 异步导出
浏览器嵌入页面在数据量大时使用异步任务:先创建任务,轮询状态,完成后下载。以下三个接口使用会话头认证。
- 创建任务:
POST /api/embed/export/excel,请求体{"fileId":"...","fileVersion":"","parameters":"{\"dept\":\"内科\"}","fileName":"..."}。其中parameters是 JSON 字符串。 - 查询状态:
GET /api/embed/export/excel/task/{taskId}。 - 下载:
GET /api/embed/export/excel/download/{taskId}。
任务对象字段:taskId、status(pending、processing、completed、failed)、downloadUrl、fileName、progress、errorMsg、createTime、completeTime。任务只能由创建它的会话查询和下载。
curl -s -X POST "$BASE/api/embed/export/excel" \
-H "X-Embed-Session: $TOKEN" -H 'Content-Type: application/json' \
-d '{"fileId":"rpt_sales","parameters":"{}"}'
外部数据集
把宿主系统的数据推送给报表使用,适用于报表里配置了「外部数据集」的场景。配置方式见外部数据集。
上传
POST /api/embed/staged-dataset/set,请求体:
| 字段 | 说明 | 取值/默认值 |
|---|---|---|
signature |
签名(Base64Url 后的 _s 字符串) |
必填 |
reportId |
关联报表 ID | 可选 |
datasets |
对象,键是数据集名称,值是行数组(每行为列名到值的对象) | 必填,不能为空 |
成功时 data 为 {"token":"...","datasetNames":["ds1"]}。数据总大小默认上限 5 MB,保留时间默认 24 小时(配置项 app.staged-dataset.max-payload-size、app.staged-dataset.ttl-hours)。使用时在嵌入链接或导出的 parameters 里加入 "_dataIds": "<token>"。
S=$(make_s zhangsan 张三 "")
curl -s -X POST "$BASE/api/embed/staged-dataset/set" \
-H 'Content-Type: application/json' \
-d "{\"signature\":\"$S\",\"datasets\":{\"ds1\":[{\"dept\":\"内科\",\"cnt\":12}]}}"
清除
POST /api/embed/staged-dataset/clear,请求体 {"signature":"...","token":"..."}。只能清除同一应用创建的 token,否则返回「未找到对应的数据集或无权清除」。
会话管理
| 接口 | 说明 |
|---|---|
GET /api/embed/session/validate |
请求头带 X-Embed-Session。有效时 data 为会话信息,缺少令牌返回「缺少会话Token」,无效返回「会话无效或已过期」 |
POST /api/embed/session/logout |
请求头带 X-Embed-Session。移除会话,总是返回成功 |
curl -s "$BASE/api/embed/session/validate" -H "X-Embed-Session: $TOKEN"
curl -s -X POST "$BASE/api/embed/session/logout" -H "X-Embed-Session: $TOKEN"
会话访问报表时受范围限制:只能访问签名锚定的报表,以及从它出发经「嵌入报表」区块或单元格报表链接可达的报表,其他报表返回 403「无权访问该报表」。
读取模板正文
GET /api/embed/report-file/source?reportId=<id>[&fileVersion=<版本>],需要会话头,且会话对该报表有权限。返回已发布的报表模板。前端嵌入页面使用此接口加载报表,第三方一般不需要直接调用。没有会话或越权时返回 403「无权查看该报表」。
续打接口
/api/embed/print/* 用于单据续打场景下宿主系统接管打印进度,支持 _s 或会话头认证:
| 接口 | 方法 | 说明 |
|---|---|---|
/api/embed/print/progress |
GET | 查询续打状态 |
/api/embed/print/continue |
POST | 从上次进度继续打印,可带 fromPage |
/api/embed/print/confirm |
POST | 确认打印结果,必须带 token |
/api/embed/print/cancel |
POST | 取消,必须带 token |
/api/embed/print/reset |
POST | 重置进度 |
/api/embed/print/manual-set |
POST | 手动设置进度,必须带 page、rowOnPage |
reset 和 manual-set 需要在「三方集成」应用中开启「续打进度管理」开关(应用字段 allowPrintReset,默认关闭),未开启时返回 403。续打的报表设置见套打对位。
常见错误
| 现象 | 原因 | 解决方法 |
|---|---|---|
| 签名格式无效 | _s 不是 Base64Url 编码的 JSON |
检查编码方式,不带 = 填充 |
| 签名已过期 | expireAt 早于当前时间(秒) |
重新生成,注意单位是秒 |
| 签名验证失败 | appSecret 不对或签名内容顺序不对 |
严格按 appId|account|userName|reportId|expireAt 拼接 |
| 应用不存在 / 应用已禁用 | appId 错误或应用被停用 |
在「三方集成」中核对 |
| 无权访问该报表 | 报表不在应用的白名单内 | 调整白名单或换报表 |
| 用户已被停用 | 对应外部用户被管理员停用 | 在用户管理中启用 |
| 会话无效或已过期(401) | 会话令牌错误或超过有效期 | 重新调用 /api/embed/auth |