跳到主要内容

Webhook 自动化任务

设置入口

在问卷的全局设置中,选择"自动化"选项,然后点击"新建自动化任务"按钮。在执行动作中选择"发送 webhook"。

1752766207356

1752761088380

1752761120915

Webhook 配置说明

基础配置

  • 请求地址:必填,输入要发送请求的目标 URL,例如:https://api.example.com/webhook
  • 请求方法:支持 POST、PUT、PATCH、GET、DELETE,默认为 POST
  • 选择字段:必填,选择需要发送的数据字段,支持:
    • 问卷中的所有字段
    • 提交人信息
    • 提交时间
    • 更新时间
  • 超时时间:请求超时时间,单位为毫秒,默认 5000ms,范围 1000-60000ms

请求头配置

可以添加自定义的 HTTP 请求头:

  • Header 名称:请求头的键名
  • Header 值:请求头的值
  • 支持添加多个请求头

认证配置

支持以下认证方式:

  1. 无认证:默认选项,不使用认证
  2. Basic Auth
    • 需要配置用户名和密码
  3. Bearer Token
    • 需要配置 Token 值
  4. API Key
    • 需要配置 Header 名称(如:X-API-Key)
    • 需要配置 API Key 值

重试配置

当请求失败时的重试策略:

  • 启用重试:开启/关闭重试功能
  • 重试次数:失败后重试的次数,默认 3 次,范围 1-10 次
  • 重试间隔:两次重试之间的等待时间,单位为毫秒,默认 1000ms,范围 100-10000ms

使用说明

  1. 配置完成后,当用户提交问卷时,系统会自动向配置的 webhook 地址发送请求
  2. 请求中会包含所选择的字段数据
  3. 如果请求失败且启用了重试,系统会按照配置的重试策略进行重试
  4. 建议在正式使用前先测试 webhook 的连通性和数据格式

数据格式字典

webhook 请求体参数说明

{
"answer": {
"createTime": 1752764837570, // 创建时间戳
"updateTime": 1752764837584, // 更新时间戳
"creator": "1", // 创建者ID
"creatorName": "xx", // 创建者姓名
// 问题答案,key为题目ID,value为答案内容
"dmg6": {
// 单选题答案
"mevp": true // 选中选项ID
},
"g693": {
// 多选题答案
"ih3m": true // 选中选项ID
}
// ... 其他题目答案
},
"project": "Hs8ze3", // 项目ID
"survey": {
// 问卷结构定义
"id": "Hs8ze3", // 问卷唯一标识
"title": "问卷标题", // 问卷标题
"description": "问卷描述", // 问卷描述文本
"type": "survey", // 问卷类型
"repoId": 123, // 题库ID(如果是从题库创建)
"attribute": {
// 问卷属性
"mode": "survey", // 问卷模式
"submitButton": "提交", // 提交按钮文本
"suffix": "结束语", // 问卷结束语
"globalLogic": [] // 全局逻辑
},
"dataSource": [], // 数据源配置(用于级联、下拉等)
"tags": ["标签1", "标签2"], // 问卷标签
"children": [
// 问题列表
{
"id": "dmg6", // 题目ID
"type": "Radio", // 题目类型
"title": "单选题", // 题目标题
"attribute": {
// 题目属性
"required": true, // 是否必填
"width": 150 // 宽度设置(部分题型支持)
// ... 其他属性
},
"children": [
// 选项列表
{
"id": "mevp", // 选项ID
"title": "选项1", // 选项文本
"attribute": {} // 选项属性
}
],
"row": [
// 矩阵题行设置
{
"id": "row1",
"title": "行标题"
}
],
"optionGroupList": [
// 选项组(用于分组显示选项)
{
"title": "组标题",
"options": []
}
],
"locale": {
// 多语言配置
"en": {
// 语言代码
"title": "Title", // 对应语言的标题
"description": "Description" // 对应语言的描述
}
}
}
]
}
}

问卷结构类型说明

