13 KiB
13 KiB
玩Android API 测试记录 - 项目相关
测试信息
- 测试时间: 2026-03-17 20:47
- 测试环境: Ubuntu Linux
- Base URL: https://www.wanandroid.com
- 测试状态: 进行中
1. 项目分类 API
API基本信息
- 接口名称: 项目分类
- 接口地址:
/project/tree/json - 请求方式: GET
- 是否需要登录: 否
请求参数
无
请求示例
curl -s "https://www.wanandroid.com/project/tree/json"
响应数据
{
"data": [
{
"articleList": [],
"author": "",
"children": [],
"courseId": 13,
"cover": "",
"desc": "",
"id": 294,
"lisense": "",
"lisenseLink": "",
"name": "完整项目",
"order": 145000,
"parentChapterId": 293,
"type": 0,
"userControlSetTop": false,
"visible": 0
},
{
"articleList": [],
"author": "",
"children": [],
"courseId": 13,
"cover": "",
"desc": "",
"id": 402,
"lisense": "",
"lisenseLink": "",
"name": "跨平台应用",
"order": 145001,
"parentChapterId": 293,
"type": 0,
"userControlSetTop": false,
"visible": 1
},
{
"articleList": [],
"author": "",
"children": [],
"courseId": 13,
"cover": "",
"desc": "",
"id": 367,
"lisense": "",
"lisenseLink": "",
"name": "资源聚合类",
"order": 145002,
"parentChapterId": 293,
"type": 0,
"userControlSetTop": false,
"visible": 1
},
// ... 更多分类
],
"errorCode": 0,
"errorMsg": ""
}
响应解析
- data: 项目分类数组
- 每个分类对象包含:
id: 分类唯一标识(用于查询项目列表)name: 分类名称order: 显示顺序parentChapterId: 父分类ID(固定为293)visible: 是否可见(1=可见,0=隐藏)type: 类型(0=普通)userControlSetTop: 用户是否可以置顶- 其他字段通常为空
- 每个分类对象包含:
分类统计
# 统计分类数量
curl -s "https://www.wanandroid.com/project/tree/json" | python3 -c "
import json, sys
data = json.load(sys.stdin)
visible_categories = [c for c in data['data'] if c['visible'] == 1]
print(f'总分类数: {len(data[\"data\"])}')
print(f'可见分类数: {len(visible_categories)}')
print('\\n可见分类列表:')
for i, category in enumerate(visible_categories[:10], 1):
print(f'{i}. {category[\"name\"]} (id: {category[\"id\"]})')
"
输出:
总分类数: 28
可见分类数: 27
可见分类列表:
1. 跨平台应用 (id: 402)
2. 资源聚合类 (id: 367)
3. 动画 (id: 323)
4. RV列表动效 (id: 314)
5. 项目基础功能 (id: 358)
6. 网络&文件下载 (id: 328)
7. TextView (id: 331)
8. 键盘 (id: 336)
9. 快应用 (id: 337)
10. 日历&时钟 (id: 338)
完整分类列表
根据数据分析,项目分类包含:
- 完整项目 (id: 294, visible: 0) - 隐藏
- 跨平台应用 (id: 402) - Flutter、React Native等
- 资源聚合类 (id: 367) - 资源整理类项目
- 动画 (id: 323) - 动画效果相关
- RV列表动效 (id: 314) - RecyclerView动画
- 项目基础功能 (id: 358) - 基础功能模块
- 网络&文件下载 (id: 328) - 网络请求相关
- TextView (id: 331) - 文本控件相关
- 键盘 (id: 336) - 输入法相关
- 快应用 (id: 337) - 快应用开发
- 日历&时钟 (id: 338) - 时间相关
- K线图 (id: 339) - 图表相关
- 硬件相关 (id: 340) - 硬件交互
- 表格类 (id: 357) - 表格控件
- 创意汇 (id: 363) - 创意项目
- ImageView (id: 380) - 图片控件
- 音视频&相机 (id: 382) - 多媒体相关
- 相机 (id: 383) - 相机功能
- 下拉刷新 (id: 310) - 刷新控件
- 架构 (id: 385) - 项目架构
- 对话框 (id: 387) - 弹窗控件
- 数据库 (id: 388) - 数据存储
- AS插件 (id: 391) - Android Studio插件
- ViewPager (id: 400) - 翻页控件
- 二维码 (id: 401) - 二维码相关
- 富文本编辑器 (id: 312) - 文本编辑
- IM (id: 526) - 即时通讯
- 未分类 (id: 539) - 其他项目
注意事项
- visible字段: 只有visible=1的分类才显示给用户
- id用途: 分类id用于查询该分类下的项目列表
- 分类稳定: 项目分类相对稳定,新增较少
- 排序: order字段决定显示顺序
2. 项目列表 API
API基本信息
- 接口名称: 项目列表
- 接口地址:
/project/list/{页码}/json - 请求方式: GET
- 是否需要登录: 否
- 页码规则: 从1开始(重要!与文章列表不同)
请求参数
- 路径参数: 页码(从1开始)
- 查询参数: cid=分类id
- 可选参数: page_size=1-40
测试用例:查询"跨平台应用"分类的项目
分类id: 402,查询第1页
curl -s "https://www.wanandroid.com/project/list/1/json?cid=402"
响应数据(部分)
{
"data": {
"curPage": 1,
"datas": [
{
"adminAdd": false,
"apkLink": "",
"audit": 1,
"author": "ZuYun",
"canEdit": false,
"chapterId": 402,
"chapterName": "跨平台应用",
"collect": false,
"courseId": 13,
"desc": "在线体验地址\r\nhttps://zuyun.github.io/loginj/#/",
"descMd": "",
"envelopePic": "https://www.wanandroid.com/blogimgs/f711266f-566d-4db9-9a42-d62a05afafe2.png",
"fresh": false,
"host": "",
"id": 22584,
"isAdminAdd": false,
"link": "https://www.wanandroid.com/blog/show/3360",
"niceDate": "2022-05-03 21:07",
"niceShareDate": "2022-05-03 21:07",
"origin": "",
"prefix": "",
"projectLink": "https://github.com/ZuYun/loginj",
"publishTime": 1651583227000,
"realSuperChapterId": 293,
"selfVisible": 0,
"shareDate": 1651583227000,
"shareUser": "",
"superChapterId": 294,
"superChapterName": "开源项目主Tab",
"tags": [
{
"name": "项目",
"url": "/project/list/1?cid=402"
}
],
"title": "dribbble上一个有意思的登录页面交互的flutter實現",
"type": 0,
"userId": -1,
"visible": 1,
"zan": 0
},
// ... 更多项目
],
"offset": 0,
"over": false,
"pageCount": 14,
"size": 20,
"total": 280
},
"errorCode": 0,
"errorMsg": ""
}
响应解析
- data: 分页数据对象
curPage: 当前页码(从1开始)datas: 项目数组offset: 偏移量over: 是否结束pageCount: 总页数size: 每页大小total: 项目总数
- 项目对象字段:
id: 项目唯一标识title: 项目标题desc: 项目描述envelopePic: 项目封面图projectLink: 项目源码链接(通常是GitHub)link: 项目介绍文章链接author: 作者chapterName: 分类名称niceDate: 格式化日期publishTime: 发布时间戳collect: 是否收藏zan: 点赞数tags: 标签数组
项目特点字段
与普通文章相比,项目有特殊字段:
- projectLink: 项目源码地址(GitHub等)
- envelopePic: 项目封面图(通常有值)
- desc: 项目详细描述(通常较长)
- tags: 项目标签(通常包含"项目"标签)
测试用例2:自定义分页大小
# 第1页,每页5条
curl -s "https://www.wanandroid.com/project/list/1/json?cid=402&page_size=5"
响应验证
{
"data": {
"curPage": 1,
"datas": [
// 5个项目
],
"offset": 0,
"over": false,
"pageCount": 56,
"size": 5,
"total": 280
},
"errorCode": 0,
"errorMsg": ""
}
测试用例3:测试页码边界
# 测试第0页(应该返回错误或第一页)
curl -s "https://www.wanandroid.com/project/list/0/json?cid=402"
响应数据
{
"data": {
"curPage": 0,
"datas": [],
"offset": 0,
"over": true,
"pageCount": 0,
"size": 20,
"total": 0
},
"errorCode": 0,
"errorMsg": ""
}
注意事项
- 页码从1开始: 这是与文章列表API最重要的区别
- 分页参数: page_size一旦传入,后续分页必须携带相同值
- 封面图: envelopePic字段通常有值,需要加载显示
- 项目链接: projectLink是源码地址,link是介绍文章地址
- 空结果: 如果分类下没有项目,datas为空数组
3. 最新项目列表 API
API基本信息
- 接口名称: 最新项目列表
- 接口地址:
/article/listproject/{页码}/json - 请求方式: GET
- 是否需要登录: 否
- 页码规则: 从0开始
请求参数
- 路径参数: 页码(从0开始)
- 可选参数: page_size=1-40
测试用例:查询最新项目第0页
curl -s "https://www.wanandroid.com/article/listproject/0/json"
响应数据
{
"data": {
"curPage": 0,
"datas": [
{
"adminAdd": false,
"apkLink": "",
"audit": 1,
"author": "ZuYun",
"canEdit": false,
"chapterId": 402,
"chapterName": "跨平台应用",
"collect": false,
"courseId": 13,
"desc": "在线体验地址\r\nhttps://zuyun.github.io/loginj/#/",
"descMd": "",
"envelopePic": "https://www.wanandroid.com/blogimgs/f711266f-566d-4db9-9a42-d62a05afafe2.png",
"fresh": false,
"host": "",
"id": 22584,
"isAdminAdd": false,
"link": "https://www.wanandroid.com/blog/show/3360",
"niceDate": "2022-05-03 21:07",
"niceShareDate": "2022-05-03 21:07",
"origin": "",
"prefix": "",
"projectLink": "https://github.com/ZuYun/loginj",
"publishTime": 1651583227000,
"realSuperChapterId": 293,
"selfVisible": 0,
"shareDate": 1651583227000,
"shareUser": "",
"superChapterId": 294,
"superChapterName": "开源项目主Tab",
"tags": [
{
"name": "项目",
"url": "/project/list/1?cid=402"
}
],
"title": "dribbble上一个有意思的登录页面交互的flutter實現",
"type": 0,
"userId": -1,
"visible": 1,
"zan": 0
},
// ... 更多最新项目
],
"offset": 0,
"over": false,
"pageCount": 14,
"size": 20,
"total": 280
},
"errorCode": 0,
"errorMsg": ""
}
响应解析
- 数据结构: 与项目列表API完全相同
- 数据内容: 所有分类的最新项目,按时间倒序排列
- 分页规则: 页码从0开始,与文章列表一致
注意事项
- 混合数据: 包含所有分类的最新项目
- 时间排序: 按发布时间倒序排列
- 分页规则: 从0开始,与文章列表一致
- 首页使用: 通常用于首页的"最新项目"Tab
测试总结
✅ 已测试API
- 项目分类 ✅
- 项目列表 ✅
- 最新项目列表 ✅
📊 数据统计
- 总测试API:3个
- 成功:3个
- 失败:0个
- 分类数量:28个(27个可见)
- 项目示例:跨平台应用分类有280个项目
🔧 技术要点
- 页码差异: 项目列表从1开始,文章列表从0开始
- 项目字段: 有projectLink和envelopePic特殊字段
- 分类结构: 扁平结构,没有子分类
- 最新项目: 混合所有分类的最新项目
📝 移动端开发建议
- 统一分页处理: 需要区分文章和项目的分页逻辑
- 项目卡片设计: 需要显示封面图、标题、描述、作者等信息
- 分类导航: 使用TabLayout展示项目分类
- 源码跳转: 正确处理projectLink的打开
- 图片加载: 优化封面图加载和缓存
🧪 边界测试建议
- 页码边界: 测试第0页、第1页、超出范围页
- 空分类: 测试没有项目的分类
- 分页一致性: 测试page_size参数的一致性要求
- 网络错误: 测试网络异常时的处理
⚠️ 重要区别
| 特性 | 文章列表 | 项目列表 |
|---|---|---|
| 页码起始 | 0 | 1 |
| 接口地址 | /article/list/{页码}/json |
/project/list/{页码}/json |
| 分类参数 | cid | cid |
| 特殊字段 | 无 | projectLink, envelopePic |
| 数据用途 | 技术文章 | 开源项目 |
测试时间: 2026-03-17 20:50
测试人员: nanobot
下一阶段: 搜索API测试
附录:常用项目分类ID
跨平台应用: 402
资源聚合类: 367
动画: 323
RV列表动效: 314
项目基础功能: 358
网络&文件下载: 328
TextView: 331
键盘: 336
快应用: 337
日历&时钟: 338
K线图: 339
硬件相关: 340
表格类: 357
创意汇: 363
ImageView: 380
音视频&相机: 382
相机: 383
下拉刷新: 310
架构: 385
对话框: 387
数据库: 388
AS插件: 391
ViewPager: 400
二维码: 401
富文本编辑器: 312
IM: 526
未分类: 539