# 浏览 Catalog、数据库、卷和表

返回当前工作区中可访问的 Catalog、数据库、卷和表的层级导航数据。

```text
POST https://moi.matrixorigin.cn/newmoi/catalog/tree
```

## 调用前准备

准备有目标工作区访问权限的个人访问令牌和目标工作区 ID。

下方示例使用：

- `$AI_STUDIO_API_KEY`：实际个人访问令牌，通过 `X-API-Key` Header 传递。
- `$WORKSPACE_ID`：目标工作区 ID，通过 `X-Workspace-ID` Header 传递。

## 请求体

| 参数 | 类型 | 是否必填 | 说明 |
| --- | --- | --- | --- |
| `include_table_leaves` | boolean | 否 | 是否在树中包含表叶子节点。 |

## 请求示例

```bash
curl -X POST "https://moi.matrixorigin.cn/newmoi/catalog/tree" \
  -H "X-API-Key: $AI_STUDIO_API_KEY" \
  -H "X-Workspace-ID: $WORKSPACE_ID" \
  -H 'Content-Type: application/json' \
  -d '{
    "include_table_leaves": true
  }'
```

## 成功响应

成功时返回 `200`。结果仅包含当前身份可读取的节点。

```json
{
  "code": "OK",
  "msg": "OK",
  "data": {
    "tree": [
      {
        "id": "1",
        "type": "catalog",
        "name": "sales",
        "display_name": "sales",
        "description": "销售数据",
        "reserved": false,
        "node_list": [
          {
            "id": "2",
            "type": "database",
            "name": "orders",
            "description": "",
            "reserved": false,
            "node_list": []
          }
        ],
        "allowed_actions": ["catalog.read"]
      }
    ]
  }
}
```

响应字段如下。

本文中，类型后的 `[]` 表示数组，例如 `string[]` 是字符串数组；字段路径中的 `[]` 表示数组中的每一项，例如 `data.tree[].id` 表示 `data.tree` 数组中每一项的 `id` 字段。

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | string | 成功时为 `OK`。 |
| `msg` | string | 成功时为 `OK`。 |
| `data.tree` | object（对象数组） | 根节点列表；没有可读资源时为空数组。 |
| `data.tree[].id` | string | 节点 ID。 |
| `data.tree[].type` | string | 节点类型：`catalog`、`database`、`volume` 或 `table`。 |
| `data.tree[].name` | string | 节点名称。 |
| `data.tree[].display_name` | string | 节点显示名称；有值时返回。 |
| `data.tree[].description` | string | 节点说明。 |
| `data.tree[].display_description` | string | 节点显示说明；有值时返回。 |
| `data.tree[].reserved` | boolean | 是否为保留节点。 |
| `data.tree[].is_pub` | boolean | 是否为发布节点；适用时返回。 |
| `data.tree[].is_sub` | boolean | 是否为订阅节点；适用时返回。 |
| `data.tree[].node_list` | object（对象数组） | 子节点，字段与父节点相同。 |
| `data.tree[].allowed_actions` | string（字符串数组） | 当前身份对该节点可执行的操作。 |
| `data.tree[].has_workflow_target_ref` | boolean | 是否被工作流作为目标引用；有值时返回。 |
| `data.tree[].trigger_binding` | object | 卷与工作流触发器的绑定信息；有值时返回。 |
| `data.tree[].trigger_binding.bound` | boolean | 是否存在触发器绑定。 |
| `data.tree[].trigger_binding.trigger_id` | integer | 触发器 ID。 |
| `data.tree[].trigger_binding.workflow_id` | string | 关联工作流 ID。 |
| `data.tree[].trigger_binding.workflow_name` | string | 关联工作流名称。 |
| `data.tree[].trigger_binding.workflow_version_id` | string | 关联工作流版本 ID。 |

## 错误响应

```json
{
  "code": "ErrParamInvalid",
  "msg": "请求参数无效",
  "data": null
}
```

### 常见 HTTP 错误

```{list-table}
:header-rows: 1
:widths: 12 22 32 34

* - HTTP 状态码
  - 错误代码
  - 常见原因
  - 建议操作
* - `400`
  - `ErrParamInvalid`
  - 请求体不是有效 JSON。
  - 检查请求 JSON。
* - `401`
  - `ErrUnauthorized`
  - 缺少或无效的访问凭据。
  - 检查 API Key 和工作区 Header。
* - `500`
  - `ErrServer`
  - 服务端未能读取目录树。
  - 稍后重试。
```

## 后续操作

完成后可返回[查询文件产物](list-file-artifacts.md)。
