datai/docs/archive/api-docs/2026-01-27-014-4-api.md

665 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# API 文档
## 元数据
- 需求编号014-4
- 创建时间2026-01-27
- 创建人SSOT 架构师
- 状态:已完成
## API 概述
本 API 提供了元数据容器与原子性部署功能,基于 Salesforce Tooling API 的 MetadataContainer 机制,支持元数据容器生命周期管理、容器成员管理、异步部署请求和状态轮询与结果解析。
### 核心功能
1. **元数据容器生命周期管理**:创建容器、删除容器、查询容器、获取容器详情
2. **容器成员管理**:添加成员到容器,支持多种元数据类型
3. **异步部署请求**:创建部署请求,支持 CheckOnly 模式和测试执行
4. **状态轮询与结果解析**:查询部署状态、轮询部署状态、获取部署详情、解析编译错误、解析测试结果
### 技术栈
- Spring Boot 3.5.7
- 若依框架
- Salesforce WSC 0.0.1
### 基础路径
- 元数据容器管理:`/tooling/metadata-container`
- 部署管理:`/tooling/deployment`
### 统一响应格式
所有 API 接口均返回统一的响应格式:
```json
{
"code": 200,
"msg": "操作成功",
"data": {}
}
```
| 字段名 | 类型 | 说明 |
|--------|------|------|
| code | Integer | 状态码200 成功,其他失败) |
| msg | String | 提示信息 |
| data | Object | 返回数据 |
## 接口列表
### 1. 创建容器接口
#### 功能描述
创建一个新的元数据容器,用于存放待部署的元数据成员。
#### 请求方式
POST
#### 请求路径
`/tooling/metadata-container/create`
#### 请求权限
`tooling:container:create`
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| name | String | 是 | 容器名称,长度 1-255 字符 |
#### 请求示例
```json
{
"name": "MyContainer"
}
```
#### 响应参数
| 参数名 | 类型 | 说明 |
|--------|------|------|
| id | String | 容器 ID |
| name | String | 容器名称 |
| createdDate | String | 创建时间 |
| lastModifiedDate | String | 最后修改时间 |
#### 成功示例
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"id": "a0B5g000006l7VFEAY",
"name": "MyContainer",
"createdDate": "2026-01-27T10:00:00.000Z",
"lastModifiedDate": "2026-01-27T10:00:00.000Z"
}
}
```
#### 错误码
- 500容器名称冲突
- 501创建容器失败
---
### 2. 删除容器接口
#### 功能描述
删除指定的元数据容器及其所有成员。
#### 请求方式
DELETE
#### 请求路径
`/tooling/metadata-container/delete/{id}`
#### 请求权限
`tooling:container:delete`
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | String | 是 | 容器 ID路径参数 |
#### 请求示例
```
DELETE /tooling/metadata-container/delete/a0B5g000006l7VFEAY
```
#### 响应参数
#### 成功示例
```json
{
"code": 200,
"msg": "操作成功"
}
```
#### 错误码
- 500删除容器失败
- 501容器不存在
---
### 3. 获取容器详情接口
#### 功能描述
获取指定容器的详细信息。
#### 请求方式
GET
#### 请求路径
`/tooling/metadata-container/get/{id}`
#### 请求权限
`tooling:container:query`
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | String | 是 | 容器 ID路径参数 |
#### 请求示例
```
GET /tooling/metadata-container/get/a0B5g000006l7VFEAY
```
#### 响应参数
| 参数名 | 类型 | 说明 |
|--------|------|------|
| id | String | 容器 ID |
| name | String | 容器名称 |
| createdDate | String | 创建时间 |
| lastModifiedDate | String | 最后修改时间 |
#### 成功示例
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"id": "a0B5g000006l7VFEAY",
"name": "MyContainer",
"createdDate": "2026-01-27T10:00:00.000Z",
"lastModifiedDate": "2026-01-27T10:00:00.000Z"
}
}
```
#### 错误码
- 500查询容器失败
- 501容器不存在
---
### 4. 查询容器列表接口
#### 功能描述
查询符合条件的容器列表。
#### 请求方式
GET
#### 请求路径
`/tooling/metadata-container/list`
#### 请求权限
`tooling:container:query`
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| name | String | 否 | 容器名称(模糊查询) |
#### 请求示例
```
GET /tooling/metadata-container/list?name=MyContainer
```
#### 响应参数
| 参数名 | 类型 | 说明 |
|--------|------|------|
| id | String | 容器 ID |
| name | String | 容器名称 |
| createdDate | String | 创建时间 |
| lastModifiedDate | String | 最后修改时间 |
#### 成功示例
```json
{
"code": 200,
"msg": "操作成功",
"data": [
{
"id": "a0B5g000006l7VFEAY",
"name": "MyContainer",
"createdDate": "2026-01-27T10:00:00.000Z",
"lastModifiedDate": "2026-01-27T10:00:00.000Z"
}
]
}
```
#### 错误码
- 500查询容器列表失败
---
### 5. 添加成员接口
#### 功能描述
向指定容器添加一个元数据成员。
#### 请求方式
POST
#### 请求路径
`/tooling/deployment/member/add`
#### 请求权限
`tooling:deployment:addMember`
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| containerId | String | 是 | 容器 ID |
| metadataType | String | 是 | 元数据类型ApexClass、ApexTrigger、ApexPage 等) |
| contentEntityId | String | 否 | 内容实体 ID可选 |
| body | String | 是 | 代码内容 |
#### 请求示例
```json
{
"containerId": "a0B5g000006l7VFEAY",
"metadataType": "ApexClass",
"body": "public class MyClass {\n public void myMethod() {\n System.debug('Hello World');\n }\n}"
}
```
#### 响应参数
| 参数名 | 类型 | 说明 |
|--------|------|------|
| id | String | 成员 ID |
| containerId | String | 容器 ID |
| metadataType | String | 元数据类型 |
| contentEntityId | String | 内容实体 ID |
| body | String | 代码内容 |
| createdDate | String | 创建时间 |
| lastModifiedDate | String | 最后修改时间 |
#### 成功示例
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"id": "a0C5g000006l7VFEAY",
"containerId": "a0B5g000006l7VFEAY",
"metadataType": "ApexClass",
"contentEntityId": null,
"body": "public class MyClass {\n public void myMethod() {\n System.debug('Hello World');\n }\n}",
"createdDate": "2026-01-27T10:00:00.000Z",
"lastModifiedDate": "2026-01-27T10:00:00.000Z"
}
}
```
#### 错误码
- 500添加成员失败
- 501容器不存在
---
### 6. 部署容器接口
#### 功能描述
触发指定容器的部署,支持 CheckOnly 模式和测试执行。
#### 请求方式
POST
#### 请求路径
`/tooling/deployment/deploy`
#### 请求权限
`tooling:deployment:deploy`
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| containerId | String | 是 | 容器 ID |
| isCheckOnly | Boolean | 是 | 是否仅检查true仅检查不部署false实际部署 |
| isRunTests | Boolean | 是 | 是否运行测试true运行测试false不运行测试 |
#### 请求示例
```json
{
"containerId": "a0B5g000006l7VFEAY",
"isCheckOnly": false,
"isRunTests": true
}
```
#### 响应参数
| 参数名 | 类型 | 说明 |
|--------|------|------|
| id | String | 请求 ID |
| state | String | 部署状态Queued、InProgress、Completed、Failed |
| metadataContainerId | String | 容器 ID |
| isCheckOnly | Boolean | 是否仅检查 |
| isRunTests | Boolean | 是否运行测试 |
| createdDate | String | 创建时间 |
| lastModifiedDate | String | 最后修改时间 |
#### 成功示例
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"id": "1DR5g000006l7VFEAY",
"state": "Queued",
"metadataContainerId": "a0B5g000006l7VFEAY",
"isCheckOnly": false,
"isRunTests": true,
"createdDate": "2026-01-27T10:00:00.000Z",
"lastModifiedDate": "2026-01-27T10:00:00.000Z"
}
}
```
#### 错误码
- 500部署失败
- 501容器不存在
- 502容器为空没有成员
- 503并发部署限制
---
### 7. 查询部署状态接口
#### 功能描述
查询指定部署请求的状态。
#### 请求方式
POST
#### 请求路径
`/tooling/deployment/status/check`
#### 请求权限
`tooling:deployment:query`
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| requestId | String | 是 | 请求 ID |
#### 请求示例
```json
{
"requestId": "1DR5g000006l7VFEAY"
}
```
#### 响应参数
| 参数名 | 类型 | 说明 |
|--------|------|------|
| requestId | String | 请求 ID |
| state | String | 部署状态Queued、InProgress、Completed、Failed |
| metadataContainerId | String | 容器 ID |
| isCheckOnly | Boolean | 是否仅检查 |
| isRunTests | Boolean | 是否运行测试 |
| createdDate | String | 创建时间 |
| lastModifiedDate | String | 最后修改时间 |
#### 成功示例
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"requestId": "1DR5g000006l7VFEAY",
"state": "Completed",
"metadataContainerId": "a0B5g000006l7VFEAY",
"isCheckOnly": false,
"isRunTests": true,
"createdDate": "2026-01-27T10:00:00.000Z",
"lastModifiedDate": "2026-01-27T10:00:00.000Z"
}
}
```
#### 错误码
- 500查询状态失败
- 501请求不存在
---
### 8. 轮询部署状态接口
#### 功能描述
轮询指定部署请求的状态,直到完成或超时。
#### 请求方式
POST
#### 请求路径
`/tooling/deployment/status/poll`
#### 请求权限
`tooling:deployment:query`
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| requestId | String | 是 | 请求 ID |
| maxRetries | Integer | 否 | 最大重试次数(默认 60 |
| intervalMillis | Long | 否 | 轮询间隔(毫秒,默认 1000 |
#### 请求示例
```
POST /tooling/deployment/status/poll?requestId=1DR5g000006l7VFEAY&maxRetries=60&intervalMillis=1000
```
#### 响应参数
| 参数名 | 类型 | 说明 |
|--------|------|------|
| requestId | String | 请求 ID |
| state | String | 部署状态Queued、InProgress、Completed、Failed |
| metadataContainerId | String | 容器 ID |
| isCheckOnly | Boolean | 是否仅检查 |
| isRunTests | Boolean | 是否运行测试 |
| createdDate | String | 创建时间 |
| lastModifiedDate | String | 最后修改时间 |
#### 成功示例
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"requestId": "1DR5g000006l7VFEAY",
"state": "Completed",
"metadataContainerId": "a0B5g000006l7VFEAY",
"isCheckOnly": false,
"isRunTests": true,
"createdDate": "2026-01-27T10:00:00.000Z",
"lastModifiedDate": "2026-01-27T10:00:00.000Z"
}
}
```
#### 错误码
- 500轮询状态失败
- 501请求不存在
- 502轮询超时
---
### 9. 获取部署详情接口
#### 功能描述
获取指定部署请求的详细信息,包括编译错误和测试结果。
#### 请求方式
POST
#### 请求路径
`/tooling/deployment/details/get`
#### 请求权限
`tooling:deployment:query`
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| requestId | String | 是 | 请求 ID |
#### 请求示例
```json
{
"requestId": "1DR5g000006l7VFEAY"
}
```
#### 响应参数
| 参数名 | 类型 | 说明 |
|--------|------|------|
| requestId | String | 请求 ID |
| state | String | 部署状态Queued、InProgress、Completed、Failed |
| metadataContainerId | String | 容器 ID |
| isCheckOnly | Boolean | 是否仅检查 |
| isRunTests | Boolean | 是否运行测试 |
| createdDate | String | 创建时间 |
| lastModifiedDate | String | 最后修改时间 |
| componentFailures | Array | 编译错误列表 |
| runTestResult | Object | 测试结果 |
#### 成功示例
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"requestId": "1DR5g000006l7VFEAY",
"state": "Completed",
"metadataContainerId": "a0B5g000006l7VFEAY",
"isCheckOnly": false,
"isRunTests": true,
"createdDate": "2026-01-27T10:00:00.000Z",
"lastModifiedDate": "2026-01-27T10:00:00.000Z",
"componentFailures": [],
"runTestResult": {
"numFailures": 0,
"numTestsRun": 1,
"totalTime": 123
}
}
}
```
#### 错误码
- 500获取详情失败
- 501请求不存在
---
### 10. 获取部署结果接口
#### 功能描述
获取指定部署请求的部署结果,包括编译错误和测试结果。
#### 请求方式
GET
#### 请求路径
`/tooling/deployment/result/{requestId}`
#### 请求权限
`tooling:deployment:query`
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| requestId | String | 是 | 请求 ID路径参数 |
#### 请求示例
```
GET /tooling/deployment/result/1DR5g000006l7VFEAY
```
#### 响应参数
| 参数名 | 类型 | 说明 |
|--------|------|------|
| requestId | String | 请求 ID |
| state | String | 部署状态Queued、InProgress、Completed、Failed |
| metadataContainerId | String | 容器 ID |
| isCheckOnly | Boolean | 是否仅检查 |
| isRunTests | Boolean | 是否运行测试 |
| createdDate | String | 创建时间 |
| lastModifiedDate | String | 最后修改时间 |
| componentFailures | Array | 编译错误列表 |
| runTestResult | Object | 测试结果 |
#### 成功示例
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"requestId": "1DR5g000006l7VFEAY",
"state": "Completed",
"metadataContainerId": "a0B5g000006l7VFEAY",
"isCheckOnly": false,
"isRunTests": true,
"createdDate": "2026-01-27T10:00:00.000Z",
"lastModifiedDate": "2026-01-27T10:00:00.000Z",
"componentFailures": [],
"runTestResult": {
"numFailures": 0,
"numTestsRun": 1,
"totalTime": 123
}
}
}
```
#### 错误码
- 500获取结果失败
- 501请求不存在
---
## 错误码
### 通用错误码
| 错误码 | 说明 |
|--------|------|
| 200 | 操作成功 |
| 500 | 操作失败 |
| 501 | 资源不存在 |
### 元数据容器错误码
| 错误码 | 说明 |
|--------|------|
| 500 | 创建容器失败 |
| 501 | 容器不存在 |
| 502 | 容器名称冲突 |
### 部署错误码
| 错误码 | 说明 |
|--------|------|
| 500 | 部署失败 |
| 501 | 请求不存在 |
| 502 | 容器为空(没有成员) |
| 503 | 并发部署限制 |
| 504 | 轮询超时 |
---
## 相关文档
- [需求文档](../requirements/REQ-014-4.md)
- [设计文档](../design/2026-01-27-014-4-元数据容器与原子性部署-设计.md)
- [决策记录](../decisions/adr/2026-01-27-014-4-ADR-元数据容器与原子性部署技术选型.md)
- [提示词](../prompts/2026-01-27-014-4-prompt-元数据容器与原子性部署.md)