Files
happy-life-star/backend-single/API_BASE_URL_MODIFICATION_SUMMARY.md

7.4 KiB
Raw Permalink Blame History

API Base URL 字段调整总结

修改概述

AiConfig 实体类中的 apiBaseUrl 字段从"基础URL"调整为"完整的API URL",不再需要在调用时拼接任何后缀。

修改内容

1. 实体类和DTO修改

1.1 AiConfig.java

  • 文件路径: backend-single/src/main/java/com/emotion/entity/AiConfig.java
  • 修改内容: 更新 apiBaseUrl 字段注释
  • 修改前: API基础URL
  • 修改后: API完整URL(包含完整的接口路径,不需要再拼接任何后缀)例如:https://api.coze.cn/v3/chat

1.2 AiConfigCreateRequest.java

  • 文件路径: backend-single/src/main/java/com/emotion/dto/request/aiconfig/AiConfigCreateRequest.java
  • 修改内容: 更新 apiBaseUrl 字段注释和验证消息
  • 修改前: API基础URL / API基础URL不能为空
  • 修改后: API完整URL(包含完整的接口路径,不需要再拼接任何后缀) / API完整URL不能为空

1.3 AiConfigUpdateRequest.java

  • 文件路径: backend-single/src/main/java/com/emotion/dto/request/aiconfig/AiConfigUpdateRequest.java
  • 修改内容: 更新 apiBaseUrl 字段注释
  • 修改前: API基础URL
  • 修改后: API完整URL(包含完整的接口路径,不需要再拼接任何后缀)

1.4 AiConfigResponse.java

  • 文件路径: backend-single/src/main/java/com/emotion/dto/response/aiconfig/AiConfigResponse.java
  • 修改内容: 更新 apiBaseUrl 字段注释
  • 修改前: API基础URL
  • 修改后: API完整URL(包含完整的接口路径,不需要再拼接任何后缀)

2. 后端服务层修改

2.1 AiChatServiceImpl.java

  • 文件路径: backend-single/src/main/java/com/emotion/service/impl/AiChatServiceImpl.java
修改1: getApiPath方法
// 修改前
private String getApiPath(AiConfig config) {
    // 默认使用 /v3/chat 路径
    return "/v3/chat";
}

// 修改后
private String getApiPath(AiConfig config) {
    // apiBaseUrl已经是完整的URL,返回空字符串
    return "";
}
修改2: 新增extractBaseUrl方法
/**
 * 从apiBaseUrl中提取基础URL(用于状态查询和消息查询等辅助接口)
 * 例如:https://api.coze.cn/v3/chat -> https://api.coze.cn
 */
private String extractBaseUrl(String apiBaseUrl) {
    if (apiBaseUrl == null || apiBaseUrl.isEmpty()) {
        return "";
    }
    try {
        java.net.URL url = new java.net.URL(apiBaseUrl);
        return url.getProtocol() + "://" + url.getHost() + (url.getPort() > 0 ? ":" + url.getPort() : "");
    } catch (Exception e) {
        log.warn("解析apiBaseUrl失败: {}", apiBaseUrl, e);
        // 尝试简单截取
        int pathIndex = apiBaseUrl.indexOf("/", apiBaseUrl.indexOf("://") + 3);
        if (pathIndex > 0) {
            return apiBaseUrl.substring(0, pathIndex);
        }
        return apiBaseUrl;
    }
}
修改3: 状态查询URL构建
// 修改前
String statusUrl = config.getApiBaseUrl() + "/v3/chat/retrieve?chat_id=" + chatId + "&conversation_id=" + conversationId;

// 修改后
String baseUrl = extractBaseUrl(config.getApiBaseUrl());
String statusUrl = baseUrl + "/v3/chat/retrieve?chat_id=" + chatId + "&conversation_id=" + conversationId;
修改4: 消息查询URL构建
// 修改前
String messagesUrl = config.getApiBaseUrl() + "/v3/chat/message/list?chat_id=" + chatId + "&conversation_id=" + conversationId;

// 修改后
String baseUrl = extractBaseUrl(config.getApiBaseUrl());
String messagesUrl = baseUrl + "/v3/chat/message/list?chat_id=" + chatId + "&conversation_id=" + conversationId;

3. 前端修改

3.1 web-admin/src/views/aiconfig/AiConfigList.vue

