Arazzo 规范 v1.0.0

Arazzo 规范提供了一种机制,可以定义调用序列及其依赖关系,并将它们编织在一起,并在处理 API 描述(例如 OpenAPI 描述)时,在交付特定结果或一组结果的上下文中表达。

文档状态

规范的真相来源是上面引用的 GitHub Markdown 文件。

Arazzo 规范

版本 1.0.0

本文档中的关键词“必须”、“禁止”、“必需”、“应”、“不应”、“应该”、“不应该”、“推荐”、“不推荐”、“可以”和“可选”应按照BCP 14 [[!RFC2119]] [[!RFC8174]]中的描述进行解释,当且仅当它们以全部大写字母出现时,如这里所示。

本文档根据Apache 许可证 2.0 版获得许可。

简介

能够表达特定的调用序列并阐明它们之间的依赖关系以实现特定目标,在 API 描述的上下文中是可取的。Arazzo 规范的目的是提供一种机制,可以定义调用序列及其依赖关系,并将它们编织在一起,并在处理 API 描述(例如 OpenAPI 描述)时,在交付特定结果或一组结果的上下文中表达。

Arazzo 规范可以以人类可读和机器可读的方式阐明这些工作流程,从而提高 API 规范讲述 API 故事的能力,从而改善消费开发人员的体验。

定义

Arazzo 描述

一个自包含的文档(或一组文档),用于定义或描述 API 工作流程(在 API 定义的上下文中实现特定目标的特定调用序列)。Arazzo 描述使用并符合 Arazzo 规范,并且必须包含有效的 Arazzo 规范版本字段 (arazzo)、一个信息字段、一个具有至少一个已定义sourceDescriptions字段,并且必须workflows固定字段中定义至少一个工作流程

规范

版本

Arazzo 规范使用..修订版本控制方案进行版本控制。版本字符串的.部分(例如 1.0)应指定 Arazzo 功能集。.修订版本解决此文档中的错误,或提供对此文档的澄清,而不是功能集。工具不应考虑修订版本,例如不区分 1.0.0 和 1.0.1。

格式

符合 Arazzo 规范的 Arazzo 描述本身是一个 JSON 对象,可以以 JSON 或 YAML 格式表示。

规范中的所有字段名称都区分大小写。这包括用作映射中键的所有字段,除非明确指出键不区分大小写

为了保留在 YAML 和 JSON 格式之间进行往返的能力,建议使用 YAML 版本1.2以及一些其他约束。

Arazzo 描述结构

建议将入口 Arazzo 文档命名为:arazzo.jsonarazzo.yaml

Arazzo 描述可以由单个文档组成,也可以根据作者的意愿分成多个相互关联的部分。如果引用了其他文档中的工作流程,则必须将其作为源描述对象包含在内。在多文档描述中,包含Arazzo 规范对象的文档称为入口 Arazzo 文档

数据类型

Arazzo 规范中的数据类型基于JSON Schema 规范草案 2020-12支持的类型。请注意,整数作为一种类型也受支持,并且被定义为没有小数部分或指数部分的 JSON 数字。

JSON Schema 验证词汇表所定义,数据类型可以具有可选的修饰符属性:format。Arazzo 还支持格式(类似于 OpenAPI 规范)以提供对基本数据类型的详细说明。

定义的格式为

类型 格式 注释
整数 int32 有符号 32 位
整数 int64 有符号 64 位(又名长整数)
数字 浮点
数字 双精度
字符串 密码 提示 UI 隐藏输入。

URL 中的相对引用

除非另有规定,否则所有作为 URL 的属性都可以是[[!RFC3986]]第 4.2 节中定义的相对引用。除非另有规定,否则使用引用文档的 URL 解析相对引用。

模式

在以下描述中,如果某个字段未明确必需或用必须或应描述,则可以将其视为可选。

Arazzo 规范对象

这是Arazzo 描述的根对象。

固定字段

字段名称 类型 描述
arazzo 字符串 必需。此字符串必须是 Arazzo 描述使用的Arazzo 规范版本号arazzo字段必须由工具用于解释 Arazzo 描述。
info 信息对象 必需。提供有关 Arazzo 描述中包含的工作流程的元数据。元数据可以根据需要由工具使用。
sourceDescriptions [源描述对象] 必需。此 Arazzo 描述应应用到的源描述(例如 OpenAPI 描述)列表。该列表必须至少包含一个条目。
workflows [工作流程对象] 必需。工作流程列表。该列表必须至少包含一个条目。
components 组件对象 一个用于保存 Arazzo 描述各种模式的元素。

此对象可以使用规范扩展进行扩展。

Arazzo 规范对象示例


