一、概述
这篇指南是写给需要和算数低代码平台做系统集成的开发者的。不管你是要把平台的数据同步到ERP,还是要从外部系统调平台的接口创建表单,又或者是订阅平台的事件做实时联动——这篇文档都会给你讲明白。
算数平台提供的是标准RESTful API,支持JSON格式的请求和响应。认证机制支持OAuth2和API Key两种方式,适用不同场景。下面我们从设计规范开始,一步步把整个API体系过一遍。
二、RESTful API设计规范
我们的API设计严格遵循RESTful原则。说直白点,就是URL表示资源,HTTP方法表示操作,HTTP状态码表示结果。听起来是常识,但很多平台的API其实并没有真正遵守这些原则。
2.1 URL规范
- 使用名词复数形式:
/api/v1/apps而不是/api/v1/app - 资源层级用斜杠分隔:
/api/v1/apps/{appId}/forms/{formId} - 查询参数用小驼峰:
?pageSize=20&pageNum=1 - 版本号放在URL路径中:
/api/v1/,不使用Header版本控制
2.2 HTTP方法使用
| 方法 | 语义 | 幂等性 | 示例 |
|---|---|---|---|
| GET | 获取资源 | 是 | GET /api/v1/apps - 获取应用列表 |
| POST | 创建资源 | 否 | POST /api/v1/apps - 创建新应用 |
| PUT | 更新整个资源 | 是 | PUT /api/v1/apps/{id} - 更新应用配置 |
| DELETE | 删除资源 | 是 | DELETE /api/v1/apps/{id} - 删除应用 |
2.3 API端点总览
以下是平台核心API端点的完整列表,按模块分组:
| 模块 | 方法 | 端点 | 描述 | 认证 |
|---|---|---|---|---|
| 认证 | POST | /api/v1/auth/token | 获取access_token | 无需 |
| POST | /api/v1/auth/refresh | 刷新token | refresh_token | |
| POST | /api/v1/auth/revoke | 撤销token | access_token | |
| GET | /api/v1/auth/userinfo | 获取当前用户信息 | access_token | |
| 应用管理 | GET | /api/v1/apps | 应用列表 | API Key |
| POST | /api/v1/apps | 创建应用 | API Key | |
| GET | /api/v1/apps/{appId} | 应用详情 | API Key | |
| PUT | /api/v1/apps/{appId} | 更新应用 | API Key | |
| 表单数据 | GET | /api/v1/apps/{appId}/forms/{formId}/data | 查询表单数据 | API Key |
| POST | /api/v1/apps/{appId}/forms/{formId}/data | 提交表单数据 | API Key | |
| PUT | /api/v1/apps/{appId}/forms/{formId}/data/{dataId} | 更新表单数据 | API Key | |
| DELETE | /api/v1/apps/{appId}/forms/{formId}/data/{dataId} | 删除表单数据 | API Key | |
| 工作流 | POST | /api/v1/apps/{appId}/workflows/{wfId}/start | 发起流程 | OAuth2 |
| GET | /api/v1/apps/{appId}/workflows/{wfId}/instances | 查询流程实例 | OAuth2 | |
| Webhook | POST | /api/v1/webhooks | 注册Webhook | API Key |
| DELETE | /api/v1/webhooks/{hookId} | 删除Webhook | API Key |
三、认证机制
平台支持两种认证方式,选用哪种取决于你的集成场景。
3.1 OAuth2 授权码模式
适合需要代表用户操作的场景(比如发起审批流程、获取用户个人数据)。流程是标准的OAuth2 Authorization Code Flow:
- 引导用户访问授权页面:
https://api.micount.cn/oauth/authorize?client_id=YOUR_ID&redirect_uri=YOUR_URI&response_type=code&scope=app:read+app:write - 用户授权后,平台回调你的redirect_uri,携带authorization code
- 用code换取access_token:
POST /api/v1/auth/token
Content-Type: application/json
{
"grant_type": "authorization_code",
"client_id": "your_client_id",
"client_secret": "your_client_secret",
"code": "authorization_code_from_redirect",
"redirect_uri": "https://your-app.com/callback"
}
返回结果:
{
"access_token": "eyJhbGciOiJSUzI1NiIs...",
"token_type": "Bearer",
"expires_in": 7200,
"refresh_token": "d4f5e6a7b8c9...",
"scope": "app:read app:write"
}
3.2 API Key 认证
适合服务端到服务端的集成场景(比如数据同步、批量导入)。API Key在平台后台生成,通过HTTP Header传递:
GET /api/v1/apps X-API-Key: mk_live_a1b2c3d4e5f6g7h8 X-API-Signature: hmac_sha256(timestamp + body, api_secret)
API Key分为两种权限级别:只读Key(mk_readonly_前缀)和读写Key(mk_live_前缀)。建议在只需要读取数据的场景下使用只读Key,遵循最小权限原则。
四、数据格式
所有API请求和响应统一使用JSON格式。我们设计了一套统一的响应结构,不管是成功还是失败,返回格式是一致的:
4.1 统一响应结构
{
"code": 0,
"message": "success",
"data": {
"id": "app_6f8a2b3c",
"name": "销售管理应用",
"status": "published",
"createdAt": "2024-06-01T10:30:00+08:00"
},
"requestId": "req_8a7b6c5d4e3f",
"timestamp": 1717200000000
}
字段说明:code为0表示成功,非0表示错误(具体错误码见下文);message是人类可读的描述信息;data是实际业务数据;requestId用于问题排查;timestamp是服务器时间戳。
4.2 分页格式
列表类API统一支持分页,参数和返回格式如下:
GET /api/v1/apps?pageSize=20&pageNum=1&keyword=销售
{
"code": 0,
"message": "success",
"data": {
"list": [...],
"total": 156,
"pageSize": 20,
"pageNum": 1,
"totalPages": 8
}
}
五、错误处理
一套好的API必须有清晰的错误码体系。我们的错误码分三层:HTTP状态码 + 业务错误码 + 错误描述。HTTP状态码告诉你大概是什么类型的问题,业务错误码告诉你具体哪里出了问题。
5.1 HTTP状态码
| 状态码 | 含义 | 常见场景 |
|---|---|---|
| 200 | 成功 | 请求正常处理 |
| 201 | 创建成功 | POST创建资源成功 |
| 400 | 请求参数错误 | 参数缺失、格式不对、校验失败 |
| 401 | 未认证 | token无效或过期 |
| 403 | 无权限 | token有效但无权访问该资源 |
| 404 | 资源不存在 | URL路径错误或资源已删除 |
| 429 | 请求过于频繁 | 触发限流 |
| 500 | 服务器内部错误 | 服务端异常 |
| 503 | 服务不可用 | 服务维护中或过载 |
5.2 业务错误码
| 错误码 | HTTP状态码 | 描述 | 处理建议 |
|---|---|---|---|
| 0 | 200 | 成功 | - |
| 10001 | 400 | 参数缺失 | 检查必填参数 |
| 10002 | 400 | 参数格式错误 | 检查参数类型和格式 |
| 10003 | 400 | 参数值非法 | 检查枚举值/范围 |
| 20001 | 401 | access_token无效 | 重新获取token |
| 20002 | 401 | access_token已过期 | 用refresh_token刷新 |
| 20003 | 401 | API Key无效 | 检查Key是否正确 |
| 30001 | 403 | 无权限访问该资源 | 联系管理员授权 |
| 30002 | 403 | 超出API调用配额 | 升级套餐或联系商务 |
| 40001 | 404 | 资源不存在 | 检查ID是否正确 |
| 50001 | 429 | 触发限流 | 降低调用频率,等待重试 |
| 50002 | 429 | 并发数超限 | 控制并发请求数 |
| 90001 | 500 | 服务器内部错误 | 使用requestId联系技术支持 |
5.3 错误响应示例
{
"code": 10002,
"message": "参数格式错误:字段'email'不符合邮箱格式",
"data": null,
"errors": [
{
"field": "email",
"message": "必须为有效的邮箱地址",
"value": "test@@invalid.com"
}
],
"requestId": "req_8a7b6c5d4e3f",
"timestamp": 1717200000000
}
六、限流策略
为了保护平台稳定性,我们对API调用做了限流。限流算法用的是令牌桶(Token Bucket),比简单的固定窗口计数更灵活——允许一定程度的突发流量,但总体速率有上限。
6.1 限流规则
| 套餐 | QPS上限 | 日调用量上限 | 并发请求数 | 突发容量 |
|---|---|---|---|---|
| 免费版 | 5 | 1,000 | 3 | 10 |
| 专业版 | 50 | 50,000 | 20 | 100 |
| 企业版 | 200 | 500,000 | 100 | 500 |
| 旗舰版 | 不限 | 不限 | 500 | 不限 |
6.2 限流响应头
每次API响应都会携带限流信息头,方便客户端做自适应调整:
X-RateLimit-Limit: 50 # QPS上限 X-RateLimit-Remaining: 42 # 当前窗口剩余可用请求数 X-RateLimit-Reset: 1717200060 # 限流窗口重置时间(Unix时间戳) Retry-After: 2 # 触发限流后建议等待秒数(仅429响应)
6.3 客户端重试建议
当收到429响应时,不要立即重试,应该采用指数退避策略。我们推荐的重试间隔:1秒 → 2秒 → 4秒 → 8秒,最多重试4次。如果4次后仍然429,说明你的调用频率确实超了,需要考虑优化调用逻辑或升级套餐。
七、Webhook事件订阅
Webhook是平台主动通知外部系统的方式。当平台内发生特定事件时(比如表单提交、流程审批完成),平台会主动向你的回调URL发送HTTP POST请求,你不需要轮询。
7.1 支持的事件类型
| 事件类型 | 触发条件 | payload关键字段 |
|---|---|---|
| form.submitted | 表单数据提交成功 | appId, formId, dataId, submitter |
| form.updated | 表单数据被更新 | appId, formId, dataId, operator, changes |
| workflow.started | 工作流被发起 | appId, workflowId, instanceId, initiator |
| workflow.approved | 审批节点通过 | instanceId, nodeId, approver, comment |
| workflow.rejected | 审批节点驳回 | instanceId, nodeId, approver, comment |
| workflow.completed | 流程全部完成 | instanceId, finalResult |
| app.published | 应用发布 | appId, version, publisher |
| data.imported | 批量数据导入完成 | appId, formId, totalRows, successRows |
7.2 Webhook注册
POST /api/v1/webhooks
X-API-Key: mk_live_xxxxxxxx
Content-Type: application/json
{
"url": "https://your-app.com/webhook/micount",
"events": ["form.submitted", "workflow.completed"],
"appId": "app_6f8a2b3c",
"description": "销售管理应用事件回调",
"secret": "your_webhook_secret_for_signature_verification"
}
7.3 Webhook回调格式
当事件触发时,平台会向注册的URL发送POST请求:
POST https://your-app.com/webhook/micount
Content-Type: application/json
X-Micount-Event: form.submitted
X-Micount-Signature: sha256=a1b2c3d4e5f6...
X-Micount-Timestamp: 1717200000
{
"event": "form.submitted",
"eventId": "evt_8a7b6c5d",
"timestamp": 1717200000000,
"data": {
"appId": "app_6f8a2b3c",
"formId": "form_9d8e7f6a",
"dataId": "data_1a2b3c4d",
"submitter": {
"userId": "usr_12345",
"name": "张三",
"email": "zhangsan@company.com"
},
"formData": {
"customer_name": "某某公司",
"amount": 50000,
"status": "pending"
}
}
}
7.4 签名验证
每个Webhook请求都带有签名,用于验证请求确实来自算数平台(防止伪造)。签名算法:HMAC-SHA256(timestamp + rawBody, webhook_secret)。你的服务端收到请求后应该:
- 从Header中取出
X-Micount-Timestamp和X-Micount-Signature - 检查timestamp与当前时间差是否在5分钟以内(防重放攻击)
- 用你注册时设置的secret重新计算签名,与Header中的签名对比
- 签名一致才处理请求,不一致直接丢弃
7.5 重试机制
你的服务端收到Webhook请求后,需要在5秒内返回HTTP 200。如果超时或返回非2xx状态码,平台会自动重试。重试策略:第1次间隔30秒,第2次间隔2分钟,第3次间隔10分钟,第4次间隔1小时,最多重试4次。超过4次仍然失败的事件会被记录到失败队列,可以在后台手动重发。
八、SDK与工具
为了降低集成成本,我们提供了以下SDK和工具:
- Java SDK:Maven依赖
cn.micount:lowcode-sdk:1.2.0,支持同步和异步调用 - Python SDK:pip安装
pip install micount-lowcode,支持类型提示 - Node.js SDK:npm安装
npm install @micount/lowcode-sdk,支持TypeScript - Postman Collection:一键导入所有API,方便调试
- 在线API调试台:平台后台内置,支持在线发送请求查看响应
提示:所有SDK和工具均开源在算数科技开发者中心。如果你在集成过程中遇到问题,可以联系技术支持:邮箱 cooper@micount.cn,电话 18016313342。
九、最佳实践
最后总结几条API集成的最佳实践,都是踩坑总结出来的:
- 缓存token:access_token有效期2小时,不要每次请求都重新获取。缓存起来,过期前5分钟刷新即可。
- 批量操作优先:需要提交100条表单数据时,用批量接口(
POST /api/v1/apps/{appId}/forms/{formId}/data/batch)而不是循环调用单条接口。一次批量请求比100次单条请求快得多,也更不容易触发限流。 - Webhook优于轮询:需要实时感知数据变化时,优先用Webhook,不要轮询GET接口。轮询既浪费配额又延迟高。
- 实现指数退避重试:网络不稳定是常态,你的代码必须能处理临时性错误。但重试不是无脑重试——用指数退避+最大重试次数,避免雪崩。
- 使用requestId排查问题:遇到排查不了的问题,把requestId发给技术支持,我们能通过它定位到完整的请求链路。
想了解更多技术细节?推荐阅读我们的低代码平台技术架构白皮书,了解平台底层是怎么运作的。如果是运维同学,也可以看看企业级部署方案。