diff --git a/Android-kotlin-Code/docs/API字段说明.md b/Android-kotlin-Code/docs/API字段说明.md new file mode 100644 index 0000000..9b4aedf --- /dev/null +++ b/Android-kotlin-Code/docs/API字段说明.md @@ -0,0 +1,74 @@ +# UUVPN API 字段类型说明 + +## 问题背景 + +在对接 Xboard 后端 API 时,发现部分字段在不同接口返回的类型不一致,需要在客户端代码中做兼容处理。 + +--- + +## 字段类型不一致问题 + +### `sell` 字段 + +| 接口 | 返回类型 | 示例值 | +|------|---------|--------| +| `/api/v1/user/getSubscribe` | `Int` | `"sell": 1` | +| `/api/v1/user/plan/fetch` | `Boolean` | `"sell": true` | + +**解决方案:** + +在 `PlanData` 数据类中: +- 字段类型定义为 `Any?` +- 添加辅助属性 `isSell` 进行类型转换 + +```kotlin +@SerializedName("sell") val sell : Any? + +// 辅助属性:将 sell 转换为布尔值(兼容整数和布尔类型) +val isSell: Boolean + get() = when (sell) { + is Boolean -> sell as Boolean + is Number -> (sell as Number).toInt() != 0 + null -> false + else -> false + } +``` + +--- + +## 其他注意事项 + +### `PlanData` 字段 + +为确保 JSON 解析稳定性,以下字段定义为可空类型: + +| 字段 | 类型 | 说明 | +|------|------|------| +| `id` | `Int?` | 套餐ID | +| `name` | `String?` | 套餐名称 | +| `show` | `Boolean?` | 是否显示 | +| `renew` | `Boolean?` | 是否可续费 | +| `sell` | `Any?` | 是否可购买(类型不一致) | + +### `SubscribeData` 字段 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `device_limit` | `Int?` | 设备限制数 | +| `speed_limit` | `Int?` | 速度限制 | +| `next_reset_at` | `Long?` | 下次重置时间 | + +--- + +## 相关文件 + +- [ApiService.kt](Android-kotlin-Code/design/src/main/java/com/github/kr328/clash/design/network/ApiService.kt) - API 接口和数据类定义 +- [ApiClient.kt](Android-kotlin-Code/design/src/main/java/com/github/kr328/clash/design/network/ApiClient.kt) - Retrofit 客户端配置 + +--- + +## 更新日志 + +- 2026-07-03: 发现并修复 `sell` 字段类型不一致问题 +- 2026-07-03: 添加 `SubscribeData` 缺失字段 +- 2026-07-03: 修复 Retrofit baseUrl 必须以 `/` 结尾的问题