获取表结构
接口
HttpGet: api/FrontEnd/GetTableStructure/{menuCode}
根据菜单编码返回表单字段结构。返回值为 JSON 对象,键是字段编码,值是字段显示名称;字段未设置显示名称时,值回退为字段编码。
传入 subTableCode 时,返回该主表下指定子表的字段结构。接口会校验子表归属关系,不能通过子表编码读取其他主表的结构。
请求参数
Path 参数
| 参数名 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
menuCode | string | 是 | 主表所在菜单(表单)编码。 |
Query 参数
| 参数名 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
subTableCode | string | 否 | 子表编码。省略时返回主表结构;传入时必须属于 menuCode。 |
请求头
| 参数名 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
Authorization | string | 是 | 登录令牌,格式为 Bearer {token}。接口未配置免登录。 |
TnCode | string | 是 | 租户编码。 |
UserId | string | 条件必填 | 数据令牌签名使用的用户标识;非本机、非 IP 白名单调用时必填。 |
Timestamp | string | 条件必填 | 非本机、非 IP 白名单调用时必填。使用 13 位 Unix 毫秒时间戳,例如 1786550400123。 |
Datatoken | string | 条件必填 | 非本机、非 IP 白名单调用时必填。为 64 位小写十六进制 SM3 摘要,且同一值不能重复使用。 |
本机或 IP 白名单环境仍必须携带 Authorization,但不校验 Timestamp 和 Datatoken。
Datatoken 生成规则
GET 请求按最终发送的路径和查询串签名,不包含协议、主机和端口。设:
pathAndQuery:最终请求的路径与查询串,例如/api/FrontEnd/GetTableStructure/purchase_apply?subTableCode=purchase_detail;userId:请求头UserId;timestamp:请求头Timestamp。
urlHash = SM3(pathAndQuery)
Datatoken = SM3(timestamp + "zhouju@2025" + userId + urlHash)
lcp@2025 是服务端兼容的备用密钥;调用端应优先使用 zhouju@2025。签名完成后不得修改菜单编码、查询参数、参数顺序或 URL 编码,否则校验失败。每个 Datatoken 只能使用一次。
以下示例使用 sm-crypto 生成签名并请求子表结构:
import { sm3 } from "sm-crypto";
const menuCode = "purchase_apply";
const subTableCode = "purchase_detail";
const userId = "18f923a7-5a5e-426d-94ae-a55ad1a4b239";
const timestamp = String(Date.now());
const pathAndQuery = "/api/FrontEnd/GetTableStructure/"
+ encodeURIComponent(menuCode)
+ "?subTableCode=" + encodeURIComponent(subTableCode);
const datatoken = sm3(`${timestamp}zhouju@2025${userId}${sm3(pathAndQuery)}`);
const response = await fetch(`https://example.com${pathAndQuery}`, {
headers: {
Authorization: "Bearer {token}",
TnCode: "00000000",
UserId: userId,
Timestamp: timestamp,
Datatoken: datatoken
}
});
const fields = await response.json();
请求示例
获取主表结构
GET /api/FrontEnd/GetTableStructure/purchase_apply HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzUxMiJ9...
TnCode: 00000000
UserId: 18f923a7-5a5e-426d-94ae-a55ad1a4b239
Timestamp: 1786550400123
Datatoken: {按上方公式计算的 64 位 SM3 十六进制值}
获取指定子表结构
GET /api/FrontEnd/GetTableStructure/purchase_apply?subTableCode=purchase_detail HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzUxMiJ9...
TnCode: 00000000
UserId: 18f923a7-5a5e-426d-94ae-a55ad1a4b239
Timestamp: 1786550400123
Datatoken: {按上方公式计算的 64 位 SM3 十六进制值}
返回结果
成功时直接返回字段映射对象:
{
"ObjectID": "数据ID",
"Title": "采购主题",
"Applicant": "申请人",
"CreatedTime": "创建时间"
}
| 返回键 | 返回值 | 说明 |
|---|---|---|
| 字段编码 | 字段显示名称 | 每个键值对对应表单数据模型中的一个字段。 |
错误说明
| 场景 | 返回信息 |
|---|---|
menuCode 为空 | 菜单编码为空 |
| 子表不属于主表 | 子表[{subTableCode}]不属于菜单[{menuCode}] |
| 表单或数据模型不存在 | 表单数据模型不存在 |
| 缺少登录令牌 | HTTP 401,登录令牌不能为空 |
| 数据令牌缺失或签名不正确 | HTTP 401,数据令牌不能为空 或 URL校验失败,请勿随意调用接口 |