仅 DataPower API Gateway

使用 switch 策略条件编辑器

switch 策略条件编辑器提供了一个用户界面,可帮助您在 switch 策略中为 case 子句构建条件。

可使用添加组添加条件选项以及运算符选择和预提供的函数选择来构建条件脚本。 输出字段显示所生成的条件脚本,并在您构建条件时动态更新。

添加条件

打开策略条件编辑器时,已预提供初始条件,可供您随时进行配置。

使用下拉列表选择用于开始构建条件的函数。

API Connect 中的 JSONata 支持

API Connect 支持 JSONata 规范的 v2.0 ,但存在以下限制:

  • 如果使用 JSONata 表达式来抽取或编辑字段,那么该字段的软链接副本也会受 "抽取" 或 "编辑" 策略影响,即使这些字段存在于不同位置也是如此。
  • API Connect 不支持高阶 JSONata 函数 (处理其他函数的函数)。
  • 如果 API Connect 支持的 JSONata 函数调用高阶函数作为自变量,那么该自变量不受支持 (因为缺少对高阶函数的支持)。
  • 不支持以下 JSONata v2.0 函数:
    • $eval()
    • $sift()
    • $each()
    • $error()
    • $assert()
    • 支持 $fromMillis() ,但存在以下限制:
      • $fromMillis() 参数支持的数字范围为-5364662400000 - 2903299199000。
        • 小于-5364662400000的值使用-5364662400000。 换句话说,将时间戳报告为 1800-01-01T00:00:00Z。
        • 大于2903299199000的值使用2903299199000。 换句话说,将时间戳报告为 2261-12-31T23:59:59Z。
  • 支持 $now() ,但存在以下限制:
    • 不支持以下组件说明符:
      • W = 一年中的周
      • w = 每月的周
      • X = ISO 周编号年份
      • x = ISO 周编号月份
    • 不支持将数字表示为单词,因此不支持以下演示文稿修饰符:
      • W = 大写单词 (例如: [YW] => 两千和二十四)
      • w = 小写单词 (例如: [Yw] => 2 000 和 24)
      • Ww = 标题大小写单词 (例如: [YWw] => 2 千和 24)
    • 错误消息是通用的。

表 1 列出了可用于标准 JSONata 表示法的功能扩展。 每个扩展对应于 API 上下文的一部分。

表 1. JSONata 的函数扩展
扩展 变量 描述
$apiCtx() 对 API 上下文的通用访问权 $apiCtx() 扩展提供对 API 上下文的通用访问权。
  • 抽取操作中的样本变换字段:
    "$apiCtx().request.uri"
  • 切换操作中案例的样本条件:
    "$apiCtx().request.path = '/simple/apictx-function'"
$header(name) message.headers.name 消息头
$httpVerb() request.verb 请求的 HTTP 方法
$operationID() api.operation.id 操作标识
$operationPath() api.operation.path 操作路径
$queryParameter('name')
  • request.parameters.name.locations

    受支持的关键字为 query

  • request.parameters.name.values
request.parameters.name.locations 中搜索 query 的索引,并返回 request.parameters.name.values[index],其中 [index] 是位置中 query 的值。 参数值不是解码的 URL。
$statusCode() message.status.code 状态码
$storageType([arg]) variable.body

您可在 API 上下文中指定任意变量。 如果未指定任何变量,那么将使用缺省变量 message.body

消息的存储类型。 受支持的值为 binaryemptygraphqljsonstreamxml
$urlParameter('name')
  • request.parameters.name.locations

    受支持的关键字为 pathquery

  • request.parameters.name.values
request.parameters.name.locations 中搜索 pathquery 的索引,并从 request.parameters.name.values 返回同时包含 pathquery 值的单个数组。 在 URL 包含 path 和 query 参数值时,数组先包含 path 值,后跟 query 值。 按照接收顺序添加每个参数类型的值。 参数值为解码的 URL。
例如,以下 URL 包含 path 和 query 参数值。
http://example.com/petstore/cats/adopt?breed=Sphynx&breed=Siamese
$urlParameter('breed') URL 将返回以下值数组。
[cats, adopt, Sphynx, Siamese]

在此示例中,该 URL 包含配置为 /petstore/{breed}/{breed} 的 API 路径,其中,breed 配置为 API 路径的路径参数。 因此,在输出中将包含 catsadopt

$xpath(path, xpathExpression) 您可在 API 上下文中指定任意可写变量。 xpathExpression 必须是文字字符串。 允许使用 XPath 表达式。 以下示例指定来源中的所有 price 元素。
$xpath($, '//price')

表 2 列出了可用于 GraphQL API 的功能扩展。