arazzo: 1.0.0
info:
  title: A pet purchasing workflow
  summary: This Arazzo Description showcases the workflow for how to purchase a pet through a sequence of API calls
  description: |
      This Arazzo Description walks you through the workflow and steps of `searching` for, `selecting`, and `purchasing` an available pet.
  version: 1.0.1
sourceDescriptions:
- name: petStoreDescription
  url: https://github.com/swagger-api/swagger-petstore/blob/master/src/main/resources/openapi.yaml
  type: openapi

workflows:
- workflowId: loginUserAndRetrievePet
  summary: Login User and then retrieve pets
  description: This workflow lays out the steps to login a user and then retrieve pets
  inputs:
      type: object
      properties:
          username:
              type: string
          password:
              type: string
  steps:
  - stepId: loginStep
    description: This step demonstrates the user login step
    operationId: loginUser
    parameters:
      # parameters to inject into the loginUser operation (parameter name must be resolvable at the referenced operation and the value is determined using {expression} syntax)
      - name: username
        in: query
        value: $inputs.username
      - name: password
        in: query
        value: $inputs.password
    successCriteria:
      # assertions to determine step was successful
      - condition: $statusCode == 200
    outputs:
      # outputs from this step
      tokenExpires: $response.header.X-Expires-After
      rateLimit: $response.header.X-Rate-Limit
      sessionToken: $response.body
  - stepId: getPetStep
    description: retrieve a pet by status from the GET pets endpoint
    operationPath: '{$sourceDescriptions.petstoreDescription.url}#/paths/~1pet~1findByStatus/get'
    parameters:
      - name: status
        in: query
        value: 'available'
      - name: Authorization
        in: header
        value: $steps.loginUser.outputs.sessionToken
    successCriteria:
      - condition: $statusCode == 200
    outputs:
      # outputs from this step
      availablePets: $response.body
  outputs:
      available: $steps.getPetStep.availablePets

信息对象

该对象提供有关在此 Arazzo 文档中定义的 API 工作流程的元数据。如果需要,客户端可以使用元数据。

固定字段

字段名称 类型 描述
title 字符串 必需。Arazzo 描述的人类可读标题。
summary 字符串 Arazzo 描述的简短摘要。
description 字符串 对定义的工作流程目的的描述。CommonMark 语法可以用于富文本表示。
version 字符串 必需。Arazzo 文档的版本标识符(与Arazzo 规范版本不同)。

此对象可以使用规范扩展进行扩展。

信息对象示例


title: A pet purchasing workflow
summary: This workflow showcases how to purchase a pet through a sequence of API calls
description: |
    This workflow walks you through the steps of searching for, selecting, and purchasing an available pet.
version: 1.0.1

源描述对象

描述将由 Arazzo 描述中描述的一个或多个工作流程引用的源描述(例如 OpenAPI 描述)。

一个对象,用于存储命名描述键与源描述(例如 OpenAPI 描述)位置 URL 之间的映射,此 Arazzo 描述应应用于这些位置。每个源位置字符串必须采用[[!RFC3986]]第 4.1 节中定义的 URI 引用形式。

固定字段

字段名称 类型 描述
name 字符串 必需。源描述的唯一名称。工具和库可以使用name唯一地识别源描述,因此,建议遵循常见的编程命名约定。应符合正则表达式[A-Za-z0-9_\-]+
url 字符串 必需。工作流程要使用的源描述的 URL。如果使用相对引用,则必须采用[[!RFC3986]]第 4.2 节中定义的 URI 引用形式。
type 字符串 源描述的类型。可能的值为"openapi""arazzo"

此对象可以使用规范扩展进行扩展。

源描述对象示例


name: petStoreDescription
url: https://github.com/swagger-api/swagger-petstore/blob/master/src/main/resources/openapi.yaml
type: openapi

工作流程对象

描述跨一个或多个 API 采取的步骤以实现目标。工作流程对象可以定义执行工作流程步骤所需的输入,其中定义的步骤表示对 API 操作或另一个工作流程的调用,以及一组输出。

固定字段

