Skip to main content

常用组件示例-InvokeHTTP

在编排流程场景开发过程中,涉及请求 HTTP 服务时会用到 InvokeHTTP 组件。InvokeHTTP 作为 HTTP 客户端,可以发起常用的GET、POST、PUT、DELETE、PATCH请求,也可以发起自定义的请求类型;且支持传递所有类型的 HTTP 请求参数。

一、组件功能

InvokeHTTP 组件作为 HTTP 客户端可以与可配置的 HTTP 服务端交互;目标 URL 和 HTTP 方法是可配置的。当 HTTP 方法为 PUT、POST 或 PATCH 时,流文件内容将作为请求正文发送,并且流文件属性会根据配置选择性地转换为 HTTP Header。

二、使用场景

  • GET请求:Query 参数
  • POST请求:application/json 参数
  • POST请求:application/x-www-form-urlencoded 参数
  • POST请求:multipart/form-data 参数
  • 请求Header参数:Basic Auth

以上场景,基本包含了开发过程中常用的HTTP请求场景。

三、属性说明

1. 属性配置

  • HTTP方法:HTTP请求方法(GET、POST、PUT、PATCH、DELETE、HEAD、OPTIONS),也支持自定义方法
  • 远程URL:要调用的HTTP服务的URL,包括协议、IP、端口和请求路径
  • Content-Type:请求的Content-Type参数,标识请求参数报文类型
  • 发送消息内容:是否将流文件内容作为 POST/PUT/PATCH 请求上的HTTP消息正文(默认发送)。如果为 false,则禁止发送
  • 以上为比较关键的属性配置,其余属性按需设置即可

属性设置 属性设置

四、场景示例

以请求公网 HTTP 接口http://httpbin.org/anything 为例,该接口接受任何类型请求,也可以接受任何类型请求参数,且会将请求参数放在响应报文中,方便观察

{
"args": {},
"data": "",
"files": {},
"form": {
"client_id": "3MVG91DJxn49wADx.NYGql49.5cBsoTI7fj5wpnAMXqrMML2T4VIf98t9uqM0rNhd.ZzLw0.CfV9t07JRr_Dv",
"client_secret": "9D9F6F349B0FD1861ED2E48D880B7F774BD2763444E1555EBA3F9DCE873E7593",
"grant_type": "password",
"password": "lkf123$%^&*",
"username": "likaifeng@datagile.cn.sap"
},
"headers": {
"Accept-Encoding": "gzip",
"Content-Length": "560",
"Content-Type": "multipart/form-data;boundary=----jhqxhpd3fti",
"Date": "Thu, 07 Dec 2023 02:21:21 GMT",
"Host": "httpbin.org",
"User-Agent": "okhttp/3.14.9",
"X-Amzn-Trace-Id": "Root=1-65712c21-1f8dca8260d79b3f1d8c7f9c"
},
"json": null,
"method": "POST",
"origin": "112.5.64.252",
"url": "http://httpbin.org/anything"
}

1. GET请求:Query参数

发送GET请求,传递请求2个Query参数,请求curl示例如下:

curl -XGET "http://httpbin.org/anything?name=le.zw&id=10000"

在 InvokeHTTP 中配置示例如下:

配置

Query参数是直接拼接在URL中,所以只需要配置请求方法和请求URL即可,如果想通过变量方式赋值给Query参数,只需要用变量表达式即可,比如:

远程URL属性支持表达式语言

http://httpbin.org/anything?name=${name}&id=${id}

上面配置运行以后返回数据如下:

{
"args": {
"id": "10000",
"name": "le.zw"
},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept-Encoding": "gzip",
"Date": "Thu, 07 Dec 2023 09:53:33 GMT",
"Host": "httpbin.org",
"User-Agent": "okhttp/3.14.9",
"X-Amzn-Trace-Id": "Root=1-6571961e-6456d37873909f5056e295b2"
},
"json": null,
"method": "GET",
"origin": "112.5.64.252",
"url": "http://httpbin.org/anything?name=le.zw&id=10000"
}

可以看到 args 中包含请求时传递的2个Query参数

2. POST请求:application/json参数

如果请求需要传递 JSON 数据作为 Body 参数,那么此时 InvokeHTTP 配置如下。

配置 配置

框起来的部分是必须配置的项,发送消息内容表示将流文件内容作为 POST/PUT/PATCH 请求上的HTTP消息正文 然后将流文件内容设置为要发送的 JSON 数据即可:

{
"id": 10000,
"name": "le.zw"
}

