Skip to content

触发器

触发器概述

触发器为指定流程入口,触发器批能定义在init { }初始块中,一个流程可编写多个触发器。触发器有以下两种类型:

  1. 基础触发器:dsl流程中自带的触发器,任何时候可以使用。
  2. 应用触发器:特定应用附带的触发器,只有在config.groovy配置后才可以使用。

目前支持两种基础触发器:

  1. cron定时触发器,基于cron表达示定时触发
  2. webhookhttp触发器,通过指定http 的API来触发

触发器基础语法

listen 触发器实例 触发方法 触发参数

说明:

  • listen 为触发器固定关键字
  • 触发器实例 基础触发器为固定的名字,如果是应用触发器则为应用的实例名称
  • 触发方法 触发器实例所支持的触发方法,通常是on或以on开头。
  • 触发参数 触发方法所需的参数

示例:

init {
  listen cron on '* */5 * * * ?' //每5分钟自动触发
  listen webhook on '/test' 		//在浏览器中访问/test来触发
  listen wechat on "text"				//应用触发器:当微信公众号中用户发来文本消息时触发
}

cron 触发器

基于cron的定时触发器,cron为六字段格式即秒 分 时 日 月 周详细语法与Spring cron 一至。

触发器语法: listen cron on '表达式'

基本示例

init {
  listen cron on '* */5 * * * ?' // 每5分钟触发一次
}

注意事项

  • cron触发器只能写在init { } 初始模块中
  • cron触发器暂不支持带入参数,后续会加入参数设置,用于区分多个定时触发器对应不同的场景。

webhook 触发器

通过http 访问来触发,支持以下匹配方式 :

  • listen webhook on '/访问路径' url 完整匹配
  • listen webhook on '{ }' 自定义匹配,可匹配路径、方法、请求头等 http相关参数..
  • listen webhook onRequest { } 实时匹配 (未实现) ,每次都传入HttpServletRequest对象实时计算是否满足匹配条件。

url 完整匹配示例

listen webhook on '/user/getInfo'

最终访问路径是:{webhookRootPath}/user/getInfo webhookRootPath指apiFlow服务引擎对应webhook服务根路径。默认路径如下:

自定义匹配示例

listen cron on {
  path = '/user/getInfo'
  method ="GET"
}

只有当条件都满足时就才会触发流程。 目前仅支持路径和方法匹配后续计划支持更多的匹配条件。

注意:同一个http请求触发了多个流程,仅最先匹配的流程会被触发,且不会计算优先级

请求参数获取

通过webhook带入的http参数会自动转换成input对象 ,转换规则如下:

  • URL中带的query参数会直接放input
  • 请求体中x-www-form-urlencoded 或form-data类型的数据直接放置到input
  • 直接放置到input中参数会基于正则自动转换类型支持:数字、布尔、浮点数
  • 请求体中json或xml类型的数据会自动解析成对象后放置到input.body

示例1:URL参数

工作流定义

init {
    listen webhook on '/user/info'
}

task = CODE {
    log.info "用户ID: ${input.id}"        // 输出: 用户ID: 123 (数字类型)
    log.info "用户名: ${input.name}"      // 输出: 用户名: xiaomi
    log.info "是否激活: ${input.isActive}" // 输出: 是否激活: true (布尔类型)
}

请求方式

bash
curl 'http://127.0.0.1:8080/api-test/user/info?id=123&name=xiaomi&isActive=true'

示例2:JSON请求体

工作流定义

init {
    listen webhook on '/user/create'
}

task = CODE {
    // JSON数据会解析后放入 input.body
    log.info "用户名: ${input.body.name}"
    log.info "年龄: ${input.body.age}"
    log.info "邮箱: ${input.body.email}"

    // 访问嵌套对象
    log.info "城市: ${input.body.address.city}"
}

请求方式

bash
curl -X POST 'http://127.0.0.1:8080/api-test/user/create' \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "张三",
    "age": 25,
    "email": "zhangsan@example.com",
    "address": {
      "city": "北京",
      "street": "朝阳区"
    }
  }'

示例3:表单数据(form-data / x-www-form-urlencoded)

工作流定义

init {
    listen webhook on '/user/update'
}

task = CODE {
    // 表单数据直接放入 input(自动类型转换)
    log.info "用户ID: ${input.id}"        // 123 (数字类型)
    log.info "用户名: ${input.name}"      // 李四
    log.info "年龄: ${input.age}"         // 30 (数字类型)
}

请求方式(form-data)

bash
curl -X POST 'http://127.0.0.1:8080/api-test/user/update' \
  -F 'id=123' \
  -F 'name=李四' \
  -F 'age=30'

请求方式(x-www-form-urlencoded)

bash
curl -X POST 'http://127.0.0.1:8080/api-test/user/update' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'id=123&name=李四&age=30'

示例4:混合参数(URL参数 + JSON请求体)

工作流定义

init {
    listen webhook on '/order/create'
}

task = CODE {
    // URL参数直接放入 input
    log.info "用户ID: ${input.userId}"      // 来自URL参数
    log.info "操作: ${input.action}"        // 来自URL参数

    // JSON请求体放入 input.body
    log.info "商品ID: ${input.body.productId}"
    log.info "数量: ${input.body.quantity}"
    log.info "总价: ${input.body.totalPrice}"
}

请求方式

bash
curl -X POST 'http://127.0.0.1:8080/api-test/order/create?userId=456&action=create' \
  -H 'Content-Type: application/json' \
  -d '{
    "productId": "P001",
    "quantity": 2,
    "totalPrice": 199.8
  }'

注意:如果url参数带了名为body的参数同时又带了请求体将会报错

示例5:XML请求体

工作流定义

init {
    listen webhook on '/data/import'
}

task = CODE {
    // XML数据会解析后放入 input.body
    log.info "ety: ${input.body.user}"
    log.info "用户名: ${input.body.user.name}"
    log.info "用户年龄: ${input.body.user.age}"  
    log.info "用户ID: ${input.body.user.id}"  // 访问属性
}

请求方式

bash
curl -X POST 'http://127.0.0.1:8080/api-test/data/import' \
  -H 'Content-Type: application/xml' \
  -d '<data>
    <user id="789">
      <name>王五</name>
      <age>28</age>
    </user>
  </data>'

注意:xml转换时不区分类型 所以上例中input.body.user.age是一个字符串类型

参数类型自动转换说明

对于直接放入input的参数(URL参数、表单数据),系统会基于正则表达式自动识别并转换类型:

原始值转换后类型示例
"123"Integer123
"3.14"Double3.14
"true""false"Booleantrue / false
"hello"String"hello"

注意:JSON和XML请求体中的数据会保持原有的数据类型,不会进行二次转换。

下一步