外部 API(xlyApi)
xlyApi 是外部集成方使用的 API 接口面。它作为独立的 Spring Boot WAR 运行(入口类 xlyApi/src/main/java/com/xly/ApiApplicationBoot.java),context-path 为 /xlyApi,并拥有自己的 application-*.yml 文件。
它最关键的设计选择是:大多数外部端点不是硬编码在 Java 里的,而是 sysapi 中的数据行。新的外部 API 和 xly 其他部分一样,是“注册成数据”的。运行时负责查找 sApiCode、验证调用方,并执行元数据指定的内容。
数据驱动分发器:/api/invoke/{sApiCode}
最重要的单个端点:
POST /xlyApi/api/invoke/{sApiCode}
Authorization: Bearer <token> (or query param ?authorizationt=<token>)
Content-Type: application/json
{ ...request body, passed through as `sBody` to the handler... }
处理器:xlyApi/src/main/java/com/xly/api/web/ApiController.java 中的 ApiController.invoke()。
流程:
- 读取
Authorizationheader(回退:authorizationt查询参数)。 - 查找以
sApiCode为键的sysapi行(通过ApiServiceImpl.invoke→SELECT … FROM sysapi WHERE sApiCode = #{sApiCode})。 - 如果该行的
bHasToken标志已设置,就用sysapithirdtoken(或该行指向的等价 token 存储)验证 token。 - 使用请求 body 合并出的参数 map,执行
sysapi.sDataSql中存放的 SQL 模板。 - 将调用写入
sysapilog。 - 用
AjaxResult包装结果并返回。
因此,新增一个外部 API 是管理 / PM 任务:向 sysapi 插入一行,提供 SQL 模板,设置标志,把 sApiCode 和 token 给集成方。不需要改 Java 代码。
需要关注的 sysapi 列
| 列 | 含义 |
|---|---|
sApiCode |
消费方发送的 path variable。每个租户内必须唯一。 |
sApiName |
人类可读标签。 |
sApiUrl / sApiUrlRef
|
计算后的 URL,即 sApiUrlRef + sApiCode,用于出站分发。 |
sMethod |
此 API 期望的 HTTP 方法(GET、POST 等)。 |
sHeader、sBody、sBodyNode、sBodyType
|
描述入站请求形状的模板。 |
sDataSql |
运行时执行的 SQL 模板。#{xxx} 引用会由请求参数填充。 |
sDataTest、sDataTestNode
|
BACK API 测试器(POST /api/apiTest)使用的请求 / 响应样例。 |
bHasToken |
1 表示要求 Authorization 中携带 token;0 表示公开。 |
API 管理端点
/api/list/...、/api/data/...、/api/add、/api/edit、/api/remove 是管理 sysapi 行本身的后台接口面(BACK 的“自定义接口”页面会调用这些)。POST /api/getSqlTemple 为给定 API 名称生成 SQL 骨架;POST /api/apiTest 使用 sDataTest 中的测试夹具跑一次端到端 dry-run。
Token 端点:/token/*
| Endpoint | Method | 用途 |
|---|---|---|
/token/getToken?corpid=&corpsecret= |
POST | 为集成方的 (corpid, corpsecret) 组合签发 bearer token。 |
返回的 token 就是 /api/invoke/{sApiCode} 期望在 Authorization 中收到的值。完整实现位于 xlyApi/src/main/java/com/xly/api/web/TokenController.java 及其 service。
对于 xly 自己获取的第三方 token(为了代表客户调用集群外 API),见 /thirdtoken/*,它由 sysapithirdtoken 支撑(表注释:第三方token获取接口)。
其他收敛后的接口面
这些是同一个 WAR 中托管的较小专用 API:
| Endpoint root | Controller | 用途 |
|---|---|---|
/online/api/{sApiCode} |
OnlineController |
只读执行某个 sysapi 行(不写入)。适合公开数据端点。 |
/online/onlineword/{sApiCode} |
OnlineController |
返回“word”风格模板载荷的变体。 |
/online/onlinelist, /online/getToken
|
OnlineController |
在线 API 列表及其 token 签发。 |
/pro/get/{sProName} |
ProContentController |
按名称获取存储过程元数据。 |
/pro/getData/{sProName} |
ProContentController |
执行指定存储过程并返回其结果集。 |
/pro/alert/{redisId}, /pro/getAlertValue/{redisId}
|
ProContentController |
按 Redis id 读取预警 / 通知值。 |
/pro/executeSql |
ProContentController |
执行参数化 SQL 模板(管理级)。 |
/thirdparty/* |
ThirdPartyController |
第三方 API 定义 CRUD,以及 checkPartyApi 校验器。由 sysapithirdparty 支撑。 |
/thirdtoken/* |
ThirdTokenController |
出站 token 配置 CRUD。由 sysapithirdtoken 支撑。 |
/brand/* |
BrandController |
伙伴 / 供应商列表(sysapibrand)CRUD。 |
/json/*, /json/jsonEdit/{sDomId}
|
JsonController |
BACK API 编辑器使用的 JSON 树编辑辅助端点。 |
/interfaceDefine/callthirdparty/{interfaceInvoke} |
InterfaceController |
分发由 sysapithirdparty 定义的出站调用。 |
/gpt/chatGpt |
GptController |
实验性 GPT/chat 接口的透传;不属于框架 Wiki 范围。 |
支撑表(数据库层接口面)
这些表保存 API 元数据。所有表都带有 sBrandsId / sSubsidiaryId,用于租户作用域。
| 表 | 角色 |
|---|---|
sysapi |
/api/invoke 使用的 API 定义。 |
sysapilog |
每次调用的审计日志。 |
sysapibrand |
伙伴 / 供应商目录。 |
sysapithirdparty |
出站第三方端点定义。 |
sysapithirdtoken |
出站第三方 token 配置。 |
sysapidbtodb |
DB-to-DB 同步 API 定义。 |
sysapidbtodblog |
DB-to-DB 同步运行日志。 |
集成方如何使用
典型的首次集成:
-
让管理员注册你的 API。 向
sysapi插入一行(通过 BACK 自助页面或直接写库):选择sApiCode,编写sDataSql,如果需要 token 认证则设置bHasToken = 1,保存。 -
获取 token。
POST /xlyApi/token/getToken?corpid=<your_id>&corpsecret=<your_secret>。 -
调用 API。 使用
Authorization中的 token 和 JSON body 调用POST /xlyApi/api/invoke/<your_sApiCode>。 -
检查日志。
sysapilog会记录每次调用、响应iStatus和 body。BACK 管理页面也会展示同样的信息。
这个 API 不是什么
-
不是 OpenAPI 描述的接口。 任意
sApiCode的契约由其sysapi.sDataSql和sBody行决定。规格要向注册该 API 的团队获取,而不是从这里的/swagger端点获取。 -
不是
xlyEntry内部 API 的薄封装。 这些是有意分开的接口面。不支持从外部调用xlyEntry上的/business/*。 -
不是入站 webhook 接收器。 第三方推送事件走
xlyInterface。