学生学习测试自用网站接口
这是我为个人学习测试场景搭的一套接口服务:按科目与知识点抽题、在线作答、自动判分,并把错题沉淀成可回顾的记录。 它服务于 hatsumi.fun 上的练习流程,题库、判分规则与访问凭据都由我本人维护。
能力概览
整套接口围绕「练习—作答—判分—回顾」四步循环设计,调用方是我自己的练习页面与命令行脚本, 因此结构上尽量保持扁平:一次请求完成一件事,返回体里直接带上判分结果与解析。
题库抽取
按科目、章节、难度与题型筛选题目,支持固定题量与随机顺序,同一次测试内不重复出题。
限时测试
创建测试会话时带上时长参数,服务端记录开始与截止时间,超时后按已提交的作答结算。
自动判分
客观题即时判分,主观题按关键词命中评分;每次作答都返回得分与题目解析文本。
错题回顾
测试结束后生成成绩单,把错误题目与正确答案整理成一份可复盘的清单。
适用场景
专项刷题前的知识点摸底、单元复习后的自测、考前限时模拟,以及为自己的错题本补充题目来源。 这些都是个人学习流程里的固定环节,接口负责把其中重复的动作自动化。
接入准备
- 取得访问凭据 凭据用于识别调用方身份,每个凭据可单独设置题量上限与有效期。
-
确认基础地址与协议
接口基址为
https://api.hatsumi.fun/v1,全部走 HTTPS,仅接受 JSON 请求体。 -
放置请求头
请求头携带
Authorization: Bearer $HATSUMI_TOKEN,并声明Content-Type: application/json。 - 本地验证连通性 先调用健康检查接口确认服务可达,再进入业务接口的联调。
请求调用
下面给出一段创建测试会话的调用写法,以及等价的脚本版本,按手头工具挑一种即可。
# 创建一次练习会话:从指定题库抽取 10 题
curl -X POST https://api.hatsumi.fun/v1/sessions \
-H "Authorization: Bearer $HATSUMI_TOKEN" \
-H "Content-Type: application/json" \
-d '{"bank_id":"math-g7-algebra","count":10,"mode":"practice"}'
等价的脚本版本,可直接放进练习页面的加载逻辑里:
const token = process.env.HATSUMI_TOKEN; const res = await fetch("https://api.hatsumi.fun/v1/sessions", { method: "POST", headers: { "Authorization": "Bearer " + token, "Content-Type": "application/json" }, body: JSON.stringify({ bank_id: "math-g7-algebra", count: 10, mode: "practice" }) }); if (!res.ok) { throw new Error("请求失败:HTTP " + res.status); } const { session_id, questions } = await res.json(); console.log(session_id, questions.length);
返回体结构统一为 code / message / data 三段:
{
"code": 0,
"message": "ok",
"data": {
"session_id": "s_2026_0418_7f3c9a",
"bank_id": "math-g7-algebra",
"count": 10,
"expires_at": "2026-04-18T21:30:00+08:00"
}
}
接口清单
全部路径均以基址 https://api.hatsumi.fun/v1 开头,限频按单个凭据计算。
| 方法 | 路径 | 用途 | 主要参数 | 限频 |
|---|---|---|---|---|
| GET | /health | 服务健康检查 | — | 不限 |
| GET | /banks | 获取题库列表与科目分类 | subject, grade | 30/min |
| GET | /banks/{bank_id}/questions | 按条件抽取题目 | chapter, level, count | 60/min |
| POST | /sessions | 创建一次测试会话 | bank_id, count, mode | 20/min |
| POST | /sessions/{id}/answers | 提交作答并即时判分 | question_id, answer | 60/min |
| GET | /sessions/{id}/report | 获取成绩单与错题清单 | session_id | 30/min |
题库标识约定
题库标识采用「科目-年级-章节」的写法,例如 math-g7-algebra 表示七年级代数,
physics-g8-optics 表示八年级光学。做题时先查题库列表,再拿标识去抽题,避免写死。
返回约定
业务错误一律通过 code 字段表达,HTTP 状态码只反映传输与鉴权层面。
| HTTP | code | 含义 | 处理方式 |
|---|---|---|---|
| 200 | 0 | 请求成功 | 读取 data 字段 |
| 400 | 1001 | 参数缺失或格式不符 | 检查请求体字段类型 |
| 401 | 1002 | 凭据缺失或已失效 | 核对 Authorization 请求头 |
| 404 | 1004 | 题库或会话不存在 | 重新拉取题库列表确认标识 |
| 429 | 1006 | 调用频率超出上限 | 退避 3 秒后重试一次 |
| 500 | 2001 | 服务端内部异常 | 稍后重试,持续失败则记录时间点 |
判分结果字段
提交作答后返回的 data 中包含 correct、score、
answer_key 与 explain 四个字段,
分别表示是否答对、本次得分、标准答案与解析。主观题按关键词命中比例给分,命中情况会一并写入 explain。
关于与联系
这个站点由我一人搭建和维护,从题目的录入、判分规则的调整到接口的日常运维都是自己动手。 搭建它的初衷很简单:把复习过程中反复出现的抽题、对答案、整理错题这些动作交给接口,腾出时间专注在知识本身。
- 主办人
- 黄龙翔
- 站点域名
- hatsumi.fun
- 联系电话
- 0898-6672 3158
- 通信地址
- 海南省海口市龙华区滨海大道 79 号中环国际广场 A 座 12 层 1207 室
- 值守时间
- 工作日 09:00 – 18:00
接口相关问题、题库纠错或使用建议,欢迎通过邮箱联系我;涉及账号与凭据的事项请直接说明域名 hatsumi.fun 与调用时间,便于我定位日志。