触发器
触发器概述
触发器为指定流程入口,触发器批能定义在init { }初始块中,一个流程可编写多个触发器。触发器有以下两种类型:
- 基础触发器:dsl流程中自带的触发器,任何时候可以使用。
- 应用触发器:特定应用附带的触发器,只有在
config.groovy配置后才可以使用。
目前支持两种基础触发器:
cron定时触发器,基于cron表达示定时触发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" | Integer | 123 |
"3.14" | Double | 3.14 |
"true" 或 "false" | Boolean | true / false |
"hello" | String | "hello" |
注意:JSON和XML请求体中的数据会保持原有的数据类型,不会进行二次转换。