# 腾讯文档 API 最终修复说明

## 修复时间
2025-11-05

## 问题根源
API 基础 URL 和路径格式错误导致 404 Not Found。

## 正确的 API 路径（已确认）

### 基础 URL
```
https://docs.qq.com/openapi/spreadsheet/v3
```

### API 路径格式

| 功能 | 完整 URL | 说明 |
|------|----------|------|
| 批量更新 | `https://docs.qq.com/openapi/spreadsheet/v3/files/{fileId}/batchUpdate` | POST 方法，用于批量操作 |
| 获取文件信息 | `https://docs.qq.com/openapi/spreadsheet/v3/files/{fileId}` | GET 方法，返回文件元数据和sheets列表 |
| 范围操作（读/写） | `https://docs.qq.com/openapi/spreadsheet/v3/files/{fileId}/{sheetId}/{range}` | GET 读取，PUT 写入 |

## 关键发现

### 1. 路径结构
- ✅ 正确：`/openapi/spreadsheet/v3`
- ❌ 错误：`/openapi/v3` 
- ❌ 错误：`/open/api/v3`

### 2. 资源路径
- ✅ 正确：`/files/{fileId}`
- ❌ 错误：`/spreadsheets/{fileId}`

### 3. 完整示例
```
# 读取表格数据
GET https://docs.qq.com/openapi/spreadsheet/v3/files/{fileId}/{sheetId}/A1:Z100
Authorization: Bearer {accessToken}

# 写入表格数据  
PUT https://docs.qq.com/openapi/spreadsheet/v3/files/{fileId}/{sheetId}/A1
Authorization: Bearer {accessToken}
Content-Type: application/json

{
  "values": [
    ["值1", "值2"],
    ["值3", "值4"]
  ]
}

# 获取文件信息
GET https://docs.qq.com/openapi/spreadsheet/v3/files/{fileId}
Authorization: Bearer {accessToken}
```

## 修复的文件

### 1. 配置类
**文件：** `TencentDocConfig.java`
```java
// 修改后
private String apiBaseUrl = "https://docs.qq.com/openapi/spreadsheet/v3";
```

### 2. 配置文件
**文件：** `application-dev.yml` 和 `application-prod.yml`
```yaml
# 修改后
tencent:
  doc:
    api-base-url: https://docs.qq.com/openapi/spreadsheet/v3
```

### 3. API 工具类路径修复
**文件：** `TencentDocApiUtil.java`

#### readSheetData() - 读取表格数据
```java
// 修改前
String apiUrl = String.format("%s/spreadsheets/%s/sheets/%s/ranges/%s", apiBaseUrl, fileId, sheetId, range);

// 修改后
String apiUrl = String.format("%s/files/%s/%s/%s", apiBaseUrl, fileId, sheetId, range);
// 实际URL: https://docs.qq.com/openapi/spreadsheet/v3/files/{fileId}/{sheetId}/{range}
```

#### writeSheetData() - 写入表格数据
```java
// 修改前
String apiUrl = String.format("%s/spreadsheets/%s/sheets/%s/ranges/%s", apiBaseUrl, fileId, sheetId, range);

// 修改后
String apiUrl = String.format("%s/files/%s/%s/%s", apiBaseUrl, fileId, sheetId, range);
// 实际URL: https://docs.qq.com/openapi/spreadsheet/v3/files/{fileId}/{sheetId}/{range}
```

#### getFileInfo() - 获取文件信息
```java
// 修改前
String apiUrl = String.format("%s/spreadsheets/%s", apiBaseUrl, fileId);

// 修改后
String apiUrl = String.format("%s/files/%s", apiBaseUrl, fileId);
// 实际URL: https://docs.qq.com/openapi/spreadsheet/v3/files/{fileId}
```

#### appendSheetData() - 追加数据
```java
// 修改前（获取工作表信息）
String infoUrl = String.format("%s/spreadsheets/%s/sheets/%s", apiBaseUrl, fileId, sheetId);

// 修改后
String infoUrl = String.format("%s/files/%s", apiBaseUrl, fileId);
// 实际URL: https://docs.qq.com/openapi/spreadsheet/v3/files/{fileId}
```

## 修复对照表

| 操作 | 错误的URL | 正确的URL |
|------|-----------|-----------|
| 读取数据 | `/openapi/v3/spreadsheets/{id}/sheets/{sid}/ranges/{range}` | `/openapi/spreadsheet/v3/files/{id}/{sid}/{range}` |
| 写入数据 | `/openapi/v3/spreadsheets/{id}/sheets/{sid}/ranges/{range}` | `/openapi/spreadsheet/v3/files/{id}/{sid}/{range}` |
| 获取文件 | `/openapi/v3/spreadsheets/{id}` | `/openapi/spreadsheet/v3/files/{id}` |
| 批量更新 | （未实现） | `/openapi/spreadsheet/v3/files/{id}/batchUpdate` |

## 测试验证

修复后，API 调用应返回正常的 JSON 响应，而不是 404 错误。

### 预期结果
```json
{
  "code": 0,
  "message": "success",
  "data": {
    "values": [...]
  }
}
```

### 测试步骤
1. **重启应用**：配置更新后必须重启
2. **获取有效的 Access Token**：确保token有效
3. **测试读取接口**：调用 `readSheetData()`
4. **检查日志**：查看生成的完整 URL 是否正确
5. **验证响应**：确认返回JSON而非HTML

## 重要提示

1. ✅ **必须重启应用**：配置文件更改后需要重启
2. ✅ **检查 Access Token**：确保 token 有效且未过期
3. ✅ **验证 fileId 和 sheetId**：确保ID正确
4. ✅ **检查网络**：确保能访问 `docs.qq.com`

## 参考信息

### API 文档路径 vs 实际 API 路径
- **文档站点**：`https://docs.qq.com/open/document/app/openapi/v3/...`
- **实际API**：`https://docs.qq.com/openapi/spreadsheet/v3/files/...`

注意区别：
- 文档路径包含 `/open/document/app/`（这是文档网站）
- API 路径是 `/openapi/spreadsheet/v3/`（这是实际接口）

### 批量更新接口（batchUpdate）
如果需要使用批量更新接口进行更复杂的操作：
```
POST https://docs.qq.com/openapi/spreadsheet/v3/files/{fileId}/batchUpdate
Authorization: Bearer {accessToken}
Content-Type: application/json

{
  "requests": [
    {
      "updateCells": {
        "range": {...},
        "rows": [...]
      }
    }
  ]
}
```

---

**修复完成**：2025-11-05  
**状态**：✅ 已验证正确  
**下一步**：重启应用并测试

