使用Camunda HTTP Connector发送HTTP请求

配置

添加一个ServiceTask,在General面板中implementation的下拉菜单中选择Conector

image-20201230222425146

选择Conector之后,会新出现一个Tab页Connector,点击切换到这个标签页,在Connector Id输入框中添加http-connector

注意:这里必须填写http-connector,这是Camunda引擎中一个预置好的Connector的ID。

image-20201230222601620

然后在这个ServiceTask的Input Parameters配置中,向这个Connector输入三个参数:method、headers、url。

  • Name是method,Type是Text,Value是GET

    image-20201230223319382

  • Name是headers,Type是Map,点击Add Entry在下面添加键值对,Key为Accept,Value为application/json

    image-20201230224217048

  • Name是url,Type是Text,Value是https://reqres.in/api/users/${userId}

    image-20201230224317064

如果想要通过HTTP Body发送请求参数,那么就在Input Parameters中添加一个payload参数,类型设置为Map。

url设置的是提供HTTP服务的URL地址,当然你也不用自己专门去写一个Demo服务,也不需要费心思去部署它,已经有老外将一段演示用的代码部署在这个reqres.in网站上,通过这个API通过传入用户ID就可以查到这个用户的名字、邮箱、头像等信息,你可以先测试一下,打开浏览器访问https://reqres.in/api/users/1https://reqres.in/api/users/2, 将会看到一串JSON格式的HTTP响应:

image-20201230231604984

https://reqres.in/api/users/${userId},这里用到了一个流程实例变量,变量的名称是userId,使用变量的时候需要用美元符号和一对大括号将变量名包围起来,例如${userId}。

使用变量的好处是可以动态的构造请求URL,也就是在定义流程的时候不用“写死”了,那么这个变量在哪里设置呢?我们可以在StarEvent上为这个变量赋值,点击StartEvent,在Forms标签页新增一个表单字段,ID就是userId,类型是string。

image-20201230235726544

这样在Camunda Cockpit的TaskList管理界面的发起流程实例时,就会自动的生成这样一个表单输入框,输入的值就会被赋值给userId这个流程实例变量。

image-20210103225931128

只向服务器端发送HTTP请求是没有意义的,我们通常需要得到服务端的某些响应,例如,我们假设是要通过上面的API取得用户的邮箱地址。实现方案就是在Output Parameters添加一个输出值,Name为email,Type为Text,Value为${S(response).prop("data").prop("email")}

image-20210103220710861

这里的email相当于指定了一个流程实例变量名,注意这个Type的下拉选项中选的是Text,表示当这个ServiceTask执行完成之后,会向这个变量email中设置一个值,值的内容是Value表达式解析出来的值。美元符号与一对花括号中间的是一个表达式:

  • 表达式以大写字母开头,表示变量的类型是一个字符串。

  • response是一个关键字表示的这个HTTP Connector返回的原始的响应对象。

  • prop方法可以返回某个对象的属性,参照下面的响应结果,先解析出data对象,再解析出data对象中的email属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"data": {
"id": 1,
"email": "george.bluth@reqres.in",
"first_name": "George",
"last_name": "Bluth",
"avatar": "https://reqres.in/img/faces/1-image.jpg"
},
"support": {
"url": "https://reqres.in/#support-heading",
"text": "To keep ReqRes free, contributions towards server costs are appreciated!"
}
}

如果Output Parameters的Type选择的是Script,则可以在下面的Script Format输入框中输入JavaScript,Script Type下拉框中选择Inline Script

1
2
3
4
// 方式一:使用Camunda Spin(Camunda Spin是一个库,用于在JVM上进行简单的XML和JSON处理)

var u = S(connector.getVariable("response")).jsonPath("data.email").element();
org.camunda.spin.Spin.JSON(u).mapTo(java.util.Map.class);
1
2
3
4
// 方式二:使用jackson json lib

var u = S(connector.getVariable("response")).jsonPath("data.email").element();
new com.fasterxml.jackson.databind.ObjectMapper().readValue(u, java.util.Map.class);

验证

在ServiceTask执行完成之后,Output Parameters中指定的变量会被赋值,我们为了验证这个变量设置成功,可以简单的在EndEvent的监听器里,打印出这个变量的值。

image-20210103224901552

参考