字段名称 类型 描述
workflowId 字符串 必需。表示工作流程的唯一字符串。此 ID 必须在 Arazzo 描述中描述的所有工作流程中唯一。workflowId区分大小写。工具和库可以使用workflowId唯一地识别工作流程,因此,建议遵循常见的编程命名约定。应符合正则表达式[A-Za-z0-9_\-]+
summary 字符串 工作流程目的或目标的摘要。
description 字符串 工作流程的描述。CommonMark 语法可以用于富文本表示。
inputs JSON 模式 表示此工作流程使用的输入参数的 JSON 模式 2020-12 对象。
dependsOn [字符串] 必须在处理此工作流程之前完成的工作流程列表。提供的 value 必须是workflowId。如果依赖的工作流程在当前工作流程文档中定义,则指定相关本地工作流程的workflowId。如果工作流程在单独的 Arazzo 文档中定义,则必须在sourceDescriptions中定义工作流程,并且必须使用运行时表达式(例如,$sourceDescriptions.<name>.<workflowId>)指定workflowId,以避免歧义或潜在冲突。
steps [步骤对象] 必需。步骤的有序列表,其中每个步骤表示对 API 操作或另一个工作流程的调用。
successActions [成功操作对象 | 可重用对象] 适用于此工作流程下描述的所有步骤的成功操作列表。这些成功操作可以在步骤级别覆盖,但不能在那里删除。如果提供了可重用对象,则它必须链接到当前 Arazzo 文档的components/successActions中定义的成功操作。该列表中不包含重复的成功操作。
failureActions [失败操作对象 | 可重用对象] 适用于此工作流程下描述的所有步骤的失败操作列表。这些失败操作可以在步骤级别覆盖,但不能在那里删除。如果提供了可重用对象,则它必须链接到当前 Arazzo 文档的components/failureActions中定义的失败操作。该列表中不包含重复的失败操作。
outputs Map[字符串, {表达式}]

友好的名称和动态输出值之间的映射。名称**必须**使用与正则表达式匹配的键:^[a-zA-Z0-9\.\-_]+$
参数 [参数对象 | 可重用对象] 适用于此工作流下描述的所有步骤的参数列表。这些参数可以在步骤级别被覆盖,但不能在那里被移除。每个参数**必须**传递给由operationIdoperationPathworkflowId引用的操作或工作流,如每个步骤中指定的那样。如果提供了可重用对象,它**必须**链接到当前Arazzo文档的components/parameters中定义的参数。列表**不能**包含重复的参数。

此对象可以使用规范扩展进行扩展。

工作流对象示例


workflowId: loginUser
summary: Login User
description: This workflow lays out the steps to login a user
inputs:
    type: object
    properties:
        username:
            type: string
        password:
            type: string
steps:
  - stepId: loginStep
    description: This step demonstrates the user login step
    operationId: loginUser
    parameters:
      # parameters to inject into the loginUser operation (parameter name must be resolvable at the referenced operation and the value is determined using {expression} syntax)
      - name: username
        in: query
        value: $inputs.username
      - name: password
        in: query
        value: $inputs.password
    successCriteria:
        # assertions to determine step was successful 
        - condition: $statusCode == 200
    outputs:
        # outputs from this step
        tokenExpires: $response.header.X-Expires-After
        rateLimit: $response.header.X-Rate-Limit
outputs:
    tokenExpires: $steps.loginStep.outputs.tokenExpires

步骤对象

描述单个工作流步骤,该步骤**可能**是对API操作(OpenAPI操作对象或另一个工作流对象)的调用。

固定字段

字段名称 类型 描述
描述 字符串 步骤的描述。CommonMark语法**可以**用于富文本表示。
stepId 字符串 **必填**。表示步骤的唯一字符串。stepId**必须**在工作流中描述的所有步骤中唯一。stepId值**区分大小写**。工具和库**可以**使用stepId唯一标识工作流步骤,因此,**建议**遵循常见的编程命名约定。**应该**符合正则表达式[A-Za-z0-9_\-]+
operationId 字符串 现有可解析操作的名称,由唯一的operationId定义,并存在于其中一个sourceDescriptions中。引用的操作将由此工作流步骤调用。如果定义了多个(非arazzo类型)sourceDescriptions,则**必须**使用运行时表达式(例如,$sourceDescriptions.<name>.<operationId>)指定operationId,以避免歧义或潜在冲突。此字段分别与operationPathworkflowId字段互斥。
operationPath 字符串 JSON指针的引用,用于引用操作。此字段分别与operationIdworkflowId字段互斥。被引用的操作**必须**在其中一个sourceDescriptions描述中描述。**必须**使用运行时表达式语法来识别源描述文档。如果引用的操作定义了operationId,则**应该**优先使用operationId而不是operationPath
workflowId 字符串 引用Arazzo描述中现有工作流的workflowId。如果定义了多个arazzo类型sourceDescriptions,则**必须**使用运行时表达式(例如,$sourceDescriptions.<name>.<workflowId>)指定workflowId,以避免歧义或潜在冲突。此字段分别与operationIdoperationPath字段互斥。
参数 [参数对象 | 可重用对象] **必须**传递给由operationIdoperationPathworkflowId引用的操作或工作流的参数列表。如果某个参数已在工作流中定义,则新定义将覆盖它,但永远不会将其删除。如果提供了可重用对象,它**必须**链接到当前Arazzo文档的components/parameters中定义的参数。列表**不能**包含重复的参数。
requestBody 请求体对象 要传递给由operationIdoperationPath引用的操作的请求体。requestBody在HTTP方法中得到完全支持,其中HTTP 1.1规范[[!RFC7231]]第4.3.1节已明确定义了请求体的语义。在其他HTTP规范含糊不清的情况下(例如GETHEADDELETE),允许使用requestBody,但没有明确定义的语义,并且**应该**尽可能避免。
成功标准 [标准对象] 用于确定步骤是否成功的断言列表。每个断言都使用标准对象进行描述。为了使步骤被视为成功,**必须**满足所有断言。
onSuccess [成功操作对象 | 可重用对象] 指定步骤成功后要执行的操作的一系列成功操作对象。如果省略,则下一个顺序步骤将作为默认行为执行。如果多个成功操作具有类似的criteria,则第一个匹配标准的顺序操作**将**是执行的操作。如果某个成功操作已在工作流中定义,则新定义将覆盖它,但永远不会将其删除。如果提供了可重用对象,它**必须**链接到当前Arazzo文档的components中定义的成功操作。列表**不能**包含重复的成功操作。
onFailure [失败操作对象 | 可重用对象] 指定步骤失败后要执行的操作的一系列失败操作对象。如果省略,则默认行为是中断并返回。如果多个失败操作具有类似的criteria,则第一个匹配标准的顺序操作**将**是执行的操作。如果某个失败操作已在工作流中定义,则新定义将覆盖它,但永远不会将其删除。如果提供了可重用对象,它**必须**链接到当前Arazzo文档的components中定义的失败操作。列表**不能**包含重复的失败操作。
输出 Map[字符串, {表达式}]

