Skip to content
Xuehai Wiki学海 Wiki

竞技场API

技术解析2026年10月17日约 3,799 字 · 47 节随机文章

竞技场(PK / 对战 / 赛事)API 文档

Section titled “竞技场(PK / 对战 / 赛事)API 文档”

本文档基于对逆向工程源码的静态分析整理,梳理了应用内”竞技场”(PK 对战 / 赛事竞赛)相关功能的全部网络 API 接口。

代码路径:sources/com/p039xh/abrustu/networkapi/

说明:竞技场在代码中被拆分为两大体系:

  1. PK 对战(即时对战/单人对战) —— PkApi / PkGameApi(接口),对应实现 PkHomeApiImpl / PkGameApiImpl。
  2. 赛事/竞赛(Cpt,如晋级赛、海选赛) —— CptGameApi(接口),对应实现 CptGameApiImpl。

所有竞技场请求都继承自基类 BaseBrushApiImpl(文件:BaseBrushApiImpl.java),统一经由 XHBaseRequestProxy(OkHttp 封装)发送。核心方法:

方法HTTP 方法说明
getRequest(serverType, url, Map<String,String> query, listener)GET带 query 参数的 GET 请求
getRequest(serverType, url, Object bean, listener)GET以对象字段作为 query 参数的 GET 请求
postRequest(serverType, url, Object body, listener)POSTJSON 请求体 POST
postBooleanRequest(serverType, url, Object body, listener)POSTPOST,成功时回调 onSuccess(true)
  • 所有接口都要求用户已登录(checkUserNotEmpty()),否则直接返回不发请求。
  • 请求回调统一为 AbstractOnApiListener<T>:成功 onSuccess(T) / 失败 onError(RequestFailBean)。
  • 服务类型码(serverType):竞技场全部使用 "SA101010"。
  • 返回结构为通用响应体 BaseResponseBeanHelper.BaseResponseBean(即 code/message/data 包装)。
  • {studentId} / {userId}:当前登录学生 ID,来自 UserManager.getInstance().getUserId()(多数接口为字符串)。
  • {subjectId}:学科 ID。
  • {matchId}:赛事 ID。
  • {pkId}:PK 对局 ID。
  • {season}:赛季。

二、PK 对战 —— 首页 / 基础接口(PkApi)

Section titled “二、PK 对战 —— 首页 / 基础接口(PkApi)”

接口文件:PkApi.java 实现文件:PkHomeApiImpl.java 单例入口:PkHomeApiImpl.getPkApi()

项值
方法homePage(listener)
说明获取竞技场首页全部信息(赛季、段位、胜率、门票、头像、赛事等)
HTTPGET

请求路径:/api/v1/pk/user/{studentId}/home/page

请求参数(Query)

参数类型说明
pictureUpdateTimeString图片更新时间,固定传 "0"
studentIdString学生 ID

响应体:PkHomeEntity

字段类型说明
seasonint当前赛季
seasonNameString赛季名称
startTime / endTimeLong赛季起止时间
nextSeasonTimeLong下一赛季时间
studentIdLong学生 ID
totalCount / victoryCountInteger总场数 / 胜场数
victoryRateString胜率
ticketTotal / ticketCountInteger门票总数 / 剩余门票
subjectIdListList<Integer>可选学科 ID 列表
headImg / honorImgList<String>头像 / 荣誉图集
seasonDtoListList<SeasonDtoList>赛季列表(season/seasonName)
studentDanLevelDtoStudentDanLevelDto学生段位(danLevel/danLevelName/danCount/img)
studentExperienceDtoStudentExperienceDto学生经验(level/molecular/denominator)
danLevelConfigDtoListList<DanLevelConfigDtoListBean>段位配置列表
pictureConfigDtoListList<PictureConfigDtoListBean>头像图片配置
titleLevelConfigDtoListList<TitleBean>称号配置列表
pkMatchResponsePkMatchResponse进行中的赛事(matchId/matchType/name/roundNumber/startTime/totalRound)
项值
方法pictureAll(listener)
说明获取全部可选(已获得)头像图
HTTPGET

请求路径:/api/v1/pk/picture/student/{studentId}/picture/all

请求参数(Query)

参数类型说明
typeString固定传 "1"

响应体:泛型 T(调用处反序列化为 SelectableBadgeData,即可选头像徽章数据)

项值
方法headPortrait(season, id, listener)
说明设置当前佩戴头像
HTTPGET

请求路径:/api/v1/pk/picture/student/{studentId}/add/head/portrait

请求参数(Query)

参数类型说明
idString头像图片 ID
seasonString赛季

响应体:Boolean

项值
方法matching(listener)
说明检测当前是否处于匹配/对局状态,决定能否发起新对局
HTTPGET

请求路径:/api/v1/pk/check/student/{studentId}/matching

请求参数:无

响应体:MatchingEntity(仅 code / message)

项值
方法submitGame(PkStudentGameBean, listener)
说明提交一局 PK 对战结果
HTTPPOST

请求路径:/api/v1/pk/game/student/{studentId}/game/result

请求体:PkStudentGameBean(JSON),提交时会自动注入 studentId,并剔除 tagDescription 字段。主要字段:

字段类型说明
pkIdString对局 ID
kIdLong场次 key ID
pkPatternInteger对战模式
subjectIdInteger学科 ID
studentIdInteger学生 ID(自动注入)
robotPkBoolean是否机器人对战
statusInteger对局状态
createTime / endTime / countTimerLong时间相关
rivalProgress / rivalQuestionTimeInteger/Long对手进度/答题时间
robotRightCount / robotTimeConsumingInteger/Long机器人答对题数/耗时
usersList<PkUserBean>参与用户
questions / pkQuestionDtoListList<PkQuestionBean>题目列表
robotQuestionRightListList<Integer>机器人答对题目下标

响应体:String

2.6 获取对局服务器信息(Socket 房间)

Section titled “2.6 获取对局服务器信息(Socket 房间)”
项值
方法serverId(listener)
说明获取用于建立实时对战 Socket 连接的服务器信息(appId/roomId)
HTTPGET

请求路径:/api/v1/pk/users/{studentId}/td

请求参数:无

响应体:ServerIdEntity(appId / roomId / userId)

项值
方法again(subjectId, listener)
说明申请同一学科再来一局
HTTPGET

请求路径:/api/v1/pk/check/student/{studentId}/again?subjectId={subjectId}

请求参数(Query):subjectId(学科 ID,拼入 URL)

响应体:BaseResponseBeanHelper.BaseResponseBean

项值
方法getRemoteWord(tagCode, listener)
说明根据知识点标签远程获取单个 PK 题目
HTTPGET

请求路径:/api/v1/question/question/users/{studentId}/tags/{tagCode}

请求参数:tagCode 拼入路径

响应体:PkQuestionBean

项值
方法getPopupList(listener)
说明获取竞技场激励/弹窗列表
HTTPGET

请求路径:/api/v1/match/student/{studentId}/popup/list

请求参数:无

响应体:List<MatchInspirePopupBean>

项值
方法getPopupFix(matchId, oldImgUrl, newImgUrl, listener)
说明上报弹窗图片加载失败并修复
HTTPGET

请求路径:/api/v1/match/student/{studentId}/popup/fix

请求参数(Query)

参数类型说明
matchIdString赛事 ID
oldImgUrlString失败图片 URL
newImgUrlString修复后图片 URL

响应体:String


三、PK 对战 —— 对局数据接口(PkGameApi)

Section titled “三、PK 对战 —— 对局数据接口(PkGameApi)”

接口文件:PkGameApi.java 实现文件:PkGameApiImpl.java 单例入口:PkGameApiImpl.getPkGameApi()

项值
方法checkHomeWork(listener)
说明检查用户是否有未完成的作业
HTTPGET

请求路径:/api/v1/pk/check/student/{studentId}/homeWork

请求参数:无 响应体:BaseResponseBeanHelper.BaseResponseBean

项值
方法checkSeasonBan(subjectId, listener)
说明检查某学科在当前赛季是否被封禁
HTTPGET

请求路径:/api/v1/pk/check/student/{studentId}/season/ban?subjectId={subjectId}

请求参数(Query):subjectId 响应体:BaseResponseBeanHelper.BaseResponseBean

项值
方法getPkSubjectData(listener)
说明获取竞技场可选学科
HTTPGET

请求路径:/api/v1/pk/user/{studentId}/home/subject?studentId={studentId}

请求参数(Query):studentId

响应体:List<ChooseSubjectBean>

项值
方法getPkRankData(PkRankRequest, listener)
说明获取 PK 排行榜
HTTPGET

请求路径:/api/v1/pk/rank/user/{studentId}

请求参数(Query,取自 PkRankRequest 对象)

参数类型说明
classIdString班级 ID
seasonint赛季
rankTypeint榜单类型
rankKindint榜单细分类型

响应体:PkRankRespBean

字段类型说明
rankKindInteger榜单细分类型
rankTypeInteger榜单类型
pkRankStudentListList<PkRankBean>榜单学生列表
studentSingInRankPkRankBean当前学生在榜信息
项值
方法getPkGameResultData(studentId, pkId, listener)
说明获取一局 PK 对局的结算结果
HTTPGET

请求路径:/api/v1/pk/game/user/{studentId}/game/result

请求参数(Query)

参数类型说明
studentIdString学生 ID
pkIdString对局 ID

响应体:PkGameResultBean(段位变化 danChange/danLevel/danName、经验变化 experienceChange/experienceLevel、结果 result、答对题数 rightCount、双方题目结果列表、timeConsuming、title、passiveContest、rivalStudentHeaderInfoList、hideScore 等)

项值
方法getPkGameHistoryData(subjectId, page, size, 未用参数, listener)
说明获取对战历史列表(分页)
HTTPGET

请求路径:/api/v1/pk/game/user/{studentId}/game/history

请求参数(Query)

参数类型说明
studentIdint学生 ID
subjectIdint学科 ID
pageint页码
sizeint每页条数

响应体:List<FightHistoryBean>

注:方法签名为 getPkGameHistoryData(String, int, int, int, listener),其中第一个 String 参数在实现中未使用。

项值
方法getPkQuestionListData(gameId, listener)
说明根据对局 ID 获取题目列表及知识点标签
HTTPGET

请求路径:/api/v1/pk/game/user/{studentId}/game/question

请求参数(Query)

参数类型说明
gameIdString对局 ID

响应体:PkQuestionListBean(pkQuestionInfoDtoList:题目列表;tagDtoList:知识点标签列表)

项值
方法recoverData(pkId, listener)
说明断线后恢复 PK 对局进度
HTTPGET

请求路径:/api/v1/pk/student/{studentId}/date/restoration?pkId={pkId}

请求参数(Query):pkId

响应体:PkStudentGameBean

项值
方法connectionCheck(pkId, listener)
说明对局开始前做连接检测
HTTPGET

请求路径:/api/v1/pk/student/{studentId}/connection/check?pkId={pkId}

请求参数(Query):pkId

响应体:ConnectionCheckResponse


四、赛事 / 竞赛接口(CptGameApi)

Section titled “四、赛事 / 竞赛接口(CptGameApi)”

接口文件:CptGameApi.java 实现文件:CptGameApiImpl.java 单例入口:CptGameApiImpl.getCptGameApi()

项值
方法getMatchRank(CptMatchRankRequest, listener)
说明获取赛事某轮晋级排名
HTTPGET

请求路径:/api/v1/match/user/{studentId}/match/promotion/rank

请求参数(Query,取自 CptMatchRankRequest)

参数类型说明
studentIdlong学生 ID
matchIdString赛事 ID
roundNumberint轮次

响应体:RoundRankResponse

项值
方法getMatchFinalRank(matchId, listener)
说明获取赛事最终(决赛)排名
HTTPGET

请求路径:/api/v1/match/user/{studentId}/match/final/rank

请求参数(Query)

参数类型说明
studentIdString学生 ID
matchIdString赛事 ID

响应体:RoundRankResponse

项值
方法updateCptGame(CompetitionGameBean, listener)
说明提交一局赛事对局结果
HTTPPOST

请求路径:/api/v1/match/student/{studentId}/game/result