上面配置运行以后返回数据如下:

{
"args": {},
"data": "{\n\t\"id\": 10000,\n\t\"name\": \"le.zw\"\n}",
"files": {},
"form": {},
"headers": {
"Accept-Encoding": "gzip",
"Content-Length": "34",
"Content-Type": "application/json",
"Date": "Thu, 07 Dec 2023 10:11:27 GMT",
"Host": "httpbin.org",
"User-Agent": "okhttp/3.14.9",
"X-Amzn-Trace-Id": "Root=1-65719a50-2e6c55090c8b9c9157158623"
},
"json": {
"id": 10000,
"name": "le.zw"
},
"method": "POST",
"origin": "112.5.64.252",
"url": "http://httpbin.org/anything"
}

这里以发送 JSON 数据为例,发送 XML 或文本数据也是类似的方式进行配置

3. POST请求:application/x-www-form-urlencoded参数

  1. application/x-www-urlencoded:数据被编码成以'&'分隔的键-值对, 同时以'='分隔键和值,非字母或数字的字符会被进行URLEncoded
  2. 与Query的区别在于,Query 参数定义在请求URL,而 x-www-urlencoded 需要定义在流文件内容里面

配置

在调用 InvokeHTTP 之前,可以使用 ReplaceText,将流文件内容设置为请求参数,需要注意 application/x-www-form-urlencoded 需要对数据进行编码,所以可以用下面的方式设置请求参数:

id=${id:urlEncode()}&name=${name:urlEncode()}&...

除了设置流文件内容设置为 UrlEncoded 后的键值对,还需要设置 InvokeHTTP 的两个配置:

  1. 发送消息内容选项设置为发送
  2. Content-Type选项设置为 application/x-www-form-urlencoded

以上配置完成后,启动流程通过 InvokeHTTP 发起调用,测试流程中返回结果如下:

{
"args": {},
"data": "",
"files": {},
"form": {
"id": "10000",
"name": "le.zw"
},
"headers": {
"Accept-Encoding": "gzip",
"Content-Length": "19",
"Content-Type": "application/x-www-form-urlencoded",
"Date": "Fri, 08 Dec 2023 04:00:22 GMT",
"Host": "httpbin.org",
"User-Agent": "okhttp/3.14.9",
"X-Amzn-Trace-Id": "Root=1-657294d6-175b15a27a9a1d1347744501"
},
"json": null,
"method": "POST",
"origin": "112.5.64.252",
"url": "http://httpbin.org/anything"
}

4.POST请求:multipart/form-data参数

multipart/form-data 重要规范特征

  • 必须post方式发送数据;
  • Content-Type 格式为 multipart/form-data; boundary=${boundary}

例如 chrome 和 safari 浏览器,自动创建的boundary格式像下面这个样子,其中boundary是长度为16的随机base64字符:

Content-Type: multipart/form-data; boundary=----WebKitFormBoundary222BPd3etU0TLTOv

除了 Content-Type 格式要求,对于数据内容也是有相应格式:

  • 发送数据内容以------WebKitFormBoundary?${boundary}作为起始标记和分隔符,结束标记多了--
  • 数据内容主要包括:Content-Disposition、Content-Type、数据内容等;
  • 其中数据内容前面有\n\r标记的空行;Content-Disposition是必选项,其它都是可选项;
  • Content-Disposition 包含了 type 和 一个名字为 name 的 parameter,type 是 form-data,name 参数的值则为表单控件的名字,如果是文件,那么还有一个 filename 参数,值就是文件名。
------WebKitFormBoundarywKADO5urZL0xelAF
Content-Disposition: form-data; name="name"


------WebKitFormBoundarywKADO5urZL0xelAF
Content-Disposition: form-data; name="time"

1586232882192
------WebKitFormBoundarywKADO5urZL0xelAF
Content-Disposition: form-data; name="f"

[object FileList]
------WebKitFormBoundarywKADO5urZL0xelAF--

在编排平台中,有两种方式可以发送 multipart/form-data 请求参数

方式一:流文件内容中手动设置请求参数格式

配置

除了设置流文件内容为上图中格式外,还需要设置 InvokeHTTP 的两个配置:

  1. 发送消息内容选项设置为发送
  2. Content-Type选项设置为 multipart/form-data;boundary=----jhqxhpd3fti(这里 boundary 的值必须和流文件内容参数中保持一致)

以上配置完成后,启动流程通过 InvokeHTTP 发起调用,测试流程中返回结果如下:

{
"args": {},
"data": "",
"files": {},
"form": {
"id": "10000",
"name": "le.zw"
},
"headers": {
"Accept-Encoding": "gzip",
"Content-Length": "155",
"Content-Type": "multipart/form-data;boundary=----jhqxhpd3fti",
"Date": "Fri, 08 Dec 2023 06:24:53 GMT",
"Host": "httpbin.org",
"User-Agent": "okhttp/3.14.9",
"X-Amzn-Trace-Id": "Root=1-6572b6b6-59af04794769ed0c6d27c2ef"
},
"json": null,
"method": "POST",
"origin": "112.5.64.252",
"url": "http://httpbin.org/anything"
}

方式二:InvokeHTTP通过动态属性设置form-data参数

配置

InvokeHTTP 新增属性,属性key设置为 post:form:f参数字段名,属性值设置为参数字段值

除了新增 InvokeHTTP 属性,还需要设置 InvokeHTTP 的两个配置:

  1. 发送消息内容选项设置为发送
  2. Content-Type选项设置为 multipart/form-data

以上配置完成后,启动流程通过 InvokeHTTP 发起调用,测试流程中返回结果如下:

{
"args": {},
"data": "",
"files": {
"boundary": ""
},
"form": {
"key": "le.zw"
},
"headers": {
"Accept-Encoding": "gzip",
"Content-Length": "350",
"Content-Type": "multipart/form-data; boundary=cf741204-bc20-40f8-9495-964dce41c5f1",
"Date": "Wed, 06 Dec 2023 03:57:50 GMT",
"Host": "httpbin.org",
"User-Agent": "",
"X-Amzn-Trace-Id": "Root=1-656ff13f-1f439e175a41dfb019c82715"
},
"json": null,
"method": "POST",
"origin": "60.249.28.127",
"url": "http://httpbin.org/anything"
}

5. 请求Header参数:Basic Auth

上面几个示例介绍了如何使用 InvokeHTTP 来传递 Query 和 Body 参数,在调用 HTTP 服务过程中,请求 Header 参数也是很常用的一种,这里以 Basic Auth 认证为例:

  1. 在HTTP中,Basic Auth是一种在请求时提供用户名和密码的一种登录验证方式
  2. 其中用户名和密码传递的形式是这样的(在Header参数中传递):
Authorization: Basic base64encode(username+":"+password)

综上,在 InvokeHTTP 组件中使用Basic Auth,需要传递动态Header参数,传递Header参数的配置如下:

配置

  1. Header 参数通过 InvokeHTTP 组件新增动态参数来进行传递
  2. 与form-data参数的区别在于form-data参数设置动态属性名时必须按照指定格式,Header参数不需要
# 这里通过属性表达式直接对用户名密码进行Base64编码
Basic ${username:append(':'):append(${password}):base64Encode()}

以上配置完成后,启动流程通过 InvokeHTTP 发起调用,测试流程中返回结果如下:

{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept-Encoding": "gzip",
"Authorization": "Basic bGUuenc6cGFzc3cwcmQ=",
"Date": "Fri, 08 Dec 2023 06:51:06 GMT",
"Host": "httpbin.org",
"User-Agent": "okhttp/3.14.9",
"X-Amzn-Trace-Id": "Root=1-6572bcdb-59ed3f724f88f6c42bc03914"
},
"json": null,
"method": "GET",
"origin": "112.5.64.252",
"url": "http://httpbin.org/anything"
}

五、注意事项

  • InvokeHTTP组件有5条输出连线
Failure:连接失败,超时或一般异常时输出到此连线。
Original:请求报文将在请求成功后输出到此连线(2xx状态代码)。
No Retry:请求接收到不应重试的状态代码(1xx,3xx,4xx状态代码)时输出到此连线。
Response:请求成功(2xx状态代码)后,远程响应信息将作为数据流输出到此连线。 如果`总是响应输出`属性配置为 true,则无论收到何种状态码,响应都将发送到此连线。
Retry:在接收到重试的状态代码(5xx状态代码)时输出到此连线。

注意:Response连线是请求返回的响应内容; Original连线是请求成功后原始的请求参数,其余连线都是和请求失败相关,需要自行处理
  • 响应的HTTP状态码、响应Header参数等信息在Response连线输出的流文件属性中,需要可以自行获取
  • 本文档的场景中介绍时以POST请求为例,其余的PUT、DELETE等请求传递参数也是相同的配置

六、流程模板

下载后导入编排平台运行:

参见附件(请右键另存保存):InvokeHTTP