external.md 6.49 KB

外部 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()

流程:

  1. 读取 Authorization header(回退:authorizationt 查询参数)。
  2. 查找以 sApiCode 为键的 sysapi 行(通过 ApiServiceImpl.invokeSELECT … FROM sysapi WHERE sApiCode = #{sApiCode})。
  3. 如果该行的 bHasToken 标志已设置,就用 sysapithirdtoken(或该行指向的等价 token 存储)验证 token。
  4. 使用请求 body 合并出的参数 map,执行 sysapi.sDataSql 中存放的 SQL 模板。
  5. 将调用写入 sysapilog
  6. AjaxResult 包装结果并返回。

因此,新增一个外部 API 是管理 / PM 任务:向 sysapi 插入一行,提供 SQL 模板,设置标志,把 sApiCode 和 token 给集成方。不需要改 Java 代码。

需要关注的 sysapi

含义
sApiCode 消费方发送的 path variable。每个租户内必须唯一。
sApiName 人类可读标签。
sApiUrl / sApiUrlRef 计算后的 URL,即 sApiUrlRef + sApiCode,用于出站分发。
sMethod 此 API 期望的 HTTP 方法(GETPOST 等)。
sHeadersBodysBodyNodesBodyType 描述入站请求形状的模板。
sDataSql 运行时执行的 SQL 模板。#{xxx} 引用会由请求参数填充。
sDataTestsDataTestNode 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 同步运行日志。

集成方如何使用

典型的首次集成:

  1. 让管理员注册你的 API。sysapi 插入一行(通过 BACK 自助页面或直接写库):选择 sApiCode,编写 sDataSql,如果需要 token 认证则设置 bHasToken = 1,保存。
  2. 获取 token。 POST /xlyApi/token/getToken?corpid=<your_id>&corpsecret=<your_secret>
  3. 调用 API。 使用 Authorization 中的 token 和 JSON body 调用 POST /xlyApi/api/invoke/<your_sApiCode>
  4. 检查日志。 sysapilog 会记录每次调用、响应 iStatus 和 body。BACK 管理页面也会展示同样的信息。

这个 API 不是什么

  • 不是 OpenAPI 描述的接口。 任意 sApiCode 的契约由其 sysapi.sDataSqlsBody 行决定。规格要向注册该 API 的团队获取,而不是从这里的 /swagger 端点获取。
  • 不是 xlyEntry 内部 API 的薄封装。 这些是有意分开的接口面。不支持从外部调用 xlyEntry 上的 /business/*
  • 不是入站 webhook 接收器。 第三方推送事件走 xlyInterface