在 Azure 逻辑应用中处理内容类型

适用于:Azure 逻辑应用(消耗型 + 标准型)

Azure 逻辑应用支持 JSON、XML、平面文件和二进制数据等所有内容类型。 虽然某些内容类型具有原生支持,这意味着它们不需要进行转换或转化,但其他内容类型则需要进行一定的工作才能达到所需的格式。

为了帮助确定处理工作流中内容或数据的最佳方法,Azure 逻辑应用使用 Content-Type 工作流从外部调用方获取的 HTTP 请求中的标头值。

以下列表包括工作流可能会遇到的一些示例 Content-Type 值:

本指南介绍了 Azure 逻辑应用如何处理不同的内容类型,并说明在必要时如何正确转换或转换这些类型。

application/json

对于标头值为 Content-Type HTTP 请求,Azure 逻辑应用以 JavaScript 对象表示法(JSON)对象的形式存储并处理内容。 默认情况下,您可以在不进行任何类型转换或格式转换的情况下解析 JSON 内容。 还可以使用 表达式分析此内容。

例如,以下表达式使用body()函数与My_action,其中My_action是工作流中前置操作的JSON名称。

body('My_action')['client']['animal-type'][0]

以下步骤说明了表达式在无需类型转换或数据转换的情况下如何工作:

  1. body()函数从body操作中获取My_action输出对象。

  2. 从返回 body 的对象中,函数访问该 client 对象。

    client 对象包含属性 animal-type ,该属性设置为数组。

  3. 该函数访问数组中的第一项,并直接返回值“dog”,无需进行类型转换。

如果使用不使用 Content-Type 标头的 JSON 数据,可以使用 json() 函数手动将该数据转换为 JSON,例如:

json(triggerBody())['client']['animal-type']

  1. triggerBody() 函数从工作流的触发器输出中获取 body 对象。 此对象通常是 JSON 对象。

    对象的源 body 源自工作流触发器收到的入站 HTTP 请求或事件。

  2. json() 函数显式分析 bodytriggerBody() 函数返回的对象作为 JSON 对象。

    例如,当触发器正文是需要作为 JSON 处理的字符串时,此行为非常有用。

剩余的表达式行为类似于前面的示例。

创建 JSON 属性的标记

在 Azure 逻辑应用中,可以生成表示 JSON 内容中的属性的用户友好令牌。 然后,可以使用这些令牌,以便更轻松地在工作流中引用这些属性及其值。

以下列表描述了常见的工作流操作,以及可为 JSON 内容中的属性生成令牌的相应方法:

  • 请求触发器命名为收到 HTTP 请求时

    在设计器中使用 请求 触发器时,可以选择提供一个 JSON 架构,该架构定义每个属性值的 JSON 对象、属性和预期数据类型。 如果没有 JSON 架构,可以提供示例有效负载来生成可以使用的 JSON 架构。

    触发器使用架构分析传入 HTTP 请求中的 JSON 内容,并生成表示 JSON 内容中的属性的令牌。 然后,可以在工作流中的后续作中轻松引用和使用这些属性及其值。

    以下步骤介绍如何提供用于生成 JSON 架构的示例有效负载:

    1. 在设计器上,选择 “请求 ”触发器以打开信息窗格。

    2. 在“ 参数 ”选项卡上的“ 请求正文 JSON 架构 ”框下,选择 “使用示例有效负载生成架构”。

    3. Enter 或粘贴示例 JSON 有效负载 框中,输入示例有效负载,然后选择“ 完成”。

      屏幕截图显示了请求触发器,其名称为“当收到 HTTP 请求时”,并附有示例 JSON 有效负载。

      此时,生成的架构会显示在触发器中。

      屏幕截图显示了从示例 JSON 有效负载生成的 JSON 架构。

      在代码视图编辑器中,可以查看 请求 触发器的基础 JSON 定义:

      "triggers": { 
         "When_an_HTTP_request_is_received": {
            "type": "Request",
            "kind": "Http",
            "inputs": { 
               "schema": {
                  "type": "object",
                  "properties": {
                     "client": {
                        "type": "object",
                        "properties": {
                           "animal-type": {
                              "type": "array",
                              "items": {
                                 "type": "string"
                              },
                           },
                           "name": {
                              "type": "string"
                           }
                        }
                     }
                  }
               }
            }
         }
      }
      
    4. 若要触发工作流,请获取 工作流 URL 或触发器的 HTTP URL,该 URL 是在首次保存工作流后生成的。

    5. 若要测试工作流,请使用可从中向工作流 URL 或触发器 URL 发送 HTTP 请求的客户端工具或应用。 确保请求包含名为 Content-Type 的标头,标头值设置为 application/json

  • Parse JSON 操作

    在设计器中使用此作时,可以分析 JSON 输出并生成表示 JSON 内容中的属性的用户友好令牌。 然后,你可以在整个逻辑应用工作流中轻松引用和使用这些属性。

    与请求触发器类似,可以提供或生成一个 JSON 架构用于描述想要分析的 JSON 内容。 这样,便可以更轻松地使用 Azure 服务总线、Azure Cosmos DB 等服务中的数据。

    屏幕截图显示了一个解析 JSON 操作,并且其中包含从示例生成的架构。

