Files
nanocode/wanandroid/wanandroid_api_项目测试.md
Ubuntu 32b43f85bd a
2026-07-03 16:58:28 +08:00

13 KiB
Raw Permalink Blame History

玩Android API 测试记录 - 项目相关

测试信息


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)

完整分类列表

根据数据分析,项目分类包含:

  1. 完整项目 (id: 294, visible: 0) - 隐藏
  2. 跨平台应用 (id: 402) - Flutter、React Native等
  3. 资源聚合类 (id: 367) - 资源整理类项目
  4. 动画 (id: 323) - 动画效果相关
  5. RV列表动效 (id: 314) - RecyclerView动画
  6. 项目基础功能 (id: 358) - 基础功能模块
  7. 网络&文件下载 (id: 328) - 网络请求相关
  8. TextView (id: 331) - 文本控件相关
  9. 键盘 (id: 336) - 输入法相关
  10. 快应用 (id: 337) - 快应用开发
  11. 日历&时钟 (id: 338) - 时间相关
  12. K线图 (id: 339) - 图表相关
  13. 硬件相关 (id: 340) - 硬件交互
  14. 表格类 (id: 357) - 表格控件
  15. 创意汇 (id: 363) - 创意项目
  16. ImageView (id: 380) - 图片控件
  17. 音视频&相机 (id: 382) - 多媒体相关
  18. 相机 (id: 383) - 相机功能
  19. 下拉刷新 (id: 310) - 刷新控件
  20. 架构 (id: 385) - 项目架构
  21. 对话框 (id: 387) - 弹窗控件
  22. 数据库 (id: 388) - 数据存储
  23. AS插件 (id: 391) - Android Studio插件
  24. ViewPager (id: 400) - 翻页控件
  25. 二维码 (id: 401) - 二维码相关
  26. 富文本编辑器 (id: 312) - 文本编辑
  27. IM (id: 526) - 即时通讯
  28. 未分类 (id: 539) - 其他项目

注意事项

  1. visible字段: 只有visible=1的分类才显示给用户
  2. id用途: 分类id用于查询该分类下的项目列表
  3. 分类稳定: 项目分类相对稳定,新增较少
  4. 排序: 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: 标签数组

项目特点字段

与普通文章相比,项目有特殊字段:

  1. projectLink: 项目源码地址(GitHub等)
  2. envelopePic: 项目封面图(通常有值)
  3. desc: 项目详细描述(通常较长)
  4. 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. 页码从1开始: 这是与文章列表API最重要的区别
  2. 分页参数: page_size一旦传入,后续分页必须携带相同值
  3. 封面图: envelopePic字段通常有值,需要加载显示
  4. 项目链接: projectLink是源码地址,link是介绍文章地址
  5. 空结果: 如果分类下没有项目,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开始,与文章列表一致

注意事项

  1. 混合数据: 包含所有分类的最新项目
  2. 时间排序: 按发布时间倒序排列
  3. 分页规则: 从0开始,与文章列表一致
  4. 首页使用: 通常用于首页的"最新项目"Tab

测试总结

✅ 已测试API

  1. 项目分类 ✅
  2. 项目列表 ✅
  3. 最新项目列表 ✅

📊 数据统计

  • 总测试API:3个
  • 成功:3个
  • 失败:0个
  • 分类数量:28个(27个可见)
  • 项目示例:跨平台应用分类有280个项目

🔧 技术要点

  1. 页码差异: 项目列表从1开始,文章列表从0开始
  2. 项目字段: 有projectLink和envelopePic特殊字段
  3. 分类结构: 扁平结构,没有子分类
  4. 最新项目: 混合所有分类的最新项目

📝 移动端开发建议

  1. 统一分页处理: 需要区分文章和项目的分页逻辑
  2. 项目卡片设计: 需要显示封面图、标题、描述、作者等信息
  3. 分类导航: 使用TabLayout展示项目分类
  4. 源码跳转: 正确处理projectLink的打开
  5. 图片加载: 优化封面图加载和缓存

🧪 边界测试建议

  1. 页码边界: 测试第0页、第1页、超出范围页
  2. 空分类: 测试没有项目的分类
  3. 分页一致性: 测试page_size参数的一致性要求
  4. 网络错误: 测试网络异常时的处理

⚠️ 重要区别

特性 文章列表 项目列表
页码起始 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