表 2. JSONata for GraphQL 的功能扩展
扩展 变量 描述
$gqlActiveOperation([graphql_message]) message.body 获取在指定 GraphQL 消息中找到的活动操作。 operationName 必须与处于活动状态的操作的名称相同。
$gqlAlias(graphql_field_node) message.body 用于获取 GraphQL 字段节点的别名。
$gqlFragments([graphql_message]) message.body 获取在指定 GraphQL 消息中找到的片段。
$gqlName([graphql_node]) message.body 获取节点名。 对于操作,节点名称为 operationName。 对于字段、片段定义、参数和其他元素,节点名是该元素的名称。 缺省情况下,将检索 message.bodyoperationName
$gqlOperations([graphql_message]) message.body 获取在指定 GraphQL 消息中找到的操作。
$gqlType([graphql_node]) message.body 对“查询”、“突变”和“预订”查询类型检索活动操作的操作类型。
除了功能扩展外,您还可以使用以下运算符:
  • 可使用 &(连接)导航运算符。

您可以使用以下 JSONata 数字运算符:

  • +(加法)
  • - (减)
  • *(乘法)
  • /(除)
  • %(取模)

您可以对数字值或字符串使用以下 JSONata 比较运算符:

  • =
  • !=
  • <
  • >
  • <=
  • >=
您还可以使用以下运算符和表达式。
  • 括号用于将序列转换为数组,指定运算符优先顺序或对上下文值计算复杂表达式。
  • 数组范围和谓词表达式。
  • 单星号 (*) 和双星号 (**) 通配符。
可以使用所显示的语法在 JSONata 表示法中显示 GraphQL 查询的以下元素。
  • query

    整个 GraphQL 查询,包括操作和片段。

  • operationName

    对于匿名操作,operationName 可以为空。

  • ~fragmentSpreadName
  • on~typeCondition
  • ~~fragmentDefinitionName

在选择函数后,将根据所选函数来显示其他字段,以便您完成条件。 例如,如果选择函数 $httpVerb(),那么将显示一个比较运算符选择列表(=!=),并在表达式右侧显示可供选择的 HTTP 动词列表(GETPUTPOSTDELETEHEADOPTIONSPATCH)。

如果选择 NOT,那么将使用 $not 函数来否定条件。

要添加其他条件,请单击添加条件;然后可选择在此条件与前一个条件之间插入 and 还是 or 运算符。

要将括号内的两个或更多个条件分组,请单击添加组,然后将条件添加到组中;然后可选择在此组与前一个条件或组之间插入 and 还是 or 运算符。

要从头开始编写自己的条件,请选择定制,然后在提供的字段中输入脚本。

示例

要构建以下条件:
($statusCode() != 200 and ($httpVerb() = 'GET' or $httpVerb() = 'PUT'))
在条件编辑器中完成以下步骤:
  1. 选择 $statusCode(),针对比较运算符选择 !=,然后在条件右侧的字段中输入 200
  2. 单击添加组
  3. 在显示的新组子窗格中,单击添加条件
  4. 选择 httpVerb(),保留比较运算符 =,并在条件右侧选择 GET
  5. 再次单击组子窗格中的添加条件
  6. 选择 httpVerb(),保留比较运算符 =,并在条件右侧选择 PUT
  7. 对于两个条件之间的比较运算符,请选择 or

简单条件语句

以下示例显示使用单个函数的条件。

此示例使用 $httpVerb() 扩展来指定请求的 HTTP 方法。
$httpVerb()="GET"
此示例使用 $operationPath() 扩展来指定操作路径。
$operationPath()="/base/path-2"
此示例使用 $operationID() 扩展来指定操作标识。
$operationID()="test-gatewayscript-GET"
此示例使用 $statusCode() 扩展来指定消息状态码。
$statusCode()=200
此示例使用 $header(name) 扩展来指定消息头的 Content-Type。
$header("Content-Type")="application/json"

使用逻辑运算符组合条件

可以使用 andor 运算符在单个条件中组合多个函数。

该示例指定 HTTP GET 请求,并且 API 操作路径等于 test-gatewayscript-GET
$httpVerb()="GET" and $operationPath()="test-gatewayscript-GET"
该示例指定 POSTPUT 请求。
$httpVerb()="POST" or $httpVerb()="PUT"
该示例指定 API 操作标识等于 test-gatewayscript_POST 并且消息状态码等于 200,或者 API 操作标识等于 test-gatewayscript-GET 并且消息状态码等于 500
($operationID()="test-gatewayscript-POST" and $statusCode()=200) or ($operationID()="test-gatewayscript-GET" and $statusCode()=500)
该示例指定 API 操作标识等于 test-gatewayscript-POST,消息状态码等于 200 并且 API 操作路径等于 /base/path-2
($operationID()="test-gatewayscript-POST" and $statusCode()=200) and $operationPath()="/base/path-2"
该示例指定消息头内容类型等于 text/plain 并且消息头长度等于 300 或消息状态码等于 200
($header("Content-Type")="text/plain" and $header("Content-Length")=300) or $statusCode()= 200
注: 当用户使用工具包登录路径(包括 ?from=TOOLKIT 的 URL )登录时,生成的 API 密钥的固定存活时间(TTL)为 5 分钟。