华为云云实验免费名额接口踩坑:字段是 experiment_id,不是 experimentId
目标是把华为云云实验做成每日可自动跑的任务。按页面请求抄一遍参数,几乎所有沙箱接口都返回 experimentId不能为null。第一反应是字段名写错了,但照着报错文案改成 experimentId 反而更不对——真正生效的是 snake_case 的 experiment_id,报错信息里却拼成了驼峰。用 {"experiment_id": 2325} 一试,返回变成 lab instance not exist or has end,说明参数已被正确解析,这才确认是文案误导。
一、环境起不来的根因是时长为 0
参数改对后调 exercise/start,接口正常返回一个 operationStatisticsId,但轮询 exercise/get-instance-info 永远停在 status: "0",instance_info 一直是 null。日志里没有任何错误,只能从别的接口找线索。
GET .../hdsandboxuserservice/v1/user/get-user-times?experiment_id=<id> -> 0
POST .../hdsandboxschedulerservice/v1/exercise/confirm-use-free-slot
{"experiment_id": <int>} -> {"result": null} # 领到了
GET .../user/get-user-times?experiment_id=<id> -> 7200get-user-times 返回 0 才是根因:免费实验要先领当日名额,领完时长变 7200 秒,此时再调 start 才会真正开资源,十几秒后实例就出现。名额每人每天限领一次,重复领会返回 HD.31420017 no free slot。这类「前置状态没满足但接口不报错」的情况,靠轮询目标接口是查不出来的,得把相邻的状态查询接口也调一遍。
二、完整链路只有五个调用
base = "https://data.edu.huaweicloud.cn/rest/developer/user/hdsandboxschedulerservice"
1. POST /v1/exercise/check-operation-status {"experiment_id": id}
2. POST /v1/exercise/confirm-use-free-slot {"experiment_id": id}
3. POST /v1/exercise/start {"experiment_id": id}
4. POST /v1/exercise/get-instance-info {"experiment_id": id} # 轮询到非 null
5. POST /v1/exercise/heartbeat {"experiment_id": id} # 维持会话
6. POST /v1/exercise/manual-done {"experiment_id": id, "source": "MANUAL_CLICK"}
7. POST /v1/exercise/done / /v1/exercise/end {"experiment_id": id, "done_scene": "manual"}另外鉴权要单独换一次 JWT:只带浏览器 Cookie 调 data.edu.huaweicloud.cn 会报 token not found,需要先 POST /rest/developer/servlet/hdauthjwt/login,body 为 {"service": "edu.huaweicloud.cn"},取 result.token 放到后续请求的 Auth-Token 头里。这一步和 Cookie 作用域是两回事,漏了任何一个都会得到完全不同的报错。
三、有些实验根本不需要开环境
实验目录接口 warefree/experiment-list 里有个 manual_type 字段:1 是需要沙箱的实操实验,4 是纯手册实验。后者不调度任何云资源,对它调 manual-done 就会直接记录完成,几毛钱的资源都不会开出来。反过来,对沙箱实验调它会返回 not manual type。
所以按成本排序应该先试纯手册实验。行为上报是服务端异步的,官方口径最长 30 分钟,实测大约二十多分钟在任务列表里变成已完成,脚本里不要指望立即回查成功。
小结
这个模块最反直觉的三点:报错文案与真实字段名不一致、开不出环境却不返回错误、手册类实验压根不用开环境。跑之前把 get-user-times、manual_type 这些状态字段先读一遍,比对着页面请求硬抄要省很多时间。用完记得调 done/end 释放实例,别让云资源挂在账号上计费。
- 点赞
- 收藏
- 关注作者
评论(0)