修改1: 表单字段标签和提示
<!-- 修改前 -->
<el-form-item label="API基础URL" prop="apiBaseUrl">
  <el-input v-model="formData.apiBaseUrl" placeholder="请输入API基础URL" />
</el-form-item>

<!-- 修改后 -->
<el-form-item label="API完整URL" prop="apiBaseUrl">
  <el-input v-model="formData.apiBaseUrl" placeholder="请输入完整的API URL,如:https://api.coze.cn/v3/chat" />
</el-form-item>
修改2: 详情展示标签
<!-- 修改前 -->
<el-descriptions-item label="API基础URL">{{ viewData.apiBaseUrl }}</el-descriptions-item>

<!-- 修改后 -->
<el-descriptions-item label="API完整URL">{{ viewData.apiBaseUrl }}</el-descriptions-item>
修改3: 表单验证规则
// 修改前
apiBaseUrl: [{ required: true, message: '请输入API基础URL', trigger: 'blur' }]

// 修改后
apiBaseUrl: [{ required: true, message: '请输入完整的API URL', trigger: 'blur' }]
修改4: 测试功能URL构建
// 修改前
const initTestData = (config: AiConfig) => {
  testRequest.url = config.apiBaseUrl + '/v3/chat'
  // ...
}

// 修改后
const initTestData = (config: AiConfig) => {
  // apiBaseUrl已经是完整的API URL,直接使用
  testRequest.url = config.apiBaseUrl
  // ...
}

4. 单元测试

4.1 AiChatServiceImplTest.java

  • 文件路径: backend-single/src/test/java/com/emotion/service/AiChatServiceImplTest.java
  • 测试内容:
    1. testGetApiPath: 测试getApiPath方法返回空字符串
    2. testExtractBaseUrl: 测试extractBaseUrl方法提取基础URL
    3. testApiUrlConstruction: 测试完整API URL的构建逻辑
    4. testStatusQueryUrlConstruction: 测试状态查询URL的构建逻辑
    5. testMessageQueryUrlConstruction: 测试消息查询URL的构建逻辑
    6. testDifferentApiBaseUrlFormats: 测试不同格式的apiBaseUrl
    7. testEdgeCases: 测试边界情况

测试结果: 所有7个测试用例全部通过

影响范围

后端影响

  1. AiConfig实体类: 字段语义变更,但数据库字段名不变
  2. AiChatServiceImpl: API调用逻辑调整,不再拼接路径
  3. DTO类: 注释和验证消息更新

前端影响

  1. web-admin AI配置管理页面:
    • 表单标签和提示文本更新
    • 测试功能URL构建逻辑调整
    • 用户需要输入完整的API URL

数据库影响

  • 无需修改数据库: 字段名 api_base_url 保持不变
  • 数据迁移: 需要将现有数据从基础URL更新为完整URL
    • 例如: https://api.coze.cnhttps://api.coze.cn/v3/chat

使用示例

修改前

AiConfig config = new AiConfig();
config.setApiBaseUrl("https://api.coze.cn");  // 基础URL
// 调用时拼接: config.getApiBaseUrl() + "/v3/chat"

修改后

AiConfig config = new AiConfig();
config.setApiBaseUrl("https://api.coze.cn/v3/chat");  // 完整URL
// 调用时直接使用: config.getApiBaseUrl()

测试验证

后端测试

cd backend-single
mvn test -Dtest=AiChatServiceImplTest

测试结果:

  • Tests run: 7
  • Failures: 0
  • Errors: 0
  • Skipped: 0
  • 全部通过

前端测试

  1. 启动 web-admin 前端项目
  2. 进入 AI配置管理页面
  3. 点击"新增配置"或"编辑"按钮
  4. 在"API完整URL"字段输入完整的API地址(如:https://api.coze.cn/v3/chat
  5. 保存配置
  6. 点击"测试"按钮,验证接口调用是否成功

注意事项

  1. 数据迁移: 现有的AI配置数据需要更新,将基础URL改为完整URL
  2. 向后兼容: 如果有其他服务依赖旧的URL格式,需要同步更新
  3. 文档更新: 需要更新相关的API文档和使用说明
  4. 配置示例: 需要更新配置示例,明确说明应该填写完整的API URL

完成时间

2025-12-22

修改人员

System