> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kasoftware.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 工作流 API

> 使用工作流 API 创建知行之桥工作流并将其公开为可查询的 REST 接口。

export const CommonCors = () => <>
    <table>
      <thead>
        <tr><th>设置</th><th>描述</th></tr>
      </thead>
      <tbody>
        <tr>
          <td><strong>启用跨源资源共享 (CORS)</strong></td>
          <td>是否启用 CORS。仅当选中此框时，其余选项才可用。</td>
        </tr>
        <tr>
          <td><strong>允许所有不带 '*' 的域</strong></td>
          <td>如果启用，域来源不限于特定列表。</td>
        </tr>
        <tr>
          <td><strong>Access-Control-Allow-Origin</strong></td>
          <td>要允许的以逗号分隔的域来源列表。作为 HTTP 响应消息头包含在内。</td>
        </tr>
        <tr>
          <td><strong>Access-Control-Allow-Credentials</strong></td>
          <td>跨域请求中是否允许用户凭据（例如 cookie）。作为 HTTP 响应消息头包含在内。</td>
        </tr>
        <tr>
          <td><strong>Access-Control-Allow-Methods</strong></td>
          <td>允许的以逗号分隔的方法列表。作为 HTTP 响应消息头包含在内。</td>
        </tr>
        <tr>
          <td><strong>Access-Control-Allow-Headers</strong></td>
          <td>允许的消息头的逗号分隔列表。作为 HTTP 响应消息头包含在内。</td>
        </tr>
        <tr>
          <td><strong>Access-Control-Max-Age</strong></td>
          <td>可以缓存 Access-Control 响应消息头值的最大持续时间（以秒为单位）。</td>
        </tr>
      </tbody>
    </table>
  </>;

export const siteNameShort = "知行之桥";

export const siteName = "知行之桥";

工作流 API 使你能够创建模块化的单路径 {siteNameShort} 工作流，并将它们公开为可以查询的接口。{siteNameShort} 会处理你传递给工作流 API 接口的数据，并将结果返回给查询服务。

你可以使用工作流 API 从外部应用程序和服务执行 {siteNameShort} 工作流。这种灵活性使你能够使用自己选择的工具来管理工作流和自动化。

## 视频资源

观看此短视频，了解如何设置和使用工作流 API。

<iframe width="560" height="315" src="//player.bilibili.com/player.html?aid=700508398&bvid=BV1Hm4y1J7VW&cid=1185497528&page=1" scrolling="no" border="0" frameBorder="no" framespacing="0" allowFullScreen />

## 创建工作流 API

通过以下步骤创建工作流 API：

