常用组件示例-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参数
- application/x-www-urlencoded:数据被编码成以'&'分隔的键-值对, 同时以'='分隔键和值,非字母或数字的字符会被进行URLEncoded
- 与Query的区别在于,Query 参数定义在请求URL,而 x-www-urlencoded 需要定义在流文件内容里面
在调用 InvokeHTTP 之前,可以使用 ReplaceText,将流文件内容设置为请求参数,需要注意 application/x-www-form-urlencoded 需要对数据进行编码,所以可以用下面的方式设置请求参数:
id=${id:urlEncode()}&name=${name:urlEncode()}&...
除了设置流文件内容设置为 UrlEncoded 后的键值对,还需要设置 InvokeHTTP 的两个配置:
发送消息内容
选项设置为发送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 的两个配置:
发送消息内容
选项设置为发送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 的两个配置:
发送消息内容
选项设置为发送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 认证为例:
- 在HTTP中,Basic Auth是一种在请求时提供用户名和密码的一种登录验证方式
- 其中用户名和密码传递的形式是这样的(在Header参数中传递):
Authorization: Basic base64encode(username+":"+password)
综上,在 InvokeHTTP 组件中使用Basic Auth,需要传递动态Header参数,传递Header参数的配置如下:
- Header 参数通过 InvokeHTTP 组件新增动态参数来进行传递
- 与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