You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 19:23:12