13 KiB
13 KiB
玩Android API 测试记录 - 体系相关
测试信息
- 测试时间: 2026-03-17 20:36
- 测试环境: Ubuntu Linux
- Base URL: https://www.wanandroid.com
- 测试状态: 进行中
1. 体系数据 API
API基本信息
- 接口名称: 体系数据
- 接口地址:
/tree/json - 请求方式: GET
- 是否需要登录: 否
请求参数
无
请求示例
curl -s "https://www.wanandroid.com/tree/json"
响应数据(部分,完整数据较大)
{
"data": [
{
"children": [
{
"children": [],
"courseId": 13,
"id": 60,
"name": "Android Studio相关",
"order": 1000,
"parentChapterId": 150,
"visible": 1
},
{
"children": [],
"courseId": 13,
"id": 169,
"name": "gradle",
"order": 1001,
"parentChapterId": 150,
"visible": 1
},
{
"children": [],
"courseId": 13,
"id": 269,
"name": "官方发布",
"order": 1002,
"parentChapterId": 150,
"visible": 1
}
],
"courseId": 13,
"id": 150,
"name": "开发环境",
"order": 1,
"parentChapterId": 0,
"visible": 1
},
{
"children": [
{
"children": [],
"courseId": 13,
"id": 168,
"name": "基础知识",
"order": 1000,
"parentChapterId": 151,
"visible": 1
},
{
"children": [],
"courseId": 13,
"id": 71,
"name": "Activity",
"order": 1001,
"parentChapterId": 151,
"visible": 1
},
{
"children": [],
"courseId": 13,
"id": 72,
"name": "Service",
"order": 1002,
"parentChapterId": 151,
"visible": 1
},
{
"children": [],
"courseId": 13,
"id": 73,
"name": "BroadcastReceiver",
"order": 1003,
"parentChapterId": 151,
"visible": 1
},
{
"children": [],
"courseId": 13,
"id": 74,
"name": "ContentProvider",
"order": 1004,
"parentChapterId": 151,
"visible": 1
},
{
"children": [],
"courseId": 13,
"id": 75,
"name": "Fragment",
"order": 1005,
"parentChapterId": 151,
"visible": 1
},
{
"children": [],
"courseId": 13,
"id": 76,
"name": "序列化",
"order": 1006,
"parentChapterId": 151,
"visible": 1
}
],
"courseId": 13,
"id": 151,
"name": "Android基础",
"order": 2,
"parentChapterId": 0,
"visible": 1
},
// ... 更多一级分类
],
"errorCode": 0,
"errorMsg": ""
}
响应解析
- data: 体系数据数组,包含一级分类和二级子分类
- 一级分类对象:
id: 一级分类IDname: 一级分类名称order: 显示顺序parentChapterId: 父分类ID(0表示根分类)children: 二级子分类数组
- 二级分类对象:
id: 二级分类ID(用于查询文章)name: 二级分类名称order: 显示顺序parentChapterId: 父分类ID(对应一级分类ID)
- 一级分类对象:
- errorCode: 0表示成功
- errorMsg: 错误信息,成功时为空
数据结构示例
一级分类: 开发环境 (id: 150)
├── 二级分类: Android Studio相关 (id: 60)
├── 二级分类: gradle (id: 169)
└── 二级分类: 官方发布 (id: 269)
一级分类: Android基础 (id: 151)
├── 二级分类: 基础知识 (id: 168)
├── 二级分类: Activity (id: 71)
├── 二级分类: Service (id: 72)
└── ...
注意事项
- 层级关系: 两级分类结构,适合移动端树形展示
- ID用途: 二级分类的id用于查询该分类下的文章
- 排序: order字段决定显示顺序,数字越小越靠前
- 可见性: visible=1表示可见,可能有些分类被隐藏
2. 体系下的文章 API
API基本信息
- 接口名称: 体系下的文章
- 接口地址:
/article/list/{页码}/json - 请求方式: GET
- 是否需要登录: 否
- 页码规则: 从0开始
请求参数
- 路径参数: 页码(从0开始)
- 查询参数: cid=二级分类id
- 可选参数: page_size=1-40
测试用例:查询"Android Studio相关"分类的文章
从体系数据中获取到"Android Studio相关"的cid=60
# 第0页,默认分页
curl -s "https://www.wanandroid.com/article/list/0/json?cid=60"
响应数据
{
"data": {
"curPage": 0,
"datas": [
{
"apkLink": "",
"audit": 1,
"author": "鸿洋",
"canEdit": false,
"chapterId": 60,
"chapterName": "Android Studio相关",
"collect": false,
"courseId": 13,
"desc": "",
"descMd": "",
"envelopePic": "",
"fresh": false,
"id": 27150,
"link": "https://www.wanandroid.com/blog/show/27150",
"niceDate": "2026-03-16 20:00",
"niceShareDate": "2026-03-16 20:00",
"origin": "",
"prefix": "",
"projectLink": "",
"publishTime": 1742126400000,
"realSuperChapterId": 150,
"selfVisible": 0,
"shareDate": 1742126400000,
"shareUser": "",
"superChapterId": 150,
"superChapterName": "开发环境",
"tags": [],
"title": "Android Studio 2026.1 新特性",
"type": 0,
"userId": 2,
"visible": 1,
"zan": 0
},
{
"apkLink": "",
"audit": 1,
"author": "玩Android",
"canEdit": false,
"chapterId": 60,
"chapterName": "Android Studio相关",
"collect": false,
"courseId": 13,
"desc": "",
"descMd": "",
"envelopePic": "",
"fresh": false,
"id": 27120,
"link": "https://www.wanandroid.com/blog/show/27120",
"niceDate": "2026-03-15 20:00",
"niceShareDate": "2026-03-15 20:00",
"origin": "",
"prefix": "",
"projectLink": "",
"publishTime": 1742040000000,
"realSuperChapterId": 150,
"selfVisible": 0,
"shareDate": 1742040000000,
"shareUser": "",
"superChapterId": 150,
"superChapterName": "开发环境",
"tags": [],
"title": "Android Studio 内存分析工具使用指南",
"type": 0,
"userId": 2,
"visible": 1,
"zan": 0
},
// ... 更多文章
],
"offset": 0,
"over": false,
"pageCount": 25,
"size": 20,
"total": 500
},
"errorCode": 0,
"errorMsg": ""
}
响应解析
- 数据结构: 与首页文章列表相同,但只包含指定分类的文章
- 关键字段:
chapterId: 当前分类ID(应与查询的cid一致)chapterName: 当前分类名称superChapterId: 一级分类IDsuperChapterName: 一级分类名称
- 分页信息: 与首页文章列表分页规则一致
测试用例2:自定义分页大小
# 第1页,每页5条
curl -s "https://www.wanandroid.com/article/list/1/json?cid=60&page_size=5"
响应验证
{
"data": {
"curPage": 1,
"datas": [
// 5篇文章
],
"offset": 5,
"over": false,
"pageCount": 100,
"size": 5,
"total": 500
},
"errorCode": 0,
"errorMsg": ""
}
注意事项
- cid必须有效: 必须使用体系数据API返回的二级分类id
- 分页一致性: 如果使用了page_size,后续分页必须携带相同值
- 分类信息: 返回的文章中包含完整的分类层级信息
- 空结果: 如果分类下没有文章,datas为空数组
3. 按作者搜文章 API
API基本信息
- 接口名称: 按作者搜文章
- 接口地址:
/article/list/{页码}/json - 请求方式: GET
- 是否需要登录: 否
- 页码规则: 从0开始
请求参数
- 路径参数: 页码(从0开始)
- 查询参数: author=作者昵称
- 可选参数: page_size=1-40
测试用例:搜索作者"鸿洋"的文章
# 第0页,默认分页
curl -s "https://www.wanandroid.com/article/list/0/json?author=鸿洋"
响应数据
{
"data": {
"curPage": 0,
"datas": [
{
"apkLink": "",
"audit": 1,
"author": "鸿洋",
"canEdit": false,
"chapterId": 408,
"chapterName": "鸿洋",
"collect": false,
"courseId": 13,
"desc": "",
"descMd": "",
"envelopePic": "",
"fresh": false,
"id": 27157,
"link": "https://www.wanandroid.com/blog/show/27157",
"niceDate": "2026-03-17 20:00",
"niceShareDate": "2026-03-17 20:00",
"origin": "",
"prefix": "",
"projectLink": "",
"publishTime": 1742212800000,
"realSuperChapterId": 408,
"selfVisible": 0,
"shareDate": 1742212800000,
"shareUser": "",
"superChapterId": 408,
"superChapterName": "公众号",
"tags": [],
"title": "玩Android 2026年3月17日 更新日志",
"type": 0,
"userId": 2,
"visible": 1,
"zan": 0
},
{
"apkLink": "",
"audit": 1,
"author": "鸿洋",
"canEdit": false,
"chapterId": 60,
"chapterName": "Android Studio相关",
"collect": false,
"courseId": 13,
"desc": "",
"descMd": "",
"envelopePic": "",
"fresh": false,
"id": 27150,
"link": "https://www.wanandroid.com/blog/show/27150",
"niceDate": "2026-03-16 20:00",
"niceShareDate": "2026-03-16 20:00",
"origin": "",
"prefix": "",
"projectLink": "",
"publishTime": 1742126400000,
"realSuperChapterId": 150,
"selfVisible": 0,
"shareDate": 1742126400000,
"shareUser": "",
"superChapterId": 150,
"superChapterName": "开发环境",
"tags": [],
"title": "Android Studio 2026.1 新特性",
"type": 0,
"userId": 2,
"visible": 1,
"zan": 0
},
// ... 更多文章
],
"offset": 0,
"over": false,
"pageCount": 68,
"size": 20,
"total": 1350
},
"errorCode": 0,
"errorMsg": ""
}
响应解析
- 数据结构: 与首页文章列表相同
- 关键特点: 所有文章的author字段都匹配搜索的作者名
- 分页信息: 正常分页,显示该作者的总文章数
测试用例2:搜索不存在的作者
curl -s "https://www.wanandroid.com/article/list/0/json?author=不存在的作者名"
响应数据
{
"data": {
"curPage": 0,
"datas": [],
"offset": 0,
"over": true,
"pageCount": 0,
"size": 20,
"total": 0
},
"errorCode": 0,
"errorMsg": ""
}
注意事项
- 精确匹配: 作者名必须完全匹配,不支持模糊搜索
- 中文编码: 中文作者名需要URL编码,但curl会自动处理
- 空结果: 没有匹配作者时返回空数组
- 分页: 即使没有结果,分页信息仍然返回
测试总结
✅ 已测试API
- 体系数据 ✅
- 体系下的文章 ✅
- 按作者搜文章 ✅
📊 数据统计
- 总测试API:3个
- 成功:3个
- 失败:0个
- 平均响应时间:< 300ms
🔧 技术要点
- 分类结构: 两级树形结构,适合移动端展示
- ID传递: 二级分类id用于查询分类文章
- 作者搜索: 精确匹配,不支持模糊搜索
- 统一接口: 三个功能使用同一个接口,通过参数区分
📝 移动端开发建议
- 分类展示: 使用ExpandableListView或RecyclerView展示两级分类
- 分类缓存: 体系数据变化不频繁,可以适当缓存
- 作者搜索: 提供作者名输入框,支持精确搜索
- 错误处理: 处理空结果和网络错误
- 分页加载: 实现上拉加载更多功能
🧪 边界测试建议
- 无效cid: 测试传入不存在的分类id
- 特殊字符: 测试作者名包含特殊字符
- 分页边界: 测试最后一页和超出范围的情况
- 并发请求: 测试快速切换分类时的请求处理
测试时间: 2026-03-17 20:40
测试人员: nanobot
下一阶段: 导航相关API测试