AWS Step Functions
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

输入和输出处理

本部分介绍如何将路径和引用路径用于输入和输出处理。

有关概述,请参阅 Step Functions 工作原理中的 Step Functions 中的输入和输出处理

路径

在 Amazon 状态语言中,路径 是以 $ 开头的字符串,您可使用该字符串来标识 JSON 文本中的组件。路径采用 JsonPath 语法。在指定 InputPathResultPathOutputPath 的值时,可以指定访问输入子集的路径。有关更多信息,请参阅 Step Functions 中的输入和输出处理

注意

您还可以使用状态定义的 "Parameters" 字段中的路径指定输入或上下文对象的 JSON 节点。请参阅 将参数传递给服务 API

引用路径

引用路径 是一种语法存在限制的路径,它只能标识 JSON 结构中的单个节点:

  • 您可以使用句点 (.) 和方括号 ([ ]) 表示法访问对象字段。

  • 不支持运算符 @ .. , : ? *

  • 不支持像 length() 这样的函数。

例如,如果状态输入数据包含以下值:

{ "foo": 123, "bar": ["a", "b", "c"], "car": { "cdr": true } }

以下引用路径将返回以下内容。

$.foo => 123 $.bar => ["a", "b", "c"] $.car.cdr => true

某些状态使用路径和引用路径来控制状态机的流,或者配置状态的设置或选项。

InputPath、ResultPath 和 OutputPath 字段中的路径

要指定如何使用状态输入的一部分以及将哪些内容作为输出发送到下一个状态,您可以使用 InputPathOutputPathResultPath

  • 对于 InputPathOutputPath,您必须使用遵循 JsonPath 语法的路径

  • 对于 ResultPath,您必须使用引用路径

InputPath

InputPath 字段选择状态输入的一部分,以传递到状态任务进行处理。如果您省略该字段,它会获取 $ 值,这表示整个输入。如果您使用 null,则会丢弃输入 (不发送到状态的任务),并且任务会接收表示空对象的 JSON 文本 {}

注意

一条路径可以生成一系列值。考虑以下 示例。

{ "a": [1, 2, 3, 4] }

如果您应用路径 $.a[0:2],结果如下。

[ 1, 2 ]

ResultPath

通常,如果某个状态执行一个任务,任务结果将作为状态输出发送 (成为下个任务的输入)。

如果某个状态不执行任务,则将该状态的输入不经过修改作为输出直接发送。但是,当您在状态的 ResultPathOutputPath 字段的值中指定了路径时,可能出现不同的场景。

ResultPath 获取状态任务的执行结果,并将其放在输入中。接下来,OutputPath 选择输入的一部分,以作为状态输出发送。ResultPath 可能会将状态任务的执行结果添加到输入中,覆盖现有的部分输入,或者覆盖整个输入:

  • 如果 ResultPath 匹配状态输入中的某个项,则状态任务的执行结果仅覆盖该输入项。修改后的整个输入可作为状态的输出。

  • 如果 ResultPath 未与状态输入中的项匹配,将在输入中添加一项。该项包含状态任务的执行结果。扩展后的输入成为状态输出。

  • 如果 ResultPath 具有默认值 $,则匹配整个输入。在这种情况下,状态执行结果会完全覆盖输入,而输入变为可传递状态。

  • 如果 ResultPathnull,则将丢弃状态执行结果,而输入保持不变。

注意

ResultPath 字段值必须是引用路径。有关 ResultPath 的更多信息,请参阅 ResultPath

OutputPath

  • 如果 OutputPath 与状态输入中的项匹配,则只选择该输入项。此输入项将成为状态的输出。

  • 如果 OutputPath 未与状态输入中的项匹配,则将出现路径无效的异常。有关更多信息,请参阅错误

  • 如果 OutputPath 具有默认值 $,则将完全匹配整个输入。在这种情况下,整个输入将传递到下一个状态。

  • 如果 OutputPathnull,则将表示空对象的 JSON 文本 {} 发送到下一个状态。

以下示例演示了 InputPathResultPathOutputPath 字段在实际使用中的效果。请为当前状态考虑以下输入。

{ "title": "Numbers to add", "numbers": { "val1": 3, "val2": 4 } }

此外,状态具有以下 InputPathResultPathOutputPath 字段:

"InputPath": "$.numbers", "ResultPath": "$.sum", "OutputPath": "$"

状态任务仅接收来自输入的 numbers 对象。反过来,如果此任务返回 7,该状态的输出如下所示:

{ "title": "Numbers to add", "numbers": { "val1": 3, "val2": 4 } "sum": 7 }

您可以稍微修改 OutputPath

"InputPath": "$.numbers", "ResultPath": "$.sum", "OutputPath": "$.sum"

和之前一样,您可以使用以下状态输入数据:

{ "numbers": { "val1": 3, "val2": 4 } }

但是,现在状态输出数据为 7

本页内容: