424 lines
12 KiB
Markdown
424 lines
12 KiB
Markdown
|
|
# API 文档 - 描述和列出元数据
|
|||
|
|
|
|||
|
|
## 元数据
|
|||
|
|
- 需求编号:003-08
|
|||
|
|
- 需求名称:描述和列出元数据
|
|||
|
|
- 创建时间:2026-02-06
|
|||
|
|
- 创建人:AI Assistant
|
|||
|
|
- 状态:已完成
|
|||
|
|
|
|||
|
|
## API 概述
|
|||
|
|
|
|||
|
|
本文档描述了"描述和列出元数据"功能的 REST API 接口。该功能基于 Salesforce Metadata API,提供了以下核心能力:
|
|||
|
|
|
|||
|
|
1. **描述元数据(DescribeMetadata)**:获取当前 Salesforce Org 支持的所有元数据类型信息
|
|||
|
|
2. **列出元数据(ListMetadata)**:获取指定元数据类型下的具体成员列表,支持分批处理
|
|||
|
|
3. **查询历史(History Query)**:查询元数据操作的执行历史,支持审计和追溯
|
|||
|
|
|
|||
|
|
### 基础信息
|
|||
|
|
- **基础路径**:`/salesforce/metadata`
|
|||
|
|
- **Content-Type**:`application/json`
|
|||
|
|
- **认证方式**:基于 Session 的认证(通过 `MetadataConnectionFactory` 管理)
|
|||
|
|
|
|||
|
|
## 接口列表
|
|||
|
|
|
|||
|
|
### 接口 1:描述元数据
|
|||
|
|
|
|||
|
|
**功能描述**:获取当前 Salesforce Org 支持的所有元数据类型信息,包括元数据对象的类型、目录、子类型等详细信息。
|
|||
|
|
|
|||
|
|
**请求方式**:GET
|
|||
|
|
|
|||
|
|
**请求路径**:`/salesforce/metadata/describe`
|
|||
|
|
|
|||
|
|
**请求参数**:
|
|||
|
|
|
|||
|
|
| 参数名 | 类型 | 必填 | 说明 |
|
|||
|
|
|--------|------|------|------|
|
|||
|
|
| apiVersion | Double | 否 | API 版本号,如 59.0。如果不传,使用 Salesforce 默认版本 |
|
|||
|
|
|
|||
|
|
**响应参数**:
|
|||
|
|
|
|||
|
|
| 参数名 | 类型 | 说明 |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| code | Integer | 状态码(200 成功,其他失败) |
|
|||
|
|
| msg | String | 提示信息 |
|
|||
|
|
| data | Object | 描述元数据结果(DescribeMetadataResult) |
|
|||
|
|
|
|||
|
|
**DescribeMetadataResult 结构**:
|
|||
|
|
|
|||
|
|
| 参数名 | 类型 | 说明 |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| metadataObjects | Array | 元数据对象列表(DescribeMetadataObject[]) |
|
|||
|
|
| metadataObjectsWithMns | Array | 带命名空间的元数据对象列表(DescribeMetadataObject[]) |
|
|||
|
|
| namespacePrefix | String | 命名空间前缀 |
|
|||
|
|
| serverVersion | String | 服务器版本 |
|
|||
|
|
|
|||
|
|
**DescribeMetadataObject 结构**:
|
|||
|
|
|
|||
|
|
| 参数名 | 类型 | 说明 |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| childXmlNames | Array | 子 XML 名称列表(String[]) |
|
|||
|
|
| directoryName | String | 目录名称 |
|
|||
|
|
| inFolder | Boolean | 是否在文件夹中 |
|
|||
|
|
| metaFile | Boolean | 是否有元文件 |
|
|||
|
|
| suffix | String | 文件后缀 |
|
|||
|
|
| xmlName | String | XML 名称 |
|
|||
|
|
|
|||
|
|
**成功示例**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 200,
|
|||
|
|
"msg": "操作成功",
|
|||
|
|
"data": {
|
|||
|
|
"metadataObjects": [
|
|||
|
|
{
|
|||
|
|
"childXmlNames": [],
|
|||
|
|
"directoryName": "objects",
|
|||
|
|
"inFolder": false,
|
|||
|
|
"metaFile": false,
|
|||
|
|
"suffix": "object",
|
|||
|
|
"xmlName": "CustomObject"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"childXmlNames": [],
|
|||
|
|
"directoryName": "classes",
|
|||
|
|
"inFolder": false,
|
|||
|
|
"metaFile": true,
|
|||
|
|
"suffix": "cls",
|
|||
|
|
"xmlName": "ApexClass"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"metadataObjectsWithMns": [],
|
|||
|
|
"namespacePrefix": null,
|
|||
|
|
"serverVersion": "59.0"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**失败示例**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 500,
|
|||
|
|
"msg": "列出元数据失败: 连接超时",
|
|||
|
|
"data": null
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**错误码**:
|
|||
|
|
- DESCRIBE_001:获取 Metadata 连接失败
|
|||
|
|
- DESCRIBE_002:描述元数据失败
|
|||
|
|
- DESCRIBE_008:未知错误
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 接口 2:列出元数据
|
|||
|
|
|
|||
|
|
**功能描述**:获取指定元数据类型(及文件夹)下的具体元数据成员列表。支持批量查询,Service 层会自动分批处理(每次最多 3 个查询)。
|
|||
|
|
|
|||
|
|
**请求方式**:POST
|
|||
|
|
|
|||
|
|
**请求路径**:`/salesforce/metadata/list`
|
|||
|
|
|
|||
|
|
**请求参数**:
|
|||
|
|
|
|||
|
|
| 参数名 | 类型 | 必填 | 说明 |
|
|||
|
|
|--------|------|------|------|
|
|||
|
|
| queries | Array | 是 | 查询列表(ListMetadataQuery[]),至少包含一个查询 |
|
|||
|
|
|
|||
|
|
**ListMetadataQuery 结构**:
|
|||
|
|
|
|||
|
|
| 参数名 | 类型 | 必填 | 说明 |
|
|||
|
|
|--------|------|------|------|
|
|||
|
|
| type | String | 是 | 元数据类型,如 "CustomObject", "ApexClass", "ApexTrigger" 等 |
|
|||
|
|
| folder | String | 否 | 文件夹名称,用于查询文件夹内的元数据(如文档、报表等) |
|
|||
|
|
|
|||
|
|
**响应参数**:
|
|||
|
|
|
|||
|
|
| 参数名 | 类型 | 说明 |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| code | Integer | 状态码(200 成功,其他失败) |
|
|||
|
|
| msg | String | 提示信息 |
|
|||
|
|
| data | Array | 列出元数据结果列表(ListMetadataResult[]) |
|
|||
|
|
|
|||
|
|
**ListMetadataResult 结构**:
|
|||
|
|
|
|||
|
|
| 参数名 | 类型 | 说明 |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| fullName | String | 完整名称 |
|
|||
|
|
| type | String | 类型 |
|
|||
|
|
| createdById | String | 创建者 ID |
|
|||
|
|
| createdByName | String | 创建者名称 |
|
|||
|
|
| createdDate | String | 创建日期(ISO 8601 格式) |
|
|||
|
|
| lastModifiedById | String | 最后修改者 ID |
|
|||
|
|
| lastModifiedByName | String | 最后修改者名称 |
|
|||
|
|
| lastModifiedDate | String | 最后修改日期(ISO 8601 格式) |
|
|||
|
|
| manageableState | String | 可管理状态 |
|
|||
|
|
|
|||
|
|
**成功示例**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 200,
|
|||
|
|
"msg": "操作成功",
|
|||
|
|
"data": [
|
|||
|
|
{
|
|||
|
|
"fullName": "Account",
|
|||
|
|
"type": "CustomObject",
|
|||
|
|
"createdById": "005xx000001X9YZAA0",
|
|||
|
|
"createdByName": "Admin User",
|
|||
|
|
"createdDate": "2023-01-15T08:30:00.000Z",
|
|||
|
|
"lastModifiedById": "005xx000001X9YZAA0",
|
|||
|
|
"lastModifiedByName": "Admin User",
|
|||
|
|
"lastModifiedDate": "2023-06-20T14:22:00.000Z",
|
|||
|
|
"manageableState": "unmanaged"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"fullName": "Contact",
|
|||
|
|
"type": "CustomObject",
|
|||
|
|
"createdById": "005xx000001X9YZAA0",
|
|||
|
|
"createdByName": "Admin User",
|
|||
|
|
"createdDate": "2023-01-15T08:35:00.000Z",
|
|||
|
|
"lastModifiedById": "005xx000001X9YZAA0",
|
|||
|
|
"lastModifiedByName": "Admin User",
|
|||
|
|
"lastModifiedDate": "2023-06-20T14:25:00.000Z",
|
|||
|
|
"manageableState": "unmanaged"
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**失败示例**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 500,
|
|||
|
|
"msg": "查询列表不能为空",
|
|||
|
|
"data": null
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**错误码**:
|
|||
|
|
- DESCRIBE_003:参数校验失败(查询列表为空、元数据类型为空等)
|
|||
|
|
- DESCRIBE_006:列出元数据失败
|
|||
|
|
- DESCRIBE_008:未知错误
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 接口 3:获取元数据查询历史
|
|||
|
|
|
|||
|
|
**功能描述**:查询元数据描述和列出操作的执行历史,支持按操作类型筛选和限制返回数量。
|
|||
|
|
|
|||
|
|
**请求方式**:GET
|
|||
|
|
|
|||
|
|
**请求路径**:`/salesforce/metadata/describe/history`
|
|||
|
|
|
|||
|
|
**请求参数**:
|
|||
|
|
|
|||
|
|
| 参数名 | 类型 | 必填 | 说明 |
|
|||
|
|
|--------|------|------|------|
|
|||
|
|
| operationType | String | 是 | 操作类型,可选值:"describe"(描述元数据)、"list"(列出元数据) |
|
|||
|
|
| limit | Integer | 否 | 返回数量限制,默认 10,最大 100 |
|
|||
|
|
|
|||
|
|
**响应参数**:
|
|||
|
|
|
|||
|
|
| 参数名 | 类型 | 说明 |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| code | Integer | 状态码(200 成功,其他失败) |
|
|||
|
|
| msg | String | 提示信息 |
|
|||
|
|
| data | Array | 查询历史列表(DataiMetadataDescribe[]) |
|
|||
|
|
|
|||
|
|
**DataiMetadataDescribe 结构**:
|
|||
|
|
|
|||
|
|
| 参数名 | 类型 | 说明 |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| id | Long | 记录 ID |
|
|||
|
|
| operationType | String | 操作类型(describe/list) |
|
|||
|
|
| queryContent | String | 查询内容(JSON 格式) |
|
|||
|
|
| resultCount | Integer | 结果数量 |
|
|||
|
|
| status | String | 状态(Success/Failed) |
|
|||
|
|
| errorMessage | String | 错误信息 |
|
|||
|
|
| serverVersion | String | 服务器版本 |
|
|||
|
|
| namespacePrefix | String | 命名空间前缀 |
|
|||
|
|
| metadataObjectCount | Integer | 元数据对象数量 |
|
|||
|
|
| queryTime | String | 查询时间(ISO 8601 格式) |
|
|||
|
|
| createTime | String | 创建时间(ISO 8601 格式) |
|
|||
|
|
|
|||
|
|
**成功示例**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 200,
|
|||
|
|
"msg": "操作成功",
|
|||
|
|
"data": [
|
|||
|
|
{
|
|||
|
|
"id": 1,
|
|||
|
|
"operationType": "describe",
|
|||
|
|
"queryContent": null,
|
|||
|
|
"resultCount": null,
|
|||
|
|
"status": "Success",
|
|||
|
|
"errorMessage": null,
|
|||
|
|
"serverVersion": "59.0",
|
|||
|
|
"namespacePrefix": null,
|
|||
|
|
"metadataObjectCount": 250,
|
|||
|
|
"queryTime": "2026-02-06T10:30:00.000+08:00",
|
|||
|
|
"createTime": "2026-02-06T10:30:00.000+08:00"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": 2,
|
|||
|
|
"operationType": "list",
|
|||
|
|
"queryContent": "[{\"type\":\"CustomObject\"}]",
|
|||
|
|
"resultCount": 50,
|
|||
|
|
"status": "Success",
|
|||
|
|
"errorMessage": null,
|
|||
|
|
"serverVersion": null,
|
|||
|
|
"namespacePrefix": null,
|
|||
|
|
"metadataObjectCount": null,
|
|||
|
|
"queryTime": "2026-02-06T10:35:00.000+08:00",
|
|||
|
|
"createTime": "2026-02-06T10:35:00.000+08:00"
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**失败示例**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 500,
|
|||
|
|
"msg": "无效的操作类型,必须是 describe 或 list",
|
|||
|
|
"data": null
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**错误码**:
|
|||
|
|
- DESCRIBE_003:参数校验失败(无效的操作类型)
|
|||
|
|
- DESCRIBE_008:未知错误
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 错误码列表
|
|||
|
|
|
|||
|
|
| 错误码 | 错误信息 | 说明 |
|
|||
|
|
|--------|----------|------|
|
|||
|
|
| DESCRIBE_001 | 获取 Metadata 连接失败 | 无法获取 Salesforce Metadata 连接,可能是认证失败或网络问题 |
|
|||
|
|
| DESCRIBE_002 | 描述元数据失败 | 调用 Salesforce describeMetadata API 失败 |
|
|||
|
|
| DESCRIBE_003 | 参数校验失败 | 请求参数不符合要求(如查询列表为空、元数据类型为空、无效的操作类型等) |
|
|||
|
|
| DESCRIBE_004 | 记录查询历史失败 | 写入数据库失败 |
|
|||
|
|
| DESCRIBE_005 | 获取查询历史失败 | 从数据库查询历史记录失败 |
|
|||
|
|
| DESCRIBE_006 | 列出元数据失败 | 调用 Salesforce listMetadata API 失败 |
|
|||
|
|
| DESCRIBE_007 | 记录列出元数据历史失败 | 写入数据库失败 |
|
|||
|
|
| DESCRIBE_008 | 未知错误 | 其他未预期的错误 |
|
|||
|
|
|
|||
|
|
## 使用示例
|
|||
|
|
|
|||
|
|
### 示例 1:描述元数据
|
|||
|
|
|
|||
|
|
**请求**:
|
|||
|
|
```bash
|
|||
|
|
curl -X GET "http://localhost:8080/salesforce/metadata/describe?apiVersion=59.0"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**响应**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 200,
|
|||
|
|
"msg": "操作成功",
|
|||
|
|
"data": {
|
|||
|
|
"metadataObjects": [
|
|||
|
|
{
|
|||
|
|
"xmlName": "CustomObject",
|
|||
|
|
"directoryName": "objects",
|
|||
|
|
"suffix": "object",
|
|||
|
|
"inFolder": false,
|
|||
|
|
"metaFile": false
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"serverVersion": "59.0"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 示例 2:列出元数据(单个查询)
|
|||
|
|
|
|||
|
|
**请求**:
|
|||
|
|
```bash
|
|||
|
|
curl -X POST "http://localhost:8080/salesforce/metadata/list" \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '[{"type": "CustomObject"}]'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**响应**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 200,
|
|||
|
|
"msg": "操作成功",
|
|||
|
|
"data": [
|
|||
|
|
{
|
|||
|
|
"fullName": "Account",
|
|||
|
|
"type": "CustomObject",
|
|||
|
|
"createdByName": "Admin User",
|
|||
|
|
"lastModifiedByName": "Admin User"
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 示例 3:列出元数据(多个查询,自动分批)
|
|||
|
|
|
|||
|
|
**请求**:
|
|||
|
|
```bash
|
|||
|
|
curl -X POST "http://localhost:8080/salesforce/metadata/list" \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '[
|
|||
|
|
{"type": "CustomObject"},
|
|||
|
|
{"type": "ApexClass"},
|
|||
|
|
{"type": "ApexTrigger"},
|
|||
|
|
{"type": "VisualforcePage"}
|
|||
|
|
]'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**说明**:虽然请求包含 4 个查询,但 Service 层会自动分批处理(每次最多 3 个),对调用方透明。
|
|||
|
|
|
|||
|
|
### 示例 4:获取查询历史
|
|||
|
|
|
|||
|
|
**请求**:
|
|||
|
|
```bash
|
|||
|
|
curl -X GET "http://localhost:8080/salesforce/metadata/describe/history?operationType=list&limit=5"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**响应**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 200,
|
|||
|
|
"msg": "操作成功",
|
|||
|
|
"data": [
|
|||
|
|
{
|
|||
|
|
"id": 1,
|
|||
|
|
"operationType": "list",
|
|||
|
|
"queryContent": "[{\"type\":\"CustomObject\"}]",
|
|||
|
|
"resultCount": 50,
|
|||
|
|
"status": "Success",
|
|||
|
|
"queryTime": "2026-02-06T10:30:00.000+08:00"
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 注意事项
|
|||
|
|
|
|||
|
|
1. **分批处理**:listMetadata 接口支持批量查询,但 Salesforce API 限制每次调用最多包含 3 个查询。Service 层会自动分批处理,对调用方透明。
|
|||
|
|
|
|||
|
|
2. **查询历史**:每次 describeMetadata 和 listMetadata 操作都会自动记录到数据库,包括操作类型、查询内容、结果数量、状态等信息。
|
|||
|
|
|
|||
|
|
3. **错误处理**:所有接口都遵循统一的错误处理规范,返回包含错误码和错误信息的 JSON 响应。
|
|||
|
|
|
|||
|
|
4. **性能考虑**:
|
|||
|
|
- describeMetadata 操作会返回大量元数据类型信息,建议在应用启动时缓存结果
|
|||
|
|
- listMetadata 操作涉及外部 API 调用,响应时间取决于查询的复杂度和数据量
|
|||
|
|
- 查询历史接口默认返回 10 条记录,最大支持 100 条
|
|||
|
|
|
|||
|
|
## 相关文档
|
|||
|
|
|
|||
|
|
- [需求文档](../requirements/sub/2026-01-28-003-08-描述和列出元数据.md)
|
|||
|
|
- [设计文档](../design/2026-02-03-003-08-描述和列出元数据-设计.md)
|
|||
|
|
- [决策记录](../decisions/2026-02-03-003-08-ADR-描述和列出元数据技术选型.md)
|
|||
|
|
- [变更日志](../changelog/2026-02-06-003-08-changelog.md)
|
|||
|
|
- [复盘文档](../retros/2026-02-06-003-08-retro.md)
|
|||
|
|
- [会话记录](../sessions/2026-02-03-003-08-session.md)
|