变换

IBM® Verify 中应用 Webhook 时,需要联系远程系统,这些系统并非总是由租户管理员编写和部署。 由于这些远程系统可能会暴露严格的 API,因此可能需要对 Webhook 调用的请求或响应有效内容进行变异,以实现 Verify 与远程系统之间的功能集成。

为了实现此集成,Webhook 展示了称为变换的功能。 管理员可使用此功能来编写用于更改 HTTP 请求和响应的表达式。

Webhook 变换是一个 CEL 表达式,它的输出是包含已知键的映射。 这些键会映射到构成 HTTP 请求或响应的部分。 变换输出中的每个键都是可选的,如果未提供,则不会修改请求或响应的该部分。

传出变换

传出变换将应用于 HTTP 请求,然后再发送到 Webhook 目标。

下表显示了传出变换输入参数。
名称 类型 只读
body map[string]object N
header map[string]list[string] N
method string N
path string N
host string Y 仅当主机在所有已配置的 URL 之间一致时才存在。
可根据 CEL 规范来引用这些参数。
CEL 表达式是使用众所周知的键声明的映射,如以下示例所示。
{
  "body":body,
  "header":header,
  "path":path   
}
注意: 如果未进行任何更改,则无需包含键。 之前示例只是为了说明映射格式。
下表显示传出变换键。
名称 类型
body map[string]objectstring
header map[string]list[string]map[string]string
method string
path string
query map[string]stringmap[string]list[string]
skip_authentication boolean 如果设置为 true,那么不会使用已配置的认证机制。 对于变换向请求添加授权详细信息的情况,请使用此键。
title_case_bearer boolean 当接收方 API 要求使用大写字母才能正确处理请求头时,请使用此转换。 当设置为 true时,如果 标头 authorization 中存在授权类型指定 bearer 符,则将其转换为标题大小写(bearer -> Bearer)。

传入变换

传入变换将应用于 HTTP 响应,因为它是从已启动的 Webhook 接收到的。

下表显示传入变换输入参数。
名称 类型 只读
body map[string]object N
header map[string]list[string] Y
status_code integer Y
request map[string]object Y 包含输出转换参数。 例如, request.body 要访问原始请求正文。
注意:
  • 只有传入变换的主体是可修改的。 对 headerstatus_code 所做的更改不起作用。
  • 只有在验证状态码后才会启动传入变换。 确保适当设置了 Webhook 或资源的 expectedStatus 字段。

变换中的常见错误

您可能会遇到类似的常见问题。
数字等式失败
当对来自 HTTP 正文的数字执行比较时,相等检查可能无法按预期对数字起作用。 以下代码是有效内容的示例,CEL 已应用于该内容和输出。
body argument value:
{
  "value": 2
}
CEL:
{ 
  "body" : body.put("gte": body.value >= 2)
}
Result:
{
  "value":2,
  "gte": false
}

此结果是因为 body.value 表达式生成小数值。 作为 JSON,根据定义,数字不是整数。 强制类型转换会更正行为。 请参阅以下示例。

Incoming body:
{
  "value": 2
}
CEL:
{
   "body" : body.put("gte": int(body.value) >= 2)
}
Result:
{
  "value":2,
  "gte": true
}
从请求中移除正文
某些 API 可能要求将所有信息都包含在 ` URL ` 和请求头中,并且请求主体中不包含任何内容。 对于这些 API,可能需要进行转换,以从请求中移除发出的 HTTP 主体。 要从发出的请求中移除正文,请执行以下操作。
  • 将内容类型设置为空字符串。
  • 将 HTTP 的值设置为空字符串。

以下示例演示了如何在发送转换过程中移除正文:

CEL:
{
  "body":"",
  "header": header.put("content-type","")
}