使用Camunda HTTP Connector发送HTTP请求
配置
添加一个ServiceTask
,在General面板中implementation的下拉菜单中选择Conector
:
选择Conector之后,会新出现一个Tab页Connector
,点击切换到这个标签页,在Connector Id输入框中添加http-connector
:
注意:这里必须填写
http-connector
,这是Camunda引擎中一个预置好的Connector的ID。
然后在这个ServiceTask的Input Parameters配置中,向这个Connector输入三个参数:method、headers、url。
Name是
method
,Type是Text
,Value是GET
。
Name是
headers
,Type是Map
,点击Add Entry在下面添加键值对,Key为Accept
,Value为application/json
。
Name是
url
,Type是Text
,Value是https://reqres.in/api/users/${userId}
。
如果想要通过HTTP Body发送请求参数,那么就在Input Parameters中添加一个payload参数,类型设置为Map。
url设置的是提供HTTP服务的URL地址,当然你也不用自己专门去写一个Demo服务,也不需要费心思去部署它,已经有老外将一段演示用的代码部署在这个reqres.in网站上,通过这个API通过传入用户ID就可以查到这个用户的名字、邮箱、头像等信息,你可以先测试一下,打开浏览器访问https://reqres.in/api/users/1
或https://reqres.in/api/users/2
, 将会看到一串JSON格式的HTTP响应:
https://reqres.in/api/users/${userId}
,这里用到了一个流程实例变量,变量的名称是userId,使用变量的时候需要用美元符号和一对大括号将变量名包围起来,例如${userId}。
使用变量的好处是可以动态的构造请求URL,也就是在定义流程的时候不用“写死”了,那么这个变量在哪里设置呢?我们可以在StarEvent上为这个变量赋值,点击StartEvent,在Forms标签页新增一个表单字段,ID就是userId,类型是string。
这样在Camunda Cockpit的TaskList管理界面的发起流程实例时,就会自动的生成这样一个表单输入框,输入的值就会被赋值给userId这个流程实例变量。
只向服务器端发送HTTP请求是没有意义的,我们通常需要得到服务端的某些响应,例如,我们假设是要通过上面的API取得用户的邮箱地址。实现方案就是在Output Parameters添加一个输出值,Name为email
,Type为Text
,Value为${S(response).prop("data").prop("email")}
。
这里的email相当于指定了一个流程实例变量名,注意这个Type的下拉选项中选的是Text,表示当这个ServiceTask执行完成之后,会向这个变量email中设置一个值,值的内容是Value表达式解析出来的值。美元符号与一对花括号中间的是一个表达式:
表达式以大写字母开头,表示变量的类型是一个字符串。
response是一个关键字表示的这个HTTP Connector返回的原始的响应对象。
prop方法可以返回某个对象的属性,参照下面的响应结果,先解析出data对象,再解析出data对象中的email属性。
1 | { |
如果Output Parameters的Type选择的是Script
,则可以在下面的Script Format输入框中输入JavaScript
,Script Type下拉框中选择Inline Script
:
1 | // 方式一:使用Camunda Spin(Camunda Spin是一个库,用于在JVM上进行简单的XML和JSON处理) |
1 | // 方式二:使用jackson json lib |
验证
在ServiceTask执行完成之后,Output Parameters中指定的变量会被赋值,我们为了验证这个变量设置成功,可以简单的在EndEvent的监听器里,打印出这个变量的值。