请求体:CompetitionGameBean(JSON),自动注入 studentId。主要字段:

字段类型说明
kIdLong场次 key ID
matchIdString赛事 ID
pkIdString对局 ID
userId / studentIdInteger/Long用户/学生 ID
userName / schoolNameString用户名 / 学校名
usersList<PkUserBean>参与用户
pattern(pkPattern)Integer模式
statusInteger对局状态
totalRightInteger总答对数
totalScoreDouble总分
userProgress(rivalInfoDtoList)List<PkUserProgressBean>对手进度
questionsList<CompetitionQuestionBean>题目列表
portraitUrlString头像 URL

响应体:Boolean

项值
方法giveUpMatch(matchId, pkId, listener)
说明放弃当前赛事对局
HTTPGET

请求路径:/api/v1/match/student/{studentId}/match/give/up

请求参数(Query)

参数类型说明
matchIdString赛事 ID
pkIdString对局 ID

响应体:String

项值
方法recoverData(pkId, matchId, listener)
说明断线后恢复赛事对局进度
HTTPGET

请求路径:/api/v1/match/student/{studentId}/date/restoration

请求参数(Query)

参数类型说明
pkIdString对局 ID
matchIdString赛事 ID

响应体:MatchDataRestorationResponse

项值
方法connectionCheck(matchId, pkId, listener)
说明赛事对局开始前连接检测
HTTPGET

请求路径:/api/v1/match/student/{studentId}/race/connection/check

请求参数(Query)

参数类型说明
matchIdString赛事 ID
pkIdString对局 ID

响应体:MatchConnectionCheckResponse

项值
方法getMatchQuestionListData(CptMatchQuestionRequest, listener)
说明获取赛事某轮题目/作答结果信息
HTTPGET

请求路径:/api/v2/match/user/{studentId}/game/result/info(注意为 v2)

请求参数(Query,取自 CptMatchQuestionRequest)

参数类型说明
studentIdlong学生 ID
matchIdString赛事 ID
roundint轮次
sceneint场景

响应体:List<MatchResultInfoResponse>

项值
方法checkRecentMatch(listener)
说明检查用户是否有进行中的赛事
HTTPGET

请求路径:/api/v1/match/student/{studentId}/recent/match

请求参数(Query)

参数类型说明
timeString时间窗口,固定传 "300000"(毫秒,即 5 分钟)

响应体:PkHomeEntity.PkMatchResponse

项值
方法rewardHp(matchId, listener)
说明赛事中领取奖励体力
HTTPGET

请求路径:/api/v1/match/{matchId}/student/{studentId}/reward/hp

请求参数:matchId 拼入路径

响应体:Integer(体力值)

项值
方法auditionList(matchId, listener)
说明获取某赛事海选排名列表
HTTPGET

请求路径:/api/v1/match/{matchId}/user/{studentId}/audition/list

请求参数:matchId 拼入路径

响应体:MatchAuditionRankResponse

项值
方法auditionHistory(matchId, pageNum, pageSize, listener)
说明获取赛事海选详情/历史(分页)
HTTPGET

请求路径:/api/v1/match/user/{studentId}/match/audition/detail/info

请求参数(Query)

参数类型说明
matchIdString赛事 ID
pageNumString页码
pageSizeString每页条数

响应体:String

项值
方法saveCommitment(matchId, roundNumber, url, listener)
说明提交某轮承诺书(含音频 URL)
HTTPPOST

请求路径:/api/v1/match/{matchId}/student/{studentId}/save/commitment

请求体:CptCommitmentRequest(JSON)

字段类型说明
commitmentListList<CommitmentListRequest>承诺书列表
└ roundNumberInteger轮次
└ urlString承诺书文件 URL

响应体:Boolean

项值
方法findCommitment(matchId, roundNumber, listener)
说明查询某轮承诺书信息
HTTPGET

请求路径:/api/v1/match/user/{studentId}/commitment

请求参数(Query)

参数类型说明
studentIdString学生 ID
matchIdString赛事 ID
roundNumberString轮次

响应体:CptCommitmentResponse

