Moodle External Web Services请求参数接收异常排查求助
问题原因及解决方案
核心问题:Moodle外部API的参数验证时机早于你的代码逻辑
Moodle的external_api框架会在调用你的receive_salesforce_data方法之前自动完成请求参数的解析与验证,你在方法内部写的JSON解码、补全data字段的逻辑根本没机会执行——因为参数验证失败后,请求直接被拦截返回错误了。
具体原因分析
你的API参数定义(receive_salesforce_data_parameters)要求请求的根JSON结构必须包含一个data字段,且该字段是符合职位数据结构的关联数组。但你发送的请求大概率是直接将职位数据放在JSON根级,没有包裹在data对象中,导致Moodle的参数验证器直接判定缺失data字段。
解决方案
方案1:调整请求格式(推荐,符合现有API定义)
将请求的JSON数据包裹在data字段中,示例格式如下:
{ "data": { "title": "后端开发工程师", "description": "负责Moodle插件开发与维护", "company": "XX科技", "location": "Hybrid", "deadline": 1720000000, "type": "job", "note": "优先考虑有Moodle经验的候选人", "tags": "PHP,MySQL,Moodle", "targets": ["计算机专业毕业生", "在职工程师"] } }
方案2:修改API参数定义(无需调整请求格式)
如果不想修改请求格式,可以直接修改参数定义,去掉外层的data结构,直接接收各个职位字段:
public static function receive_salesforce_data_parameters() { return new external_function_parameters( [ 'title' => new external_value(PARAM_TEXT, 'Job title'), 'description' => new external_value(PARAM_RAW, 'Job description in markdown or HTML'), 'company' => new external_value(PARAM_TEXT, 'Company name'), 'location' => new external_value(PARAM_TEXT, 'Work location (Hybrid, Online, Office)', VALUE_OPTIONAL), 'deadline' => new external_value(PARAM_INT, 'Application deadline (Unix timestamp)'), 'type' => new external_value(PARAM_ALPHANUMEXT, 'Type (job or internship)'), 'note' => new external_value(PARAM_TEXT, 'HR or Account manager notes', VALUE_OPTIONAL), 'tags' => new external_value(PARAM_TEXT, 'Comma-separated skill tags'), 'targets' => new external_multiple_structure(new external_value(PARAM_TEXT, 'Target categories')) ] ); }
同时修改方法体,去掉多余的JSON解码逻辑(Moodle会自动将解析好的参数传入):
public static function receive_salesforce_data($title, $description, $company, $location = null, $deadline, $type, $note = null, $tags, $targets) { global $DB; // 直接使用传入的参数即可 error_log("[Salesforce API] Received job data: " . json_encode([ 'title' => $title, 'description' => $description, 'company' => $company ])); // ... 后续数据处理逻辑 }
内容的提问来源于stack exchange,提问作者Basile
相关产品推荐
相关产品推荐

