MCP + Cursor开发
# 使用 MCP API 文档进行二次开发详细指南
## 一、什么是 MCP API 文档
MCP (Model Context Protocol) 是一种协议,允许 AI 助手访问外部 API 文档资源。在您的项目中,已经配置了 Apifox 文档站点的 MCP 服务器,可以读取 OpenAPI 规范文档。
## 二、MCP 工具说明
您的项目中可用的 MCP 工具:
1. **`mcp_apifox-doc-site-5448103_read_project_oas_7vtrve`** - 读取 OpenAPI Spec 文件内容
2. **`mcp_apifox-doc-site-5448103_refresh_project_oas_7vtrve`** - 从服务器重新下载最新的 OpenAPI Spec 文件内容
## 三、详细开发步骤
### 步骤 1: 读取 API 文档
当您需要实现某个功能时,首先让我读取 API 文档:
**示例对话:**
```
您:根据API文档,实现组织管理下的告警信息接口
我:我会先读取API文档,然后根据文档生成代码
```
我会自动调用 MCP 工具读取最新的 API 文档。
### 步骤 2: 分析 API 文档结构
读取文档后,我会分析:
- **接口路径**:如 `/openapi/v0.9/manage/api/v1/organizations/{org_uuid}/manage-devices/hms`
- **HTTP 方法**:GET、POST、PUT、DELETE
- **请求参数**:路径参数、查询参数、请求体
- **响应结构**:响应数据格式、分页信息等
### 步骤 3: 创建实体类(Entity/DTO)
根据 API 文档中的 Schema 定义,创建对应的 Java 实体类:
**示例:HMS 告警信息实体**
```java
@Data
public class DjiHmsEvent {
private String id;
private String device_sn;
private String device_name;
private Integer event_type;
private String event_type_name;
// ... 其他字段
}
```
**位置:** `ilot-business/src/main/java/com/codeman/business/dji/domain/`
### 步骤 4: 创建请求 DTO
对于需要请求体的接口,创建对应的请求 DTO:
**示例:更新 HMS 已读时间请求**
```java
@Data
public class HmsReadTimeUpdateRequest {
private Long read_time;
}
```
**位置:** `ilot-business/src/main/java/com/codeman/business/dji/domain/dto/`
### 步骤 5: 在 Service 接口中定义方法
在对应的 Service 接口中添加方法定义:
**文件:** `IDjiOrganizationService.java`
```java
/**
* 获取组织设备HMS事件列表(告警信息)
*/
ResponseData<DjiHmsEvent> getHmsEvents(String orgUuid, Map<String, Object> params);
/**
* 更新组织设备HMS已读时间
*/
ResponseData<?> updateHmsReadTime(String orgUuid, HmsReadTimeUpdateRequest request);
```
### 步骤 6: 实现 Service 方法
在 Service 实现类中调用 `IDjiApiService` 进行 API 调用:
**文件:** `DjiOrganizationServiceImpl.java`
```java
@Override
public ResponseData<DjiHmsEvent> getHmsEvents(String orgUuid, Map<String, Object> params) {
String apiPath = MessageFormat.format("manage/api/v1/organizations/{0}/manage-devices/hms", orgUuid);
String resultStr = djiApiService.get(apiPath, params);
return JSONUtil.toBean(resultStr, new TypeReference<ResponseData<DjiHmsEvent>>() {}, false);
}
```
**关键点:**
- 使用 `MessageFormat.format()` 处理路径参数
- 使用 `djiApiService.get/post/put/delete()` 调用 API
- 使用 `JSONUtil.toBean()` 将响应转换为实体类
### 步骤 7: 在 Controller 中添加接口
在对应的 Controller 中暴露 RESTful 接口:
**文件:** `DjiOrganizationController.java`
```java
@ApiOperation("获取组织设备HMS事件列表(告警信息)")
@GetMapping("/manage-devices/hms")
public TableDataInfo getHmsEvents(@RequestParam(required = false) Map<String, Object> params) {
// 实现逻辑
}
```
**关键点:**
- 继承 `DjiBaseController` 获取公共配置(`djiOrgUuid`, `djiProjectUuid` 等)
- 使用 `startDjiPage()` 处理分页参数
- 使用 `getDataTable()` 返回分页数据
- 使用 `AjaxResult` 返回操作结果
### 步骤 8: 处理不同的响应结构
根据 API 返回的数据结构,选择合适的方式处理:
**列表接口(带分页):**
```java
ResponseData<DjiHmsEvent> responseData = service.getHmsEvents(orgUuid, params);
if (responseData.getCode() == 0 && responseData.getData() != null) {
List<DjiHmsEvent> list = responseData.getData().getList();
return getDataTable(list);
}
```
**详情接口(直接对象):**
```java
ResponseData<Organization> responseData = service.getOrganizationDetail(orgUuid);
if (responseData.getCode() == 0) {
Organization org = responseData.getDataObject(); // 使用 dataObject
return AjaxResult.success(org);
}
```
## 四、开发模式总结
### 模式 A:列表查询接口
```
1. 创建实体类 Entity
2. Service 返回 ResponseData<Entity>
3. Controller 使用 TableDataInfo 返回分页数据
```
### 模式 B:详情查询接口
```
1. 创建实体类 Entity
2. Service 返回 ResponseData<Entity>,数据在 dataObject 字段
3. Controller 使用 AjaxResult 返回单个对象
```
### 模式 C:创建/更新接口
```
1. 创建请求 DTO
2. Service 返回 ResponseData<?>
3. Controller 使用 AjaxResult 返回操作结果
```
## 五、最佳实践
### 1. 统一使用实体类
- ✅ 使用强类型实体类,不要使用 `Map<String, Object>`
- ✅ 提高代码可维护性和类型安全
### 2. 统一错误处理
```java
try {
// API 调用
} catch (Exception ex) {
logger.error("操作失败", ex);
return AjaxResult.error("操作失败:" + ex.getMessage());
}
```
### 3. 统一使用配置
- 从 `DjiBaseController` 继承获取 `djiOrgUuid`、`djiProjectUuid`
- 外部调用不需要传递这些参数
### 4. 统一分页处理
```java
if (params == null) {
params = new HashMap<>();
}
startDjiPage(params); // 自动处理 page 和 page_size
```
## 六、常见问题
### Q1: 如何知道 API 文档中有哪些接口?
**A:** 直接告诉我您要实现的功能,我会读取 API 文档并找到相关接口。
### Q2: 如何刷新 API 文档?
**A:** 我可以调用 `refresh_project_oas` 工具从服务器重新下载最新文档。
### Q3: 响应数据结构不确定怎么办?
**A:** 可以先查看 API 文档的 Schema 定义,或者提供实际的 JSON 响应示例,我会根据示例创建实体类。
### Q4: 如何处理嵌套对象?
**A:** 创建嵌套的实体类,如 `DjiDevice` 中包含 `DjiDeviceModel`。
## 七、开发流程示例
**完整示例:实现 HMS 告警信息接口**
1. **您提出需求:** "根据API文档,实现组织管理下的告警信息接口"
2. **我读取文档:** 自动调用 MCP 工具读取 API 文档
3. **我分析文档:** 找到相关接口:
- GET `/manage/api/v1/organizations/{org_uuid}/manage-devices/hms`
- PUT `/manage/api/v1/organizations/{org_uuid}/manage-devices/hms`
4. **我创建实体:**
- `DjiHmsEvent.java` - HMS 事件实体
- `HmsReadTimeUpdateRequest.java` - 更新请求 DTO
5. **我实现 Service:**
- `IDjiOrganizationService` 添加方法
- `DjiOrganizationServiceImpl` 实现方法
6. **我实现 Controller:**
- `DjiOrganizationController` 添加 RESTful 接口
7. **我检查代码:** 运行 linter 检查,确保没有错误
8. **完成:** 所有代码已生成并集成到项目中
## 八、快速开始
**现在就可以开始:**
1. 告诉我您要实现的功能,例如:
- "根据API文档,实现XXX功能"
- "实现XXX模块下的所有接口"
- "根据API文档,生成XXX的实体类和接口"
2. 我会自动:
- 读取 API 文档
- 分析接口结构
- 生成实体类和代码
- 实现 Service 和 Controller
3. 您只需要:
- 检查生成的代码
- 测试接口功能
- 根据实际响应调整实体类(如有需要)
---
**提示:** 如果您有实际的 JSON 响应示例,直接提供给我,我会根据示例创建更准确的实体类。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 秦叶知AI
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果
音乐天地