项值
方法auditionStatus(matchId, listener)
说明查询用户是否已报名海选
HTTPGET

请求路径:/api/v1/match/{matchId}/popups/student/{studentId}/audition/status

请求参数:matchId 拼入路径

响应体:Boolean

项值
方法auditionRank(listener)
说明获取海选排名(用于弹窗展示)
HTTPGET

请求路径:/api/v1/match/popups/student/{studentId}/audition/rank

请求参数:无

响应体:AuditionPopUpsResponse

4.16 学生赛事游戏记录(成绩单)

Section titled “4.16 学生赛事游戏记录(成绩单)”
项值
方法requestStudentGame(gameId, listener)
说明查询学生某场赛事的成绩单/对战记录
HTTPGET

请求路径:/api/v1/grouping/task/{studentId}/Transcript(注意大小写)

请求参数(Query)

参数类型说明
gameIdString赛事对局 ID

响应体:StudentGameBean


五、实时对战 Socket(配合 PK 使用)

Section titled “五、实时对战 Socket(配合 PK 使用)”

竞技场对战过程通过 Socket 实时传输答题进度,与 HTTP API 配合使用。

接口文件:sources/com/p039xh/common/socketv2/api/SocketApi.java 实现/控制器:sources/com/p039xh/abrustu/p053pk/controller/PkSocketController.java

方法说明
pk(PkSocketMsgRequest)发送 PK 对战实时消息
cpt(int, SocketMsgRequest)发送赛事对战实时消息
heart()心跳
reconnect(String)重连
finish(String)结束

PK 消息:PkSocketMsgRequest(继承 SocketMsgRequest)

  • 额外字段:sendMsgTime / receivedMsgTime

通用消息:SocketMsgRequest(继承 BaseSocketMsgRequest)

  • 字段:tagCode、tagName、totalLetters、selectedLetters、answer、score、homeExit

基础消息:BaseSocketMsgRequest

字段类型说明
pkIdString对局 ID
matchIdString赛事 ID
userIdLong用户 ID
createTimeLong创建时间
indexInteger题目序号
resultInteger作答结果
timeLong用时
questionIdString题目 ID
systemJudgeBoolean是否系统判题
questionCountInteger题目总数

Socket 服务器信息由 PkApi.serverId() 接口(/api/v1/pk/users/{id}/td)下发(appId / roomId / userId)。


#功能HTTP路径服务码
1首页数据GET/api/v1/pk/user/{id}/home/pageSA101010
2全部可带头像GET/api/v1/pk/picture/student/{id}/picture/allSA101010
3设置头像GET/api/v1/pk/picture/student/{id}/add/head/portraitSA101010
4匹配检测GET/api/v1/pk/check/student/{id}/matchingSA101010
5提交对战结果POST/api/v1/pk/game/student/{id}/game/resultSA101010
6服务器信息GET/api/v1/pk/users/{id}/tdSA101010
7再来一局GET/api/v1/pk/check/student/{id}/again?subjectId=SA101010
8远程取题GET/api/v1/question/question/users/{id}/tags/{tag}SA101010
9弹窗列表GET/api/v1/match/student/{id}/popup/listSA101010
10弹窗修复GET/api/v1/match/student/{id}/popup/fixSA101010
11检查作业GET/api/v1/pk/check/student/{id}/homeWorkSA101010
12赛季封禁检查GET/api/v1/pk/check/student/{id}/season/ban?subjectId=SA101010
13可对战学科GET/api/v1/pk/user/{id}/home/subject?studentId=SA101010
14排名数据GET/api/v1/pk/rank/user/{id}SA101010
15对局结果GET/api/v1/pk/game/user/{id}/game/resultSA101010
16对战历史GET/api/v1/pk/game/user/{id}/game/historySA101010
17对局题目GET/api/v1/pk/game/user/{id}/game/questionSA101010
18PK 数据恢复GET/api/v1/pk/student/{id}/date/restoration?pkId=SA101010
19PK 连接检测GET/api/v1/pk/student/{id}/connection/check?pkId=SA101010
20晋级排名GET/api/v1/match/user/{id}/match/promotion/rankSA101010
21决赛排名GET/api/v1/match/user/{id}/match/final/rankSA101010
22提交赛事结果POST/api/v1/match/student/{id}/game/resultSA101010
23放弃比赛GET/api/v1/match/student/{id}/match/give/upSA101010
24赛事数据恢复GET/api/v1/match/student/{id}/date/restorationSA101010
25赛事连接检测GET/api/v1/match/student/{id}/race/connection/checkSA101010
26赛事题目/结果GET/api/v2/match/user/{id}/game/result/infoSA101010
27最近赛事GET/api/v1/match/student/{id}/recent/matchSA101010
28奖励体力GET/api/v1/match/{matchId}/student/{id}/reward/hpSA101010
29海选列表GET/api/v1/match/{matchId}/user/{id}/audition/listSA101010
30海选历史GET/api/v1/match/user/{id}/match/audition/detail/infoSA101010
31保存承诺书POST/api/v1/match/{matchId}/student/{id}/save/commitmentSA101010
32查询承诺书GET/api/v1/match/user/{id}/commitmentSA101010
33海选状态GET/api/v1/match/{matchId}/popups/student/{id}/audition/statusSA101010
34海选排名弹窗GET/api/v1/match/popups/student/{id}/audition/rankSA101010
35学生赛事成绩单GET/api/v1/grouping/task/{id}/TranscriptSA101010