text/plain

如果工作流收到 HTTP 请求,其中 标头值为 text/plain。 Azure 逻辑应用以原始形式存储并处理内容。 如果在后续工作流操作中引用或使用此内容而不进行类型转换或转换,则出站请求的Content-Type标头值也会被设置为text/plain

例如,假设你正在处理一个平面文件,且传入的 HTTP 请求的 Content-Type 标头值已经设置为 text/plain

Date,Name,Address
Oct-1,Frank,123 Ave

如果将此请求发送到后续操作,而该操作使用请求正文来发送另一个请求,则第二个请求也会把Content-Type标头值设置为text/plain。 如果处理的是纯文本格式的数据但未指定标题,可以使用 string() 函数手动将该数据转换为文本,例如:

string(triggerBody())

application/xml 和 application/octet-stream

Azure 逻辑应用始终在入站 HTTP 请求或响应中保留 Content-Type 标头值。 如果你的工作流收到Content-Type设置为application/octet-stream的内容,并且在后续操作中包含该内容而没有进行类型转换,则出站请求也会设置为Content-Typeapplication/octet-stream。 此方法可确保在移动工作流时数据不会丢失。 在有状态工作流中,后续作的状态、输入和输出存储在 JSON 对象中,而状态在工作流中移动。

转换器函数

为了保留某些数据类型,Azure 逻辑应用会将内容转换为二进制 base64 编码的字符串。 此字符串具有适当的元数据,以保留 $content 有效负载 和 $content-type ,后者会自动转换。

以下列表描述了使用特定 函数时 Azure 逻辑应用如何转换内容:

  • json():将数据强制转换为 application/json
  • xml():将数据强制转换为 application/xml
  • binary():将数据强制转换为 application/octet-stream
  • string():将数据强制转换为 text/plain
  • base64():将内容转换为 base64 编码的字符串。
  • base64toString():将 base64 编码的字符串转换为 text/plain
  • base64toBinary():将 base64 编码的字符串转换为 application/octet-stream
  • dataUri():将字符串转换为数据 URI。
  • dataUriToBinary():将数据 URI 转换为二进制字符串。
  • dataUriToString():将数据 URI 转换为字符串。

例如,假设工作流触发器收到一个 HTTP 请求,其中 Content-Type 被设置为 application/xml,其内容如下示例所示:

<?xml version="1.0" encoding="UTF-8" ?>
<CustomerName>Frank</CustomerName>

可以使用以下表达式来实现内容转换,该表达式利用 xml()triggerBody() 函数:

xml(triggerBody())

然后,可以将生成的内容与工作流中的后续作一起使用。 或者,可以改用以下使用 xpath()xml() 函数的表达式:

xpath(xml(triggerBody()), '/CustomerName')

其他内容类型

Azure 逻辑应用支持其他内容类型,但可能需要通过解码 $content 变量从 HTTP 请求手动获取消息正文。

例如,假设您的工作流收到一个 HTTP 请求,其中 Content-Type 被设置为 application/x-www-url-formencoded。 为了保留所有数据,请求正文包含 $content 有效负载编码为 base64 字符串的变量:

CustomerName=Frank&Address=123+Avenue

此内容类型不采用纯文本或 JSON 格式,因此 Azure 逻辑应用使用以下CustomerName=Frank&Address=123+Avenue$content-type变量进行存储$content

"body": {
   "$content-type": "application/x-www-url-formencoded",
   "$content": "AAB1241BACDFA=="
}

Azure 逻辑应用还包括用于处理表单数据的本机函数,例如:

或者,可以使用如下例等表达式手动访问数据:

string(body('formdataAction'))

若要将 application/x-www-url-formencoded 用作 Content-Type 标头值,请使用表达式(例如 body('formdataAction'))将请求内容添加到操作主体中,且无需进行任何类型转换。 仅当操作主体是 body 输入对象中的唯一参数时,此方法才有效。 如果在内容类型所在的body('formdataAction')请求中使用application/json表达式,则会收到运行时错误,因为正文已发送编码。