1. 在工作流画布上，右键单击端口并选择 **创建 API 设置**。

   <img src="https://mintcdn.com/qiao/bVtjD3fvHFZBo1vE/public/images/flow_api_create.png?fit=max&auto=format&n=bVtjD3fvHFZBo1vE&q=85&s=a8b0cabbb5eac95486cb9e9f9596f459" alt="Create API Settings option in connector context menu" width="350" data-path="public/images/flow_api_create.png" />

   <Note>工作流 API 目前不支持某些端口。如果端口不受支持，当你尝试将该端口添加到工作流 API 时，{siteNameShort} 会显示一条错误消息。有关不能在工作流 API 中使用的端口列表，请参阅[不支持的端口](#不支持的端口)。</Note>

2. **创建 API 设置** 页面会打开。在 **方法** 字段中，选择你希望工作流 API 接受请求的 HTTP 方法。选项包括 **GET**、**POST**、**PUT**、**PATCH** 和 **DELETE**。创建工作流 API 后，可以根据需要更改此设置。

   <img src="https://mintcdn.com/qiao/bVtjD3fvHFZBo1vE/public/images/flow_api_createsettings.png?fit=max&auto=format&n=bVtjD3fvHFZBo1vE&q=85&s=4a0f526bc16dff1b79172817ae2cdf91" alt="Create API Settings page" width="500" data-path="public/images/flow_api_createsettings.png" />

3. 在 **路径** 字段中，输入工作流 API 的名称。发出 API 查询时会使用此名称。

   <Note>只有当 API 名称执行不同功能时，才可以重复使用。例如，可以有一个名为 API\_X12、执行 POST 功能的工作流 API，也可以有一个名为 API\_X12、执行 PATCH 功能的工作流 API，但不能有两个都名为 API\_x12 且都执行 POST 功能的工作流 API。</Note>

4. 单击 **创建 API**。你的工作流 API 将出现在工作区中。

   <img src="https://mintcdn.com/qiao/bVtjD3fvHFZBo1vE/public/images/flow_api_workspace.png?fit=max&auto=format&n=bVtjD3fvHFZBo1vE&q=85&s=14f3e16d3d704a68d2dfa6b616e89f77" alt="Flow API in the workspace" width="500" data-path="public/images/flow_api_workspace.png" />

5. 将其他端口拖到工作流 API 框中，并将它们连接在一起。也可以向工作流 API 框添加注解。

<Note>工作流 API 中的第一个端口从发出查询的实体接收输入数据，最后一个端口将输出数据发送回发出查询的实体。</Note>

完成添加和链接端口后，可以[配置和测试工作流 API](#配置和测试工作流-api)。

### 不支持的端口

工作流 API 中的端口必须以一种方式连接，从而为每个输入消息产生一个输出消息。不支持基于计划或外部进程处理文件的端口。因此，工作流 API 中不允许使用以下端口：

* [API](/26.2/self-hosted/zh/connectors/api/api)
* [Copy](/26.2/self-hosted/zh/connectors/copy)
* [Email Receive](/26.2/self-hosted/zh/connectors/email-receive)
* [Form](/26.2/self-hosted/zh/connectors/form)
* [FTP Server](/26.2/self-hosted/zh/connectors/ftp-server)
* [RSS](/26.2/self-hosted/zh/connectors/rss)
* [Schedule](/26.2/self-hosted/zh/connectors/schedule)
* [SFTP Server](/26.2/self-hosted/zh/connectors/sftp-server)
* [Webhook](/26.2/self-hosted/zh/connectors/webhook)
* [Workspace Receive](/26.2/self-hosted/zh/connectors/workspace-receive)

### 工作流 API 示例

以下示例显示了一个配置为 POST 的工作流 API 的真实用例：

<img src="https://mintcdn.com/qiao/bVtjD3fvHFZBo1vE/public/images/flow_api_example.png?fit=max&auto=format&n=bVtjD3fvHFZBo1vE&q=85&s=c9b545392785a5238a10f0e8a36ec981" alt="Example Flow API in the workspace" width="600" data-path="public/images/flow_api_example.png" />

此工作流 API 执行以下工作流：

1. 数据在开始节点以加密的 X12 文件形式接收。

2. OpenPGP\_Decrypt 端口解密 X12 文件，并将其传递给 X12 端口。

3. X12 端口将 X12 文件转换为 XML，并将转换后的 XML 文件传递给 JSON 端口。

4. JSON 端口将 XML 文件转换为 JSON 格式，并将转换后的文件传递给 OpenPGP\_Encrypt 端口，后者对 JSON 文件进行加密。

5. 加密的 JSON 文件通过结束节点返回。

在本例中，每个端口都链接到另外两个端口，一个在前面，一个在后面。开始和结束节点会自动添加到工作流的接口。

## 配置和测试工作流 API

创建工作流 API 后，可以配置其设置并运行示例请求来测试配置。

### 配置设置

单击工作流 API 标题中的齿轮状设置图标，以打开 **设置** 面板。

<img src="https://mintcdn.com/qiao/bVtjD3fvHFZBo1vE/public/images/flow_api_opensettings.png?fit=max&auto=format&n=bVtjD3fvHFZBo1vE&q=85&s=dc41da5627810cb6ee04ef82aa31c803" alt="Opening the Flow API settings pane" width="400" data-path="public/images/flow_api_opensettings.png" />

在此面板中，可以配置工作流 API 的行为。

<img src="https://mintcdn.com/qiao/bVtjD3fvHFZBo1vE/public/images/flow_api_settings.png?fit=max&auto=format&n=bVtjD3fvHFZBo1vE&q=85&s=23fe2090aae7fcdcee982161c75566e0" alt="Flow API settings pane" width="600" data-path="public/images/flow_api_settings.png" />

这些设置在以下章节中概述。

#### 请求

在 **路径** 字段中，选择工作流 API 的请求类型。如果更改请求类型，请确保端口的结构和配置对于新的请求类型是正确的。

使用 **说明** 字段输入工作流 API 的可选描述。当你有多个工作流 API 并希望跟踪每个工作流 API 的用途时，这会很有用。

#### 元数据头

请求中包含的所有头信息都会随消息在工作流中传递时保留下来。这些头以 `API-Header-` 为前缀，因此名为 `MyHeader` 的头将显示为 `API-Header-MyHeader`。在[日志页面](/26.2/self-hosted/zh/getting-started/administration/activity)中展开消息或交易时，或查看消息详情时，可以看到这些头。也可以在端口的 **交易记录** 选项卡上展开交易时查看头信息。

#### 查询参数

此部分使你能够为工作流指定查询字符串参数。如果在此处添加参数，当消息沿工作流向下传递时，它们将作为元数据头保留下来。这些头以 `API-QueryParameter-` 为前缀，因此 `test` 的查询字符串将使用 `API-QueryParameter-test`。这些头与[元数据头](#元数据头)显示在相同的位置。

如果你希望将某些信息作为请求的一部分传递，但该信息不是请求体的一部分，那么此功能会很有用。例如，如果想要查询数据库中特定公司的最近销售订单 ID，可以将 CompanyName 查询参数添加到 API 中，并在工作流中使用 `API-QueryParameter-CompanyName` 头引用它。

#### 主体和响应

在 **主体** 部分中，选择与查询客户端和工作流 API 通信方式相对应的 **类型**：

* **None**—请求中不预期包含主体
* **Raw**—任意格式的自由格式数据
* **Form data**—名称-值对
* **x-www-form-urlencoded**

在 **主体** 和 **响应** 的文本字段中，使用下拉菜单选择主体和响应的预期数据格式（**XML**、**JSON** 或 **Custom**）。

#### 处理二进制文件

工作流 API 支持将二进制文件（PDF、JPEG 或其他二进制文件类型）作为请求体或响应体进行上传和下载。打开测试面板（参见[测试工作流 API](#测试工作流-api)）时，工作流 API 包含：

* 当请求体内容类型为二进制文件时，提供文件上传按钮，如下图所示

  <img src="https://mintcdn.com/qiao/bVtjD3fvHFZBo1vE/public/images/flow_api_upload_file.png?fit=max&auto=format&n=bVtjD3fvHFZBo1vE&q=85&s=ce3c0566f2ec2b2566605f2f7808a29f" alt="File upload button in the testing pane" width="500" data-path="public/images/flow_api_upload_file.png" />

* 当响应内容类型为二进制文件时，提供文件下载按钮

<Note>如果需要 API 返回 Base64 编码的文本而不是二进制文件，需要使用 [Script](/26.2/self-hosted/zh/connectors/script) 端口将输出编码为 Base64，并将响应内容类型设置为类似 `text/plain` 的类型。</Note>

### 测试工作流 API

要打开工作流 API 的测试面板，请单击工作流 API 标题中的三角形图标。

<img src="https://mintcdn.com/qiao/bVtjD3fvHFZBo1vE/public/images/flow_api_opentest.png?fit=max&auto=format&n=bVtjD3fvHFZBo1vE&q=85&s=70a8f36d132564c70f0ebb0215bde129" alt="Opening the Flow API testing pane" width="400" data-path="public/images/flow_api_opentest.png" />

在测试面板中，左侧的框充当请求，右侧的框显示响应。每个框都会显示在设置面板中选择的预期数据格式。

<img src="https://mintcdn.com/qiao/bVtjD3fvHFZBo1vE/public/images/flow_api_test.png?fit=max&auto=format&n=bVtjD3fvHFZBo1vE&q=85&s=fbd0780d609011f794bb1879d911f5bf" alt="Flow API testing pane" width="800" data-path="public/images/flow_api_test.png" />

要测试工作流 API，请在左侧框中输入测试查询，然后单击 **执行**。如果响应与预期结果匹配，则工作流 API 已可使用。如果响应不正确，请检查工作流 API 的配置以及工作流 API 中每个端口的配置。

## 将工作流 API 与外部应用程序一起使用

以下步骤说明如何从外部客户端调用工作流 API。此示例展示了如何从 Postman 执行工作流 API，但也可以使用任何能够发送 REST 请求的客户端。

1. 使用工作流设计器右下角的 **选择多个端口** 选项，选择要公开为 API 的工作流。然后单击 **创建 API 设置**。此操作会打开 **创建 API 设置** 对话框。

2. 选择一个方法（例如 **POST**），如下所示，并为 API 指定一个有意义的名称。

   <img src="https://mintcdn.com/qiao/U-KEZ9JbQY4Wqs1D/public/images/arc_flow_method.png?fit=max&auto=format&n=U-KEZ9JbQY4Wqs1D&q=85&s=ed76871b9ef0e44cfc69a1218fd7224d" alt="Select a method in Create API Settings" width="500" data-path="public/images/arc_flow_method.png" />

3. 单击 **创建 API** 创建工作流 API。

4. 在 **设置** 面板中，配置工作流 API，以在 **主体** 部分定义预期的 <var>Content-Type</var> 值，并在 **响应** 部分定义所需响应的 <var>Content-Type</var> 值。也可以选择为请求和响应提供示例数据。

5. 复制 **请求** 面板中显示的路径，如下所示。

   <img src="https://mintcdn.com/qiao/U-KEZ9JbQY4Wqs1D/public/images/arc_copy_path_from_request_pane.png?fit=max&auto=format&n=U-KEZ9JbQY4Wqs1D&q=85&s=1bc37e96c77fa019a1b7d98b01c433fa" alt="The path in the Request pane" width="500" data-path="public/images/arc_copy_path_from_request_pane.png" />

6. 打开 Postman 应用程序。确保 <var>Content-Type</var> 下拉列表中显示相同的内容类型（在本例中为 **POST**）。然后，将在 {siteNameShort} 中复制的路径（第 5 步）粘贴到请求 URL 字段中。将请求正文指定为应启动工作流的内容。

   <img src="https://mintcdn.com/qiao/U-KEZ9JbQY4Wqs1D/public/images/arc_body_content.png?fit=max&auto=format&n=U-KEZ9JbQY4Wqs1D&q=85&s=680ee31500857b96cd48a265f9687ce9" alt="Copy and paste the Content-Type path in Postman" width="800" data-path="public/images/arc_body_content.png" />

7. 对工作流 API 进行身份验证。工作流 API 使用与 Admin API 相同的身份验证规则。此示例使用身份验证令牌头（**x-cdata-authtoken**）作为身份验证方法。

   要使用该方法：

   1. 单击导航栏上的 **设置** 齿轮图标。然后，单击 **添加** 以打开 **添加用户** 对话框，或编辑现有用户。

   2. 在出现的对话框中，选中 **API Access** 复选框以显示身份验证令牌。（请将此令牌复制到安全位置，因为该对话框不会再次显示。如果丢失或删除身份验证令牌，则必须创建新令牌。）然后单击 **保存更改**。

   3. 返回 Postman 应用程序并按如下方式添加工作流 API 的身份验证凭据：

      1. 单击 **Headers** 选项卡。

      2. 将 **x-cdata-authtoken** 粘贴到 **Key** 字段中。

      3. 将在 {siteNameShort} 中复制的身份验证令牌粘贴到 **Value** 字段中。

8. 请求准备就绪后，单击 **Send** 按钮。应该会看到对所发送请求的响应，如下例所示：

   <img src="https://mintcdn.com/qiao/U-KEZ9JbQY4Wqs1D/public/images/arc_response_to_request.png?fit=max&auto=format&n=U-KEZ9JbQY4Wqs1D&q=85&s=a48383367e41a270578e863ce95954e4" alt="Response to the request in Postman" width="800" data-path="public/images/arc_response_to_request.png" />

### 跨源资源共享（CORS）

可以通过导航到[安全选项卡](/26.2/self-hosted/zh/getting-started/administration/settings/security)中的 [Admin API](/26.2/self-hosted/zh/admin-api) 部分，为工作流 API 配置跨源资源共享（CORS）。CORS 允许基于浏览器的客户端连接到 {siteNameShort}。如果没有 CORS，由于浏览器强制执行同源策略，基于浏览器的脚本将无法连接到 {siteNameShort}。此策略限制客户端脚本和文档加载其来源之外的资源。脚本的来源由协议、主机和端口组成。

<CommonCors />
