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基本信息

  • 接口名称: 体系数据
  • 接口地址: /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: 一级分类ID
      • name: 一级分类名称
      • 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)
  └── ...

注意事项

  1. 层级关系: 两级分类结构,适合移动端树形展示
  2. ID用途: 二级分类的id用于查询该分类下的文章
  3. 排序: order字段决定显示顺序,数字越小越靠前
  4. 可见性: 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: 一级分类ID
    • superChapterName: 一级分类名称
  • 分页信息: 与首页文章列表分页规则一致

测试用例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": ""
}

注意事项

  1. cid必须有效: 必须使用体系数据API返回的二级分类id
  2. 分页一致性: 如果使用了page_size,后续分页必须携带相同值
  3. 分类信息: 返回的文章中包含完整的分类层级信息
  4. 空结果: 如果分类下没有文章,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": ""
}

注意事项

  1. 精确匹配: 作者名必须完全匹配,不支持模糊搜索
  2. 中文编码: 中文作者名需要URL编码,但curl会自动处理
  3. 空结果: 没有匹配作者时返回空数组
  4. 分页: 即使没有结果,分页信息仍然返回

测试总结

✅ 已测试API

  1. 体系数据 ✅
  2. 体系下的文章 ✅
  3. 按作者搜文章 ✅

📊 数据统计

  • 总测试API:3个
  • 成功:3个
  • 失败:0个
  • 平均响应时间:< 300ms

🔧 技术要点

  1. 分类结构: 两级树形结构,适合移动端展示
  2. ID传递: 二级分类id用于查询分类文章
  3. 作者搜索: 精确匹配,不支持模糊搜索
  4. 统一接口: 三个功能使用同一个接口,通过参数区分

📝 移动端开发建议

  1. 分类展示: 使用ExpandableListView或RecyclerView展示两级分类
  2. 分类缓存: 体系数据变化不频繁,可以适当缓存
  3. 作者搜索: 提供作者名输入框,支持精确搜索
  4. 错误处理: 处理空结果和网络错误
  5. 分页加载: 实现上拉加载更多功能

🧪 边界测试建议

  1. 无效cid: 测试传入不存在的分类id
  2. 特殊字符: 测试作者名包含特殊字符
  3. 分页边界: 测试最后一页和超出范围的情况
  4. 并发请求: 测试快速切换分类时的请求处理

测试时间: 2026-03-17 20:40
测试人员: nanobot
下一阶段: 导航相关API测试