528 lines
12 KiB
Markdown
528 lines
12 KiB
Markdown
# API 文档
|
||
|
||
## 元数据
|
||
- 需求编号:004-01
|
||
- 文档版本:v1.0.0
|
||
- 创建时间:2026-02-03
|
||
- 创建人:AI Assistant
|
||
- 状态:已完成
|
||
|
||
## API 概述
|
||
|
||
### 功能描述
|
||
Tooling API 连接管理模块提供 Salesforce Tooling API 的连接管理功能,包括获取连接、清除缓存、测试连接、设置调用选项、设置调试头部等核心功能。
|
||
|
||
### 基础信息
|
||
- **基础路径**:`/salesforce/tooling/connection`
|
||
- **协议**:HTTPS
|
||
- **数据格式**:JSON
|
||
- **字符编码**:UTF-8
|
||
|
||
### 认证方式
|
||
- 使用 JWT Token 进行身份认证
|
||
- Token 通过登录接口获取
|
||
- 需要在请求头中携带 `Authorization: Bearer {token}`
|
||
|
||
### 权限控制
|
||
- 使用 Spring Security 进行权限控制
|
||
- 每个接口都有对应的权限标识
|
||
- 权限格式:`tooling:connection:{操作}`
|
||
|
||
## 接口列表
|
||
|
||
### 1. 获取连接
|
||
|
||
#### 接口说明
|
||
获取 Tooling API 连接,如果缓存中没有有效连接,则创建新连接。
|
||
|
||
#### 请求信息
|
||
- **请求方式**:GET
|
||
- **请求路径**:`/salesforce/tooling/connection/get`
|
||
- **权限标识**:`tooling:connection:get`
|
||
|
||
#### 请求参数
|
||
无
|
||
|
||
#### 响应参数
|
||
|
||
##### 成功响应(HTTP 200)
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| code | Integer | 状态码(200 表示成功) |
|
||
| msg | String | 提示信息 |
|
||
| data | Object | 连接结果对象 |
|
||
| data.success | Boolean | 是否成功 |
|
||
| data.connectionId | String | 连接 ID |
|
||
| data.sessionId | String | Session ID(脱敏处理) |
|
||
| data.instanceUrl | String | Salesforce 实例 URL |
|
||
| data.connectionTime | String | 连接时间(格式:yyyy-MM-dd HH:mm:ss) |
|
||
| data.client | String | 客户端名称 |
|
||
| data.debugLevel | String | 调试级别 |
|
||
|
||
##### 失败响应(HTTP 200,业务错误)
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| code | Integer | 状态码(非 200 表示失败) |
|
||
| msg | String | 错误信息 |
|
||
|
||
#### 成功示例
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "获取连接成功",
|
||
"data": {
|
||
"success": true,
|
||
"connectionId": "conn_1234567890",
|
||
"sessionId": "00D...",
|
||
"instanceUrl": "https://xxxxx.my.salesforce.com",
|
||
"connectionTime": "2026-02-03 10:30:00",
|
||
"client": "DataiToolingClient",
|
||
"debugLevel": "DEBUG"
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 失败示例
|
||
```json
|
||
{
|
||
"code": 500,
|
||
"msg": "获取连接失败: Session 无效或已过期"
|
||
}
|
||
```
|
||
|
||
#### 错误码
|
||
- `TOOLING_CONN_001`:Session 无效或已过期
|
||
- `TOOLING_CONN_002`:连接创建失败
|
||
- `TOOLING_CONN_006`:用户未登录
|
||
|
||
---
|
||
|
||
### 2. 清除连接缓存
|
||
|
||
#### 接口说明
|
||
清除缓存的 Tooling API 连接。
|
||
|
||
#### 请求信息
|
||
- **请求方式**:DELETE
|
||
- **请求路径**:`/salesforce/tooling/connection/clear`
|
||
- **权限标识**:`tooling:connection:clear`
|
||
|
||
#### 请求参数
|
||
无
|
||
|
||
#### 响应参数
|
||
|
||
##### 成功响应(HTTP 200)
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| code | Integer | 状态码(200 表示成功) |
|
||
| msg | String | 提示信息 |
|
||
|
||
##### 失败响应(HTTP 200,业务错误)
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| code | Integer | 状态码(非 200 表示失败) |
|
||
| msg | String | 错误信息 |
|
||
|
||
#### 成功示例
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "清除连接缓存成功"
|
||
}
|
||
```
|
||
|
||
#### 失败示例
|
||
```json
|
||
{
|
||
"code": 500,
|
||
"msg": "清除连接缓存失败: 无权限操作"
|
||
}
|
||
```
|
||
|
||
#### 错误码
|
||
- `TOOLING_CONN_004`:权限不足
|
||
|
||
---
|
||
|
||
### 3. 测试连接
|
||
|
||
#### 接口说明
|
||
测试 Tooling API 连接是否有效。
|
||
|
||
#### 请求信息
|
||
- **请求方式**:GET
|
||
- **请求路径**:`/salesforce/tooling/connection/test`
|
||
- **权限标识**:`tooling:connection:test`
|
||
|
||
#### 请求参数
|
||
无
|
||
|
||
#### 响应参数
|
||
|
||
##### 成功响应(HTTP 200)
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| code | Integer | 状态码(200 表示成功) |
|
||
| msg | String | 提示信息 |
|
||
| data | Object | 测试结果对象 |
|
||
| data.success | Boolean | 是否成功 |
|
||
| data.valid | Boolean | 连接是否有效 |
|
||
| data.testTime | String | 测试时间(格式:yyyy-MM-dd HH:mm:ss) |
|
||
| data.responseTime | Long | 响应时间(毫秒) |
|
||
| data.errorCode | String | 错误码(失败时返回) |
|
||
| data.errorMessage | String | 错误消息(失败时返回) |
|
||
|
||
##### 失败响应(HTTP 200,业务错误)
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| code | Integer | 状态码(非 200 表示失败) |
|
||
| msg | String | 错误信息 |
|
||
|
||
#### 成功示例
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "测试连接成功",
|
||
"data": {
|
||
"success": true,
|
||
"valid": true,
|
||
"testTime": "2026-02-03 10:35:00",
|
||
"responseTime": 150
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 失败示例
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "测试连接成功",
|
||
"data": {
|
||
"success": true,
|
||
"valid": false,
|
||
"testTime": "2026-02-03 10:35:00",
|
||
"responseTime": 50,
|
||
"errorCode": "TOOLING_CONN_001",
|
||
"errorMessage": "Session 无效或已过期"
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 错误码
|
||
- `TOOLING_CONN_001`:Session 无效或已过期
|
||
- `TOOLING_CONN_003`:网络超时
|
||
|
||
---
|
||
|
||
### 4. 设置调用选项
|
||
|
||
#### 接口说明
|
||
设置 Tooling API 连接的调用选项。
|
||
|
||
#### 请求信息
|
||
- **请求方式**:POST
|
||
- **请求路径**:`/salesforce/tooling/connection/call-options`
|
||
- **权限标识**:`tooling:connection:callOptions`
|
||
- **Content-Type**:`application/json`
|
||
|
||
#### 请求参数
|
||
|
||
##### Body 参数
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| client | String | 否 | 客户端名称,用于标识调用来源 |
|
||
|
||
#### 请求示例
|
||
```json
|
||
{
|
||
"client": "DataiToolingClient"
|
||
}
|
||
```
|
||
|
||
#### 响应参数
|
||
|
||
##### 成功响应(HTTP 200)
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| code | Integer | 状态码(200 表示成功) |
|
||
| msg | String | 提示信息 |
|
||
| data | Object | 设置结果对象 |
|
||
| data.success | Boolean | 是否成功 |
|
||
| data.client | String | 设置的客户端名称 |
|
||
|
||
##### 失败响应(HTTP 200,业务错误)
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| code | Integer | 状态码(非 200 表示失败) |
|
||
| msg | String | 错误信息 |
|
||
|
||
#### 成功示例
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "设置调用选项成功",
|
||
"data": {
|
||
"success": true,
|
||
"client": "DataiToolingClient"
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 失败示例
|
||
```json
|
||
{
|
||
"code": 500,
|
||
"msg": "设置调用选项失败: 连接无效"
|
||
}
|
||
```
|
||
|
||
#### 错误码
|
||
- `TOOLING_CONN_001`:Session 无效或已过期
|
||
- `TOOLING_CONN_007`:设置调用选项失败
|
||
|
||
---
|
||
|
||
### 5. 设置调试头部
|
||
|
||
#### 接口说明
|
||
设置 Tooling API 连接的调试头部。
|
||
|
||
#### 请求信息
|
||
- **请求方式**:POST
|
||
- **请求路径**:`/salesforce/tooling/connection/debugging-header`
|
||
- **权限标识**:`tooling:connection:debuggingHeader`
|
||
- **Content-Type**:`application/json`
|
||
|
||
#### 请求参数
|
||
|
||
##### Body 参数
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| debugLevel | String | 否 | 调试级别,可选值:NONE、DEBUG、DB、DETAIL、PROFILING |
|
||
|
||
#### 调试级别说明
|
||
| 级别 | 说明 |
|
||
|------|------|
|
||
| NONE | 不记录调试信息 |
|
||
| DEBUG | 记录基本调试信息 |
|
||
| DB | 记录数据库操作信息 |
|
||
| DETAIL | 记录详细信息 |
|
||
| PROFILING | 记录性能分析信息 |
|
||
|
||
#### 请求示例
|
||
```json
|
||
{
|
||
"debugLevel": "DEBUG"
|
||
}
|
||
```
|
||
|
||
#### 响应参数
|
||
|
||
##### 成功响应(HTTP 200)
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| code | Integer | 状态码(200 表示成功) |
|
||
| msg | String | 提示信息 |
|
||
| data | Object | 设置结果对象 |
|
||
| data.success | Boolean | 是否成功 |
|
||
| data.debugLevel | String | 设置的调试级别 |
|
||
|
||
##### 失败响应(HTTP 200,业务错误)
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| code | Integer | 状态码(非 200 表示失败) |
|
||
| msg | String | 错误信息 |
|
||
|
||
#### 成功示例
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "设置调试头部成功",
|
||
"data": {
|
||
"success": true,
|
||
"debugLevel": "DEBUG"
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 失败示例
|
||
```json
|
||
{
|
||
"code": 500,
|
||
"msg": "设置调试头部失败: 无效的调试级别"
|
||
}
|
||
```
|
||
|
||
#### 错误码
|
||
- `TOOLING_CONN_001`:Session 无效或已过期
|
||
- `TOOLING_CONN_008`:设置调试头部失败
|
||
|
||
---
|
||
|
||
## 错误码
|
||
|
||
### 错误码列表
|
||
|
||
| 错误码 | 错误消息 | 说明 |
|
||
|--------|----------|------|
|
||
| TOOLING_CONN_001 | Session 无效或已过期 | 当前用户的 Session 已过期或无效,需要重新登录 |
|
||
| TOOLING_CONN_002 | 连接创建失败 | 创建 ToolingConnection 时发生错误 |
|
||
| TOOLING_CONN_003 | 网络超时 | 与 Salesforce API 通信超时 |
|
||
| TOOLING_CONN_004 | 权限不足 | 当前用户没有执行该操作的权限 |
|
||
| TOOLING_CONN_005 | API 版本不支持 | 请求的 API 版本不被支持 |
|
||
| TOOLING_CONN_006 | 用户未登录 | 用户未登录或登录状态已失效 |
|
||
| TOOLING_CONN_007 | 设置调用选项失败 | 设置 CallOptions 时发生错误 |
|
||
| TOOLING_CONN_008 | 设置调试头部失败 | 设置 DebuggingHeader 时发生错误 |
|
||
|
||
### 错误码使用场景
|
||
|
||
#### TOOLING_CONN_001 - Session 无效或已过期
|
||
- **触发场景**:
|
||
- 用户 Session 已过期
|
||
- Session ID 被篡改
|
||
- Salesforce 端 Session 被注销
|
||
- **处理建议**:
|
||
- 提示用户重新登录
|
||
- 自动刷新 Session(如果支持)
|
||
|
||
#### TOOLING_CONN_002 - 连接创建失败
|
||
- **触发场景**:
|
||
- Instance URL 无效
|
||
- Session ID 无效
|
||
- 网络异常
|
||
- **处理建议**:
|
||
- 检查 Salesforce 配置
|
||
- 检查网络连接
|
||
- 查看详细错误日志
|
||
|
||
#### TOOLING_CONN_003 - 网络超时
|
||
- **触发场景**:
|
||
- 网络延迟过高
|
||
- Salesforce 服务响应慢
|
||
- 请求数据量过大
|
||
- **处理建议**:
|
||
- 检查网络连接
|
||
- 增加超时时间配置
|
||
- 分批处理大数据量请求
|
||
|
||
#### TOOLING_CONN_004 - 权限不足
|
||
- **触发场景**:
|
||
- 用户没有对应接口的权限
|
||
- 权限配置未同步到数据库
|
||
- **处理建议**:
|
||
- 联系管理员分配权限
|
||
- 检查权限配置是否正确
|
||
|
||
#### TOOLING_CONN_005 - API 版本不支持
|
||
- **触发场景**:
|
||
- 请求的 API 版本过低或过高
|
||
- **处理建议**:
|
||
- 使用支持的 API 版本
|
||
- 查看 Salesforce API 版本文档
|
||
|
||
#### TOOLING_CONN_006 - 用户未登录
|
||
- **触发场景**:
|
||
- 用户未登录
|
||
- Token 已过期
|
||
- Token 被篡改
|
||
- **处理建议**:
|
||
- 提示用户登录
|
||
- 刷新 Token
|
||
|
||
#### TOOLING_CONN_007 - 设置调用选项失败
|
||
- **触发场景**:
|
||
- 连接无效
|
||
- 参数格式错误
|
||
- **处理建议**:
|
||
- 先获取有效连接
|
||
- 检查参数格式
|
||
|
||
#### TOOLING_CONN_008 - 设置调试头部失败
|
||
- **触发场景**:
|
||
- 连接无效
|
||
- 调试级别无效
|
||
- **处理建议**:
|
||
- 先获取有效连接
|
||
- 使用有效的调试级别
|
||
|
||
## 使用示例
|
||
|
||
### 场景 1:获取连接并测试
|
||
|
||
```java
|
||
// 步骤 1:获取连接
|
||
GET /salesforce/tooling/connection/get
|
||
|
||
// 步骤 2:测试连接
|
||
GET /salesforce/tooling/connection/test
|
||
```
|
||
|
||
### 场景 2:设置调试选项后执行操作
|
||
|
||
```java
|
||
// 步骤 1:设置调试级别
|
||
POST /salesforce/tooling/connection/debugging-header
|
||
{
|
||
"debugLevel": "DEBUG"
|
||
}
|
||
|
||
// 步骤 2:设置客户端名称
|
||
POST /salesforce/tooling/connection/call-options
|
||
{
|
||
"client": "MyApplication"
|
||
}
|
||
|
||
// 步骤 3:执行 Tooling API 操作
|
||
// ... 其他 Tooling API 调用
|
||
|
||
// 步骤 4:清除调试设置(可选)
|
||
POST /salesforce/tooling/connection/debugging-header
|
||
{
|
||
"debugLevel": "NONE"
|
||
}
|
||
```
|
||
|
||
### 场景 3:连接异常时重新获取
|
||
|
||
```java
|
||
// 步骤 1:测试连接
|
||
GET /salesforce/tooling/connection/test
|
||
|
||
// 如果返回 valid=false
|
||
// 步骤 2:清除缓存
|
||
DELETE /salesforce/tooling/connection/clear
|
||
|
||
// 步骤 3:重新获取连接
|
||
GET /salesforce/tooling/connection/get
|
||
```
|
||
|
||
## 注意事项
|
||
|
||
### 1. 连接缓存
|
||
- 连接会缓存在内存中,避免重复创建
|
||
- 应用重启后缓存会丢失
|
||
- Session 过期时会自动重新创建连接
|
||
|
||
### 2. 线程安全
|
||
- 连接缓存使用 ConcurrentHashMap,线程安全
|
||
- 多个线程可以同时获取连接
|
||
- 但每个线程应该使用自己的连接实例
|
||
|
||
### 3. 性能建议
|
||
- 在应用启动时预获取连接
|
||
- 定期测试连接有效性
|
||
- 避免频繁清除缓存
|
||
|
||
### 4. 安全建议
|
||
- Session ID 在日志中会被脱敏处理
|
||
- 不要在客户端暴露 Session ID
|
||
- 使用 HTTPS 协议传输数据
|
||
|
||
## 相关文档
|
||
- [需求文档](../requirements/sub/2026-01-28-004-01-连接管理.md)
|
||
- [设计文档](../design/2026-02-03-004-01-连接管理-设计.md)
|
||
- [决策记录](../decisions/2026-02-03-004-01-ADR-连接管理技术选型.md)
|
||
- [变更日志](../changelog/2026-02-03-004-01-changelog.md)
|
||
- [复盘文档](../retros/2026-02-03-004-01-retro.md)
|