以下实体类位于 sources/com/p039xh/abrustu/networkapi/entity/(部分在 common 包),用于各接口的请求/响应体。

请求体(Bean)

  • PkStudentGameBean(common/p063pk)—— 提交 PK 对局结果
  • CompetitionGameBean(common/p063pk)—— 提交赛事对局结果
  • PkRankRequest —— PK 排名查询参数
  • CptMatchRankRequest —— 晋级排名参数
  • CptMatchQuestionRequest —— 赛事题目查询参数
  • CptCommitmentRequest / CptCommitmentRequest.CommitmentListRequest —— 承诺书提交

响应体(Response)

  • PkHomeEntity(含多个内部类)—— 首页
  • MatchingEntity —— 匹配检测
  • ServerIdEntity —— Socket 服务器信息
  • PkQuestionBean —— 题目
  • MatchInspirePopupBean —— 激励弹窗
  • ChooseSubjectBean —— 学科
  • PkRankRespBean / PkRankBean —— 排名
  • PkGameResultBean / PkQuestionResultDto —— 对局结果
  • FightHistoryBean —— 对战历史
  • PkQuestionListBean / PkQuestionInfoBean / TagBean —— 对局题目
  • ConnectionCheckResponse —— PK 连接检测
  • RoundRankResponse —— 赛事排名
  • MatchDataRestorationResponse —— 赛事数据恢复
  • MatchConnectionCheckResponse —— 赛事连接检测
  • MatchResultInfoResponse —— 赛事题目结果
  • MatchAuditionRankResponse —— 海选排名
  • AuditionPopUpsResponse —— 海选排名弹窗
  • CptCommitmentResponse —— 承诺书查询
  • StudentGameBean(common/p061db/tableBean)—— 学生赛事成绩单

Socket 相关

  • SocketApi(common/socketv2/api)
  • PkSocketMsgRequest / SocketMsgRequest / BaseSocketMsgRequest(common/socketv2/request)

  1. 登录前置:所有接口均需用户登录,未登录时请求被拦截(不发送)。
  2. 服务码:竞技场全部接口固定使用服务码 "SA101010",指向后端竞技场微服务。
  3. 版本差异:接口 26(赛事题目/结果)使用 /api/v2/,其余均为 /api/v1/。
  4. 路径大小写:接口 35(学生赛事成绩单)路径含大写 Transcript,需注意。
  5. GET 携带请求体:多数”查询”接口使用 GET 且将对象字段作为 Query 参数提交(如排名、题目等)。
  6. URL 拼接:部分参数(subjectId、pkId、matchId、tagCode)直接以查询串或路径片段形式拼入 URL,并非 JSON 请求体。
  7. 实时对战:PK 对战的实时答题过程走 Socket,serverId 接口负责下发 Socket 房间信息,二者配套使用。