Skip to main content
Glama
README.md7.51 kB
# Android 代码生成器 将 core 模块从 ShowDoc 获取的 API 数据自动转换为 Android 项目可用的代码。 ## 功能特性 - ✅ **Retrofit2 Service 接口生成** - 自动生成 Retrofit 接口定义 - ✅ **Android 实体类生成** - 自动生成 Kotlin Data Class - ✅ **OkHttp 配置生成** - 自动生成 OkHttp 和 Retrofit 配置代码 - ✅ **依赖配置生成** - 生成所需的 Gradle 依赖配置 ## 目录结构 ``` android_codegen/ ├── __init__.py # 模块初始化 ├── generator.py # 主生成器类 ├── retrofit_generator.py # Retrofit Service 生成器 ├── entity_generator.py # 实体类生成器 ├── okhttp_config.py # OkHttp 配置生成器 ├── test.py # 测试脚本(推荐使用) ├── README.md # 使用文档 └── README_测试.md # 测试说明文档 ``` ## 快速开始 ### 使用测试脚本(推荐) 最简单的方式是使用测试脚本: ```bash # 方式1: 在 android_codegen 目录内运行 cd android_codegen python test.py # 方式2: 从项目根目录运行 python -m android_codegen.test ``` 测试脚本会自动从 ShowDoc 获取数据并生成 Android 代码。详细说明请参考 [README_测试.md](README_测试.md)。 ### 编程方式使用 #### 基本使用 ```python from core import ShowDocClient from android_codegen import AndroidCodeGenerator # 1. 从 ShowDoc 获取 API 数据 # 方式1:使用密码自动登录(推荐,Cookie 会自动保存) client = ShowDocClient( base_url="https://doc.cqfengli.com/web/#/90/", password="123456" # 默认密码,可省略 ) # 方式2:使用 Cookie(如果已有保存的 Cookie,会自动复用) client = ShowDocClient( base_url="https://doc.cqfengli.com/web/#/90/", cookie="think_language=zh-CN; PHPSESSID=xxx" ) api_tree = client.get_all_apis(node_name="订单") # 2. 生成 Android 代码 generator = AndroidCodeGenerator( base_package="com.example.api", output_dir="android_output" ) # 3. 生成代码文件 generated_files = generator.generate(api_tree) print("生成的文件:") print(f" Service: {generated_files['services']}") print(f" Entities: {generated_files['entities']}") print(f" Config: {generated_files['config']}") ``` ### 生成的代码结构 生成的代码将保存在指定的输出目录中: ``` android_output/ ├── services/ │ └── ApiService.kt # Retrofit Service 接口 ├── entities/ │ ├── OrderResponse.kt # 订单响应实体类 │ ├── UserResponse.kt # 用户响应实体类 │ └── ... └── config/ ├── OkHttpConfig.kt # OkHttp 配置 └── dependencies.gradle.kts # Gradle 依赖配置 ``` ## 生成的代码示例 ### Retrofit Service 接口 ```kotlin package com.example.api.services import retrofit2.http.* import retrofit2.Response import com.example.api.entities.* interface ApiService { /** * 获取订单列表 * API: GET /api/orders */ @GET("/api/orders") suspend fun getOrders( @Query("page") page: Int?, @Query("size") size: Int? ): Response<OrderListResponse> } ``` ### Android 实体类 ```kotlin package com.example.api.entities import android.os.Parcelable import kotlinx.parcelize.Parcelize @Parcelize data class OrderResponse( var order_id: String, var user_id: String, var amount: Double, var status: Int? ) : Parcelable ``` **注意**: - 所有实体类都使用 `@Parcelize` 注解和 `Parcelable` 接口,方便在 Activity/Fragment 间传递 - 字段名保持与服务器一致,不使用 `@SerializedName` 注解 - 需要在 `build.gradle.kts` 中添加 `id("kotlin-parcelize")` 插件 ### OkHttp 配置 ```kotlin package com.example.api.config object OkHttpConfig { private const val BASE_URL = "https://api.example.com" fun createApiService(): ApiService { return Retrofit.Builder() .baseUrl(BASE_URL) .client(createOkHttpClient()) .addConverterFactory(GsonConverterFactory.create()) .build() .create(ApiService::class.java) } } ``` ## 配置选项 ### AndroidCodeGenerator 参数 - `base_package` (str): Android 项目的基础包名,默认为 `"com.example.api"` - `output_dir` (str): 输出目录,默认为 `"android_output"` ### 筛选分类 ```python # 生成特定分类的代码 generated_files = generator.generate( api_tree, category_filter="订单" # 只生成"订单"分类下的 API ) ``` ## 集成到 Android 项目 ### 1. 添加依赖和插件 在 `build.gradle.kts` 的 `plugins` 块中添加 Parcelize 插件: ```kotlin plugins { // ... 其他插件 id("kotlin-parcelize") } ``` 将生成的 `dependencies.gradle.kts` 中的依赖添加到你的 `build.gradle.kts`: ```kotlin dependencies { // Retrofit implementation("com.squareup.retrofit2:retrofit:2.9.0") implementation("com.squareup.retrofit2:converter-gson:2.9.0") // OkHttp implementation("com.squareup.okhttp3:okhttp:4.11.0") implementation("com.squareup.okhttp3:logging-interceptor:4.11.0") // Gson implementation("com.google.code.gson:gson:2.10.1") } ``` ### 2. 复制生成的代码 将生成的文件复制到你的 Android 项目中: - `services/ApiService.kt` → `app/src/main/java/com/example/api/services/` - `entities/*.kt` → `app/src/main/java/com/example/api/entities/` - `config/OkHttpConfig.kt` → `app/src/main/java/com/example/api/config/` ### 3. 使用生成的代码 ```kotlin // 在 Repository 或 ViewModel 中使用 class OrderRepository { private val apiService = OkHttpConfig.createApiService() suspend fun getOrders(): Result<OrderListResponse> { return try { val response = apiService.getOrders(page = 1, size = 20) if (response.isSuccessful) { Result.success(response.body()!!) } else { Result.failure(Exception("请求失败")) } } catch (e: Exception) { Result.failure(e) } } } ``` ## 注意事项 1. **类型推断限制**: 当前版本的类型推断较为简单,可能需要手动调整生成的实体类 2. **API 路径参数**: 路径参数(如 `/api/users/{id}`)会自动转换为 `@Path` 注解 3. **请求体类型**: 复杂请求体可能需要手动定义对应的 Data Class 4. **响应包装**: 所有响应都使用 `ResponseData<T>` 统一包装格式(`{code, msg, data, hasNext}`) 5. **Parcelize 插件**: 生成的实体类都使用 `@Parcelize` 和 `Parcelable`,需要在 `build.gradle.kts` 中添加 `id("kotlin-parcelize")` 插件 6. **字段命名**: 实体类字段名保持与服务器一致,不进行转换,也不使用 `@SerializedName` 注解 ## 为 MCP 化做准备 本模块设计时已考虑 MCP(Model Context Protocol)集成: - 模块化设计,易于作为 MCP 工具暴露 - 输入输出清晰,符合 MCP 工具规范 - 可扩展性强,方便添加新的代码生成功能 ## 后续改进计划 - [ ] 支持自定义代码模板 - [ ] 支持多种 JSON 解析库(Gson、Moshi、Kotlinx Serialization) - [ ] 支持响应包装类型自动识别 - [ ] 支持请求拦截器自动生成 - [ ] 支持多环境配置(开发、测试、生产) - [ ] 生成单元测试代码模板

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/yfcyfc123234/showdoc_mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server