求助:通过Moodle Webservice API设置测验模块时间限制的参数问题
问题核心
要通过Moodle Webservice API设置测验的时间限制,官方要求使用timelimit[enabled]、timelimit[timeunit]、timelimit[number]三个参数,但按modules[0][timelimit[enabled]]这种嵌套格式传参时,会触发错误:
Unexpected keys (timelimit[enabled) detected in parameter array.
尝试过URL编码(modules[0][timelimit%5Benabled%5D])、转义、加引号等方法都无效,而UI创建测验时用的平级参数timelimit%5Bnumber%5D=45仅适用于单个测验编辑场景,无法满足多模块批量设置的需求。
解决方案
Moodle的Webservice API基于PHP的数组参数解析规则,正确的嵌套参数格式应该将timelimit作为一个完整的子数组层级,而非把键名拆进嵌套括号里:
1. URL参数格式(表单提交或GET请求)
modules[0][timelimit][enabled]=1 modules[0][timelimit][timeunit]=60 modules[0][timelimit][number]=45
对应的URL编码版本为:
modules%5B0%5D%5Btimelimit%5D%5Benabled%5D=1 modules%5B0%5D%5Btimelimit%5D%5Btimeunit%5D=60 modules%5B0%5D%5Btimelimit%5D%5Bnumber%5D=45
2. JSON请求格式(推荐用于批量操作)
如果API支持JSON格式传参,直接构造嵌套JSON结构更清晰:
{ "modules": [ { "timelimit": { "enabled": 1, "timeunit": 60, "number": 45 } } ] }
原理说明
之前的错误格式modules[0][timelimit[enabled]]会被PHP解析为modules[0]['timelimit[enabled'](缺失闭合括号),导致Moodle识别为非法键名。而正确的层级拆分modules[0][timelimit][enabled]会被解析为modules[0]['timelimit']['enabled'],完全符合Moodle对测验时间限制参数的结构要求。
内容的提问来源于stack exchange,提问作者Farhad