使用运行时表达式定义的友好的名称和动态输出值之间的映射。名称**必须**使用与正则表达式匹配的键:^[a-zA-Z0-9\.\-_]+$

此对象可以使用规范扩展进行扩展。

步骤对象示例

单个步骤


stepId: loginStep
description: This step demonstrates the user login step
operationId: loginUser
parameters:
    # parameters to inject into the loginUser operation (parameter name must be resolvable at the referenced operation and the value is determined using {expression} syntax)
    - name: username
      in: query
      value: $inputs.username
    - name: password
      in: query
      value: $inputs.password
successCriteria:
    # assertions to determine step was successful
    - condition: $statusCode == 200
outputs:
    # outputs from this step
    tokenExpires: $response.header.X-Expires-After
    rateLimit: $response.header.X-Rate-Limit

多个步骤


steps:
  - stepId: loginStep
    description: This step demonstrates the user login step
    operationId: loginUser
    parameters:
        # parameters to inject into the loginUser operation (parameter name must be resolvable at the referenced operation and the value is determined using {expression} syntax)
      - name: username
        in: query
        value: $inputs.username
      - name: password
        in: query
        value: $inputs.password
    successCriteria:
        # assertions to determine step was successful
      - condition: $statusCode == 200
    outputs:
        # outputs from this step
        tokenExpires: $response.header.X-Expires-After
        rateLimit: $response.header.X-Rate-Limit
        sessionToken: $response.body
  - stepId: getPetStep
    description: retrieve a pet by status from the GET pets endpoint
    operationPath: '{$sourceDescriptions.petStoreDescription.url}#/paths/~1pet~1findByStatus/get'
    parameters:
      - name: status
        in: query
        value: 'available'
      - name: Authorization
        in: header
        value: $steps.loginUser.outputs.sessionToken
    successCriteria:
      - condition: $statusCode == 200
    outputs:
        # outputs from this step
        availablePets: $response.body

参数对象

描述单个步骤参数。唯一的参数由namein字段的组合定义。in字段指定了四个可能的位置

  • path - 与OpenAPI风格的路径模板一起使用,其中参数值实际上是操作URL的一部分。这并不包括API的主机或基本路径。例如,在/items/{itemId}中,路径参数是itemId。
  • query - 附加到URL的参数。例如,在/items?id=###中,查询参数是id
  • header - 作为请求的一部分预期的自定义标头。请注意,[[!RFC7230]]第22页指出标头名称不区分大小写。
  • cookie - 用于将特定cookie值传递给源API。

固定字段

字段名称 类型 描述
name 字符串 **必填**。参数的名称。参数名称**区分大小写**。
in 字符串 参数的名称位置。可能的值为"path""query""header""cookie""body"。当上下文中的步骤指定workflowId时,所有参数都映射到工作流输入。在所有其他场景中(例如,步骤指定operationId),**必须**指定in字段。
value Any | {expression} **必填**。要传递的参数值。该值可以是常量或运行时表达式,该表达式将被计算并传递给引用的操作或工作流。

此对象可以使用规范扩展进行扩展。

参数对象示例

查询示例


- name: username
  in: query
  value: $inputs.username

标头示例


- name: X-Api-Key
  in: header
  value: $inputs.x-api-key

成功操作对象

单个成功操作,描述在工作流步骤成功后要执行的操作。type字段有两个可能的值。

  • end - 工作流结束,上下文返回给调用方,并提供适用的输出
  • goto - 将工作流控制单向转移到指定的标签(workflowIdstepId

固定字段

字段名称 类型 描述
name 字符串 **必填**。成功操作的名称。名称**区分大小写**。
type 字符串 **必填**。要执行的操作类型。可能的值为"end""goto"
workflowId 字符串 引用Arazzo描述中现有工作流的workflowId,以便在步骤成功后转移到该工作流。此字段仅在type字段值为"goto"时相关。如果定义了多个arazzo类型sourceDescriptions,则**必须**使用运行时表达式(例如,$sourceDescriptions.<name>.<workflowId>)指定workflowId,以避免歧义或潜在冲突。此字段与stepId互斥。
stepId 字符串 在步骤成功后要转移到的stepId。此字段仅在type字段值为"goto"时相关。引用的stepId**必须**在当前工作流中。此字段与workflowId互斥。
criteria [标准对象] 用于确定**是否**应执行此操作的一系列断言。每个断言都使用标准对象进行描述。为了执行该操作,**必须**满足所有标准断言。

此对象可以使用规范扩展进行扩展。

成功操作对象示例


name: JoinWaitingList
type: goto
stepId: joinWaitingListStep
criteria:
    # assertions to determine if this success action should be executed
    - context: $response.body
      condition: $[?count(@.pets) > 0]
      type: jsonpath

失败操作对象

单个失败操作,描述在工作流步骤失败后要执行的操作。type字段有三个可能的值。

  • end - 工作流结束,上下文返回给调用方,并提供适用的输出
  • retry - 当前步骤将重试。重试将受retryAfterretryLimit字段约束。如果指定了stepIdworkflowId,则执行引用并返回上下文,然后重试当前步骤。
  • goto - 将工作流控制单向转移到指定的标签(workflowIdstepId

固定字段

字段名称 类型 描述
name 字符串 **必填**。失败操作的名称。名称**区分大小写**。
type 字符串 **必填**。要执行的操作类型。可能的值为"end""retry""goto"
workflowId 字符串 引用Arazzo描述中现有工作流的workflowId,以便在步骤失败后转移到该工作流。此字段仅在type字段值为"goto""retry"时相关。如果定义了多个arazzo类型sourceDescriptions,则**必须**使用运行时表达式(例如,$sourceDescriptions.<name>.<workflowId>)指定workflowId,以避免歧义或潜在冲突。此字段与stepId互斥。当与"retry"一起使用时,上下文在指定工作流完成后返回。
stepId 字符串 在步骤失败后要转移到的stepId。此字段仅在type字段值为"goto""retry"时相关。引用的stepId**必须**在当前工作流中。此字段与workflowId互斥。当与"retry"一起使用时,上下文在指定步骤完成后返回。
retryAfter 数字 一个非负十进制数,表示步骤失败后在再次尝试之前要延迟的秒数。**注意:**如果从目标操作的步骤返回了 HTTP Retry-After 响应头,则它**应该**覆盖此特定字段值。此字段仅在type字段值为"retry""function"时适用。
retryLimit 整数 一个非负整数,表示在步骤失败之前可以尝试重试步骤的次数。如果未指定,则应尝试一次重试。此字段仅在type字段值为"retry"时适用。在执行后续失败操作之前,**必须**耗尽retryLimit
criteria [标准对象] 一个断言列表,用于确定是否**应**执行此操作。每个断言都使用Criterion Object进行描述。

此对象可以使用规范扩展进行扩展。

Failure Action Object 示例


name: retryStep
type: retry
retryAfter: 1
retryLimit: 5
criteria:
    # assertions to determine if this action should be executed
    - condition: $statusCode == 503

组件对象

保存一组可重用的对象,用于 Arazzo 规范的不同方面。在 components 对象内定义的所有对象都不会对 Arazzo 描述产生影响,除非它们是从 components 对象外部的属性显式引用的。

组件的范围限定为它们定义所在的 Arazzo 文档。例如,如果 Arazzo 文档“A”中定义的步骤引用了 Arazzo 文档“B”中定义的工作流,则在评估“B”中引用的工作流时,不会考虑“A”中的组件。

固定字段

字段名称 类型 描述
inputs Map[string, JSON Schema] 一个对象,用于保存可重用的 JSON Schema 对象,以便从工作流输入中引用。
parameters Map[string, Parameter Object] 一个对象,用于保存可重用的 Parameter 对象。
successActions Map[string, Success Action Object] 一个对象,用于保存可重用的 Success Actions 对象。
failureActions Map[string, Failure Action Object] 一个对象,用于保存可重用的 Failure Actions 对象。

此对象可以使用规范扩展进行扩展。

上面声明的所有固定字段都是对象,**必须**使用与正则表达式匹配的键:^[a-zA-Z0-9\.\-_]+$。该键用于在工作流描述的其他部分引用输入或参数。

字段名称示例


User
User_1
User_Name
user-name
my.org.User

Components Object 示例


components:
  parameters:
    storeId:
      name: storeId
      in: header
      value: $inputs.x-store-id
  inputs:
    pagination:
      type: object
      properties:
        page:
          type: integer
          format: int32
        pageSize:
          type: integer
          format: int32
  failureActions:
    refreshToken:
      name: refreshExpiredToken
      type: retry
      retryAfter: 1
      retryLimit: 5
      workflowId: refreshTokenWorkflowId
      criteria:
          # assertions to determine if this action should be executed
          - condition: $statusCode == 401       

"components": {
  "parameters": {
    "storeId": {
      "name": "storeId",
      "in": "header",
      "value": "$inputs.x-store-id"
    }
  },
  "inputs": {
    "pagination": {
      "type": "object",
      "properties": {
        "page": {
          "type": "integer",
          "format": "int32"
        },
        "pageSize": {
          "type": "integer",
          "format": "int32"
        }
      }
    }
  },
  "failureActions": {
    "refreshToken": {
      "name": "refreshExpiredToken",
      "type": "retry",
      "retryAfter": 1,
      "retryLimit": 5,
      "workflowId": "refreshTokenWorkflowId",
      "criteria": [
        {
          "condition": "{$statusCode == 401}"
        }
      ]
    }
  }
}

可重用对象

一个简单的对象,允许引用包含在Components Object中的对象。它可以从 Arazzo 描述中的步骤或工作流内的位置使用。**注意** - 输入对象**必须**使用标准 JSON Schema 通过$ref关键字进行引用,而所有非 JSON Schema 对象都使用此对象及其基于表达式的引用机制。

固定字段

字段名称 类型 描述
reference {expression} **必需**。用于引用所需对象的运行时表达式
value 字符串 设置引用的参数的值。这仅适用于参数对象引用。

此对象不能扩展其他属性,并且添加的任何属性**必须**被忽略。

可重用对象示例


  reference: $components.successActions.notify

  {
    "reference": "$components.successActions.notify"
  }

  reference: $components.parameters.page
  value: 1

  {
    "reference": "$components.parameters.page",
    "value": 1
  }

Criterion Object

一个对象,用于指定可以在Step Object successCriteriaSuccess Action Object criteriaFailure Action Object criteria中指定的断言中使用的内容、条件和条件类型。

支持四种类型的条件

  • 简单 - 在其中基本字面量、运算符和松散比较与运行时表达式结合使用。
  • regex - 在其中将正则表达式模式应用于提供的内容。上下文由运行时表达式定义。
  • jsonpath - 在其中应用 JSONPath 表达式。根节点上下文由运行时表达式定义。
  • xpath - 在其中应用 XPath 表达式。根节点上下文由运行时表达式定义。

字面量

作为条件表达式的一部分,可以使用booleannullnumberstring数据类型。

类型 字面值
boolean truefalse
null null
数字 数据类型中支持的任何数字格式。
字符串 字符串**必须**使用单引号(')括起来。要使用字面量单引号,请使用另一个单引号('')转义字面量单引号。

运算符

运算符 描述
< 小于
<= 小于或等于
> 大于
>= 大于或等于
== 等于
!= 不等于
!
&&
||
() 逻辑分组
[] 索引(基于 0)
. 属性反引用

字符串比较**必须**不区分大小写。

固定字段

字段名称 类型 描述
context {expression} 用于设置要应用条件的上下文的运行时表达式。如果指定了type,则**必须**提供context(例如,$response.body将设置可以应用 JSONPath 查询表达式的上下文)。
condition 字符串 **必需**。要应用的条件。条件可以是简单的(例如,$statusCode == 200,它对从运行时表达式获得的值应用运算符),也可以是正则表达式或 JSONPath 表达式。对于正则表达式或 JSONPath,**必须**指定typecontext
type string | Criterion Expression Type Object 要应用的条件类型。如果指定,则允许的选项为simpleregexjsonpathxpath。如果省略,则假定条件为simple,最多组合字面量、运算符和运行时表达式。如果为jsonpath,则表达式**必须**符合JSONPath。如果为xpath,则表达式**必须**符合XML Path Language 3.1。如果需要 JSONPath 或 XPath 的其他变体,则**必须**指定Criterion Expression Type Object

此对象可以使用规范扩展进行扩展。

Criterion Object 示例

简单条件示例


- condition: $statusCode == 200

Regex 条件示例


- context: $statusCode
  condition: '^200$'
  type: regex

JSONPath 条件示例


- context: $response.body
  condition: $[?count(@.pets) > 0]
  type: jsonpath

Criterion Expression Type Object

一个对象,用于描述在Criterion Object中使用的表达式的类型和版本。如果未定义此对象,则应用以下默认值

定义此对象可以利用与 JSONPath 或 XPath 的旧版本兼容的工具。

固定字段

字段名称 类型 描述
type 字符串 **必需**。要应用的条件类型。允许的选项为jsonpathxpath
version 字符串 **必需**。表示正在使用的表达式类型的版本的简写字符串。JSONPath 的允许值为draft-goessner-dispatch-jsonpath-00。XPath 的允许值为xpath-30xpath-20xpath-10

此对象可以使用规范扩展进行扩展。

Criterion Expression Type 示例

JSONPath 示例


  type: jsonpath
  version: draft-goessner-dispatch-jsonpath-00

XPath 示例


  type: xpath
  version: xpath-30

请求体对象

一个描述Content-Type和请求正文内容的单个请求正文,步骤将通过它传递给操作。

固定字段

字段名称 类型 描述
contentType 字符串 请求内容的 Content-Type。如果省略,则参考目标操作中指定的 Content-Type 以了解序列化要求。
payload 任何 表示请求正文有效负载的值。该值可以是字面量值,也可以包含运行时表达式,这些表达式**必须**在调用引用的操作之前进行评估。为了表示不能以 JSON 或 YAML 形式自然表示的媒体类型的示例,请使用字符串值包含示例,并在必要时进行转义。
replacements [Payload Replacement Object] 要在有效负载内设置的位置和值的列表。

此对象可以使用规范扩展进行扩展。

RequestBody Object 示例

JSON 模板示例


  contentType: application/json
  payload: |
    {
      "petOrder": {
        "petId": "{$inputs.pet_id}",
        "couponCode": "{$inputs.coupon_code}",
        "quantity": "{$inputs.quantity}",
        "status": "placed",
        "complete": false
      }
    }

JSON 对象示例


  contentType: application/json
  payload: 
    petOrder:
      petId: $inputs.pet_id
      couponCode: $inputs.coupon_code
      quantity: $inputs.quantity
      status: placed
      complete: false

完整运行时表达式


  contentType: application/json
  payload: $inputs.petOrderRequest

XML 模板示例


  contentType: application/xml
  payload: |
    <petOrder>
      <petId>{$inputs.pet_id}</petId>
      <couponCode>{$inputs.coupon_code}</couponCode>
      <quantity>{$inputs.quantity}</quantity>
      <status>placed</status>
      <complete>false</complete>
    </petOrder>

表单数据示例


  contentType: application/x-www-form-urlencoded
  payload: 
    client_id: $inputs.clientId
    grant_type: $inputs.grantType
    redirect_uri: $inputs.redirectUri
    client_secret: $inputs.clientSecret
    code: $steps.browser-authorize.outputs.code
    scope: $inputs.scope  

表单数据字符串示例


  contentType: application/x-www-form-urlencoded
  payload: "client_id={$inputs.clientId}&grant_type={$inputs.grantType}&redirect_uri={$inputs.redirectUri}&client_secret={$inputs.clientSecret}&code{$steps.browser-authorize.outputs.code}&scope=$inputs.scope}"

Payload Replacement Object

描述有效负载(例如,请求正文)中的位置以及要在该位置设置的值。

固定字段

字段名称 类型 描述
target 字符串 **必需**。JSON PointerXPath 表达式,**必须**针对请求正文解析。用于识别要注入value的位置。
value Any | {expression} **必需**。在目标位置设置的值。该值可以是常量,也可以是运行时表达式,该表达式将被评估并传递给引用的操作或工作流。

此对象可以使用规范扩展进行扩展。

Payload Replacement Object 示例

运行时表达式示例


  target: /petId
  value: $inputs.pet_id

字面量示例


  target: /quantity
  value: 10

运行时表达式

运行时表达式允许根据 HTTP 消息、事件消息以及从 Arazzo 文档(如工作流步骤)序列化对象中可用的信息来定义值。

运行时表达式由以下ABNF语法定义


      expression = ( "$url" / "$method" / "$statusCode" / "$request." source / "$response." source / "$message." source / "$inputs." name / "$outputs." name / "$steps." name / "$workflows." name / "$sourceDescriptions." name / "$components." name / "$components.parameters." parameter-name)
      parameter-name = name ; Reuses 'name' rule for parameter names
      source = ( header-reference / query-reference / path-reference / body-reference )
      header-reference = "header." token
      query-reference = "query." name
      path-reference = "path." name
      body-reference = "body" ["#" json-pointer ]
      json-pointer    = *( "/" reference-token )
      reference-token = *( unescaped / escaped )
      unescaped       = %x00-2E / %x30-7D / %x7F-10FFFF
         ; %x2F ('/') and %x7E ('~') are excluded from 'unescaped'
      escaped         = "~" ( "0" / "1" )
        ; representing '~' and '/', respectively
      name = *( CHAR )
      token = 1*tchar
      tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." /
        "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA

示例

源位置 示例表达式 注释
HTTP 方法 $method $method的允许值为 HTTP 操作的那些值。
请求的媒体类型 $request.header.accept
请求参数 $request.path.id 请求参数**必须**在父操作的parameters部分中声明,否则无法评估它们。这包括请求头。
请求正文属性 $request.body#/user/uuid 在接受有效负载的操作中,可以引用requestBody的部分或整个正文。
请求 URL $url
响应值 $response.body#/status 在返回有效负载的操作中,可以引用响应正文的部分或整个正文。
响应头 $response.header.Server 仅提供单个标头值
工作流输入 $inputs.username$workflows.foo.inputs.username 仅提供单个输入值
步骤输出值 $steps.someStep.pets 在命名属性返回有效负载的情况下,可以引用响应正文的部分或整个正文。
工作流输出值 $outputs.bar$workflows.foo.outputs.bar 仅提供单个输入值
组件参数 $components.parameters.foo 访问 Components Object 中定义的 foo 参数。

运行时表达式保留引用的值的类型。表达式可以通过用{}花括号括起来的方式嵌入到字符串值中。

规范扩展

虽然 Arazzo 规范尝试适应大多数用例,但可以在某些点添加其他数据来扩展规范。

扩展属性实现为模式化字段,这些字段始终以"x-"为前缀。

字段模式

类型 描述
^x- 任何 允许对 Arazzo 规范进行扩展。字段名称必须以x-开头,例如x-internal-id。以x-oai-x-oas-x-arazzo开头的字段名称保留供 OpenAPI Initiative 定义的使用。值可以是null、基本类型、数组或对象。

可用的工具可能支持也可能不支持这些扩展,但是这些工具也可以扩展以添加请求的支持(如果工具是内部的或开源的)。

安全注意事项

Arazzo 规范没有强制执行安全机制。安全性留给实现者,尽管建议使用 TLS,特别是 HTTPS 来交换敏感的工作流。

Arazzo 描述可以是 JSON 或 YAML 值。因此,[[!RFC8259]] 中以及 YAML 版本 1.2 中定义的所有安全注意事项都适用。

Arazzo 描述通常由不受信任的第三方编写,部署在公共互联网服务器上。处理 Arazzo 描述可能会导致对任意网络资源执行安全和不安全的操作。描述使用者有责任确保执行的操作不会造成危害。

IANA 注意事项

下面描述了 Arazzo 规范建议的 MIME 媒体类型。

application/vnd.oai.workflows

Arazzo 文档(例如工作流)的默认(或通用)MIME 类型定义如下

  媒体类型名称:application

  媒体子类型名称:vnd.oai.workflows

  必需参数:N/A

  可选参数:version(例如 version=1.0.0 表示工作流类型符合 Arazzo 规范的 1.0.0 版本)。

  编码注意事项:编码注意事项与分别为application/jsonapplication/yaml媒体类型指定的编码注意事项相同。

  安全注意事项:请参阅上面 安全注意事项

  互操作性注意事项:N/A

注意:使用application/vnd.oai.workflows媒体类型时,使用者应准备好接收 YAML 格式的内容

application/vnd.oai.workflows+json

需要 JSON 特定媒体类型的 Arazzo 文档(例如工作流)建议的 MIME 媒体类型定义如下

  媒体类型名称:application

  媒体子类型名称:vnd.oai.workflows+json

  必需参数:N/A

  可选参数:version(例如 version=1.0.0 表示 Arazzo 文档类型符合 Arazzo 规范的 1.0.0 版本)。

  编码注意事项:编码注意事项与为application/json媒体类型指定的编码注意事项相同。

  安全注意事项:请参阅上面 安全注意事项

  互操作性注意事项:N/A

application/vnd.oai.workflows+yaml

需要 YAML 特定媒体类型的 Arazzo 文档(例如工作流)建议的 MIME 媒体类型定义如下

  媒体类型名称:application

  媒体子类型名称:vnd.oai.workflows+yaml

  必需参数:N/A

  可选参数:version(例如 version=1.0.0 表示 Arazzo 文档类型符合 Arazzo 规范的 1.0.0 版本)。

  编码注意事项:编码注意事项与为application/yaml媒体类型指定的编码注意事项相同。

  安全注意事项:请参阅上面 安全注意事项

  互操作性注意事项:N/A

附录 A:修订历史

版本 日期 备注
1.0.0 2024-05-29 Arazzo 规范的首次发布