本文档中的关键词“必须”、“禁止”、“必需”、“应”、“不应”、“应该”、“不应该”、“推荐”、“不推荐”、“可以”和“可选”应按照BCP 14 [[!RFC2119]] [[!RFC8174]]中的描述进行解释,当且仅当它们以全部大写字母出现时,如这里所示。
本文档根据Apache 许可证 2.0 版获得许可。
能够表达特定的调用序列并阐明它们之间的依赖关系以实现特定目标,在 API 描述的上下文中是可取的。Arazzo 规范的目的是提供一种机制,可以定义调用序列及其依赖关系,并将它们编织在一起,并在处理 API 描述(例如 OpenAPI 描述)时,在交付特定结果或一组结果的上下文中表达。
Arazzo 规范可以以人类可读和机器可读的方式阐明这些工作流程,从而提高 API 规范讲述 API 故事的能力,从而改善消费开发人员的体验。
一个自包含的文档(或一组文档),用于定义或描述 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.json 或 arazzo.yaml。
Arazzo 描述可以由单个文档组成,也可以根据作者的意愿分成多个相互关联的部分。如果引用了其他文档中的工作流程,则必须将其作为源描述对象包含在内。在多文档描述中,包含Arazzo 规范对象的文档称为入口 Arazzo 文档。
Arazzo 规范中的数据类型基于JSON Schema 规范草案 2020-12支持的类型。请注意,整数作为一种类型也受支持,并且被定义为没有小数部分或指数部分的 JSON 数字。
如JSON Schema 验证词汇表所定义,数据类型可以具有可选的修饰符属性:format。Arazzo 还支持格式(类似于 OpenAPI 规范)以提供对基本数据类型的详细说明。
定义的格式为
类型 |
格式 |
注释 |
|---|---|---|
整数 |
int32 |
有符号 32 位 |
整数 |
int64 |
有符号 64 位(又名长整数) |
数字 |
浮点 |
|
数字 |
双精度 |
|
字符串 |
密码 |
提示 UI 隐藏输入。 |
除非另有规定,否则所有作为 URL 的属性都可以是[[!RFC3986]]第 4.2 节中定义的相对引用。除非另有规定,否则使用引用文档的 URL 解析相对引用。
在以下描述中,如果某个字段未明确必需或用必须或应描述,则可以将其视为可选。
这是Arazzo 描述的根对象。
| 字段名称 | 类型 | 描述 |
|---|---|---|
| arazzo | 字符串 |
必需。此字符串必须是 Arazzo 描述使用的Arazzo 规范版本号。arazzo字段必须由工具用于解释 Arazzo 描述。 |
| info | 信息对象 | 必需。提供有关 Arazzo 描述中包含的工作流程的元数据。元数据可以根据需要由工具使用。 |
| sourceDescriptions | [源描述对象] | 必需。此 Arazzo 描述应应用到的源描述(例如 OpenAPI 描述)列表。该列表必须至少包含一个条目。 |
| workflows | [工作流程对象] | 必需。工作流程列表。该列表必须至少包含一个条目。 |
| components | 组件对象 | 一个用于保存 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\.\-_]+$。 |
| 参数 | [参数对象 | 可重用对象] | 适用于此工作流下描述的所有步骤的参数列表。这些参数可以在步骤级别被覆盖,但不能在那里被移除。每个参数**必须**传递给由operationId、operationPath或workflowId引用的操作或工作流,如每个步骤中指定的那样。如果提供了可重用对象,它**必须**链接到当前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,以避免歧义或潜在冲突。此字段分别与operationPath和workflowId字段互斥。 |
| operationPath | 字符串 |
对源和JSON指针的引用,用于引用操作。此字段分别与operationId和workflowId字段互斥。被引用的操作**必须**在其中一个sourceDescriptions描述中描述。**必须**使用运行时表达式语法来识别源描述文档。如果引用的操作定义了operationId,则**应该**优先使用operationId而不是operationPath。 |
| workflowId | 字符串 |
引用Arazzo描述中现有工作流的workflowId。如果定义了多个arazzo类型sourceDescriptions,则**必须**使用运行时表达式(例如,$sourceDescriptions.<name>.<workflowId>)指定workflowId,以避免歧义或潜在冲突。此字段分别与operationId和operationPath字段互斥。 |
| 参数 | [参数对象 | 可重用对象] | **必须**传递给由operationId、operationPath或workflowId引用的操作或工作流的参数列表。如果某个参数已在工作流中定义,则新定义将覆盖它,但永远不会将其删除。如果提供了可重用对象,它**必须**链接到当前Arazzo文档的components/parameters中定义的参数。列表**不能**包含重复的参数。 |
| requestBody | 请求体对象 | 要传递给由operationId或operationPath引用的操作的请求体。requestBody在HTTP方法中得到完全支持,其中HTTP 1.1规范[[!RFC7231]]第4.3.1节已明确定义了请求体的语义。在其他HTTP规范含糊不清的情况下(例如GET、HEAD和DELETE),允许使用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
描述单个步骤参数。唯一的参数由name和in字段的组合定义。in字段指定了四个可能的位置
/items?id=###中,查询参数是id。| 字段名称 | 类型 | 描述 |
|---|---|---|
| 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字段有两个可能的值。
workflowId或stepId)| 字段名称 | 类型 | 描述 |
|---|---|---|
| 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字段有三个可能的值。
retryAfter和retryLimit字段约束。如果指定了stepId或workflowId,则执行引用并返回上下文,然后重试当前步骤。workflowId或stepId)| 字段名称 | 类型 | 描述 |
|---|---|---|
| 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进行描述。 |
此对象可以使用规范扩展进行扩展。
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:
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
}
一个对象,用于指定可以在Step Object successCriteria、Success Action Object criteria和Failure Action Object criteria中指定的断言中使用的内容、条件和条件类型。
支持四种类型的条件
作为条件表达式的一部分,可以使用boolean、null、number或string数据类型。
| 类型 | 字面值 |
|---|---|
boolean |
true或false |
null |
null |
数字 |
数据类型中支持的任何数字格式。 |
字符串 |
字符串**必须**使用单引号(')括起来。要使用字面量单引号,请使用另一个单引号('')转义字面量单引号。 |
| 运算符 | 描述 |
|---|---|
< |
小于 |
<= |
小于或等于 |
> |
大于 |
>= |
大于或等于 |
== |
等于 |
!= |
不等于 |
! |
非 |
&& |
与 |
|| |
或 |
() |
逻辑分组 |
[] |
索引(基于 0) |
. |
属性反引用 |
字符串比较**必须**不区分大小写。
| 字段名称 | 类型 | 描述 |
|---|---|---|
| context | {expression} |
用于设置要应用条件的上下文的运行时表达式。如果指定了type,则**必须**提供context(例如,$response.body将设置可以应用 JSONPath 查询表达式的上下文)。 |
| condition | 字符串 |
**必需**。要应用的条件。条件可以是简单的(例如,$statusCode == 200,它对从运行时表达式获得的值应用运算符),也可以是正则表达式或 JSONPath 表达式。对于正则表达式或 JSONPath,**必须**指定type和context。 |
| type | string | Criterion Expression Type Object |
要应用的条件类型。如果指定,则允许的选项为simple、regex、jsonpath或xpath。如果省略,则假定条件为simple,最多组合字面量、运算符和运行时表达式。如果为jsonpath,则表达式**必须**符合JSONPath。如果为xpath,则表达式**必须**符合XML Path Language 3.1。如果需要 JSONPath 或 XPath 的其他变体,则**必须**指定Criterion Expression Type Object。 |
此对象可以使用规范扩展进行扩展。
简单条件示例
- condition: $statusCode == 200
Regex 条件示例
- context: $statusCode
condition: '^200$'
type: regex
JSONPath 条件示例
- context: $response.body
condition: $[?count(@.pets) > 0]
type: jsonpath
一个对象,用于描述在Criterion Object中使用的表达式的类型和版本。如果未定义此对象,则应用以下默认值
定义此对象可以利用与 JSONPath 或 XPath 的旧版本兼容的工具。
| 字段名称 | 类型 | 描述 |
|---|---|---|
| type | 字符串 |
**必需**。要应用的条件类型。允许的选项为jsonpath或xpath。 |
| version | 字符串 |
**必需**。表示正在使用的表达式类型的版本的简写字符串。JSONPath 的允许值为draft-goessner-dispatch-jsonpath-00。XPath 的允许值为xpath-30、xpath-20或xpath-10。 |
此对象可以使用规范扩展进行扩展。
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] | 要在有效负载内设置的位置和值的列表。 |
此对象可以使用规范扩展进行扩展。
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}"
描述有效负载(例如,请求正文)中的位置以及要在该位置设置的值。
| 字段名称 | 类型 | 描述 |
|---|---|---|
| target | 字符串 |
**必需**。JSON Pointer或XPath 表达式,**必须**针对请求正文解析。用于识别要注入value的位置。 |
| value | Any | {expression} | **必需**。在目标位置设置的值。该值可以是常量,也可以是运行时表达式,该表达式将被评估并传递给引用的操作或工作流。 |
此对象可以使用规范扩展进行扩展。
运行时表达式示例
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 描述可能会导致对任意网络资源执行安全和不安全的操作。描述使用者有责任确保执行的操作不会造成危害。
下面描述了 Arazzo 规范建议的 MIME 媒体类型。
Arazzo 文档(例如工作流)的默认(或通用)MIME 类型定义如下
媒体类型名称:application
媒体子类型名称:vnd.oai.workflows
必需参数:N/A
可选参数:version(例如 version=1.0.0 表示工作流类型符合 Arazzo 规范的 1.0.0 版本)。
编码注意事项:编码注意事项与分别为application/json和application/yaml媒体类型指定的编码注意事项相同。
安全注意事项:请参阅上面 安全注意事项。
互操作性注意事项:N/A
注意:使用application/vnd.oai.workflows媒体类型时,使用者应准备好接收 YAML 格式的内容
需要 JSON 特定媒体类型的 Arazzo 文档(例如工作流)建议的 MIME 媒体类型定义如下
媒体类型名称:application
媒体子类型名称:vnd.oai.workflows+json
必需参数:N/A
可选参数:version(例如 version=1.0.0 表示 Arazzo 文档类型符合 Arazzo 规范的 1.0.0 版本)。
编码注意事项:编码注意事项与为application/json媒体类型指定的编码注意事项相同。
安全注意事项:请参阅上面 安全注意事项。
互操作性注意事项:N/A
需要 YAML 特定媒体类型的 Arazzo 文档(例如工作流)建议的 MIME 媒体类型定义如下
媒体类型名称:application
媒体子类型名称:vnd.oai.workflows+yaml
必需参数:N/A
可选参数:version(例如 version=1.0.0 表示 Arazzo 文档类型符合 Arazzo 规范的 1.0.0 版本)。
编码注意事项:编码注意事项与为application/yaml媒体类型指定的编码注意事项相同。
安全注意事项:请参阅上面 安全注意事项。
互操作性注意事项:N/A
| 版本 | 日期 | 备注 |
|---|---|---|
| 1.0.0 | 2024-05-29 | Arazzo 规范的首次发布 |