问卷结构(survey)包含以下主要字段:

  1. 基本信息

    • id: string - 问卷唯一标识
    • title: string - 问卷标题
    • description: string - 问卷描述
    • type: string - 问卷类型
    • repoId: number - 题库 ID(可选)
    • tags: string[] - 问卷标签列表
  2. 问题配置

    • attribute: 问卷属性对象
      • mode: 问卷模式
      • submitButton: 提交按钮文本
      • suffix: 结束语
      • globalLogic: 全局逻辑配置
    • dataSource: 数据源配置(用于级联、下拉等题型)
    • children: 问题列表
  3. 问题结构 每个问题(children 中的元素)包含:

    • id: string - 题目唯一标识
    • type: string - 题目类型
    • title: string - 题目标题
    • attribute: 题目属性对象
      • required: boolean - 是否必填
      • width: number - 宽度设置
      • 其他特定题型的属性
    • children: 选项列表(适用于单选、多选等)
    • row: 矩阵题行配置
    • optionGroupList: 选项分组配置
    • locale: 多语言配置对象
  4. 选项结构 问题选项(children 中的元素)包含:

    • id: string - 选项唯一标识
    • title: string - 选项文本
    • attribute: 选项属性对象
  5. 多语言支持 locale 对象支持多语言配置:

    {
    "语言代码": {
    "title": "对应语言的标题",
    "description": "对应语言的描述"
    }
    }

题目类型说明

问卷支持多种题目类型,每种类型的答案格式说明如下:

  1. Radio (单选题)

    {
    "题目ID": {
    "选项ID": true
    }
    }

    示例:

    {
    "dmg6": {
    "mevp": true // 选中了ID为mevp的选项
    }
    }
  2. Checkbox (多选题)

    {
    "题目ID": {
    "选项ID1": true,
    "选项ID2": "文本内容"
    }
    }

    示例:

    {
    "g693": {
    "ih3m": true, // 选中了ID为ih3m的选项
    "nn15": "1234" // 多选填空
    }
    }
  3. Select (下拉题)

    {
    "题目ID": {
    "选项ID": true
    }
    }

    示例:

    {
    "icnf": {
    "dmnx": true // 选中了ID为dmnx的选项
    }
    }
  4. Cascader (级联题)

    {
    "题目ID": {
    "选项ID": ["值1", "值2", "值3"] // 数组表示级联选择的路径
    }
    }

    示例:

    {
    "lc8a": {
    "e2ah": ["1", "1-1"] // 选择了第一级"选项1"和第二级"选项1-1"
    }
    }
  5. FillBlank (单行文本题)

    {
    "题目ID": {
    "填空ID": "文本内容"
    }
    }

    示例:

    {
    "ldah": {
    "s7hg": "用户输入的文本"
    }
    }
  6. Textarea (多行文本题)

    {
    "题目ID": {
    "填空ID": "多行文本内容"
    }
    }

    示例:

    {
    "gv81": {
    "mctm": "用户输入的\n多行文本"
    }
    }
  7. MultipleBlank (多项填空)

    {
    "题目ID": {
    "填空1ID": "内容1",
    "填空2ID": "内容2"
    }
    }

    示例:

    {
    "t4sn": {
    "kvbp": "第一个填空的答案",
    "y59p": "第二个填空的答案"
    }
    }
  8. MatrixFillBlank (矩阵填空)

    {
    "题目ID": {
    "行ID": {
    "列ID": "填空内容"
    }
    }
    }

    示例:

    {
    "k8xl": {
    "msuv": {
    // 第一行
    "wix0": "行1列1的答案",
    "k0bo": "行1列2的答案"
    },
    "tdm2": {
    // 第二行
    "wix0": "行2列1的答案",
    "k0bo": "行2列2的答案"
    }
    }
    }
  9. MatrixRadio (矩阵单选)

    {
    "题目ID": {
    "行ID": {
    "选中的列ID": true
    }
    }
    }

    示例:

    {
    "matrix1": {
    "row1": {
    "col2": true // 第一行选中了第二列
    },
    "row2": {
    "col1": true // 第二行选中了第一列
    }
    }
    }
  10. MatrixCheckbox (矩阵多选)

    {
    "题目ID": {
    "行ID": {
    "列ID1": true,
    "列ID2": true
    }
    }
    }

    示例:

    {
    "matrix2": {
    "row1": {
    "col1": true, // 第一行选中了第一列
    "col2": true // 第一行选中了第二列
    }
    }
    }
  11. Upload (文件上传)

    {
    "题目ID": {
    "fileList": [
    {
    "name": "文件名",
    "url": "文件URL"
    }
    ]
    }
    }

    示例:

    {
    "upload1": {
    "fileList": [
    {
    "name": "测试文件.pdf",
    "url": "https://example.com/files/test.pdf"
    }
    ]
    }
    }

注意事项

  1. 所有时间戳均为毫秒级时间戳
  2. 问卷 ID 和题目 ID 为系统自动生成的唯一标识
  3. 不同题目类型的答案格式会有所不同,请根据实际收到的数据进行解析
  4. 建议在开发时先通过测试数据了解具体的数据结构
  5. 矩阵类型题目的答案格式较为复杂,需要特别注意行 ID 和列 ID 的对应关系