在 Azure 逻辑应用中处理内容类型
适用范围:Azure 逻辑应用(消耗型 + 标准型)
有各种类型的内容可以流过逻辑应用,例如 JSON、XML、平面文件和二进制数据。 逻辑应用支持所有内容类型,并且原生支持其中的某些类型,而不需要在逻辑应用中进行强制转换或转换。 但是,还有一些类型可能需要进行强制转换或转换。 本文介绍逻辑应用如何处理内容类型,以及我们在必要时如何正确强制转换或转换这些类型。
逻辑应用依赖于 HTTP 调用中的 Content-Type
标头值来确定处理内容类型的适当方式,例如:
application/json
逻辑应用会存储并处理使用 application/json 内容类型作为 JavaScript 表示法 (JSON) 对象的任何请求。
默认情况下,无需任何强制转换,即可分析 JSON 内容。
若要分析包含内容类型为“application/json”的标头的请求,可以使用表达式。 此示例返回 animal-type
数组中的 dog
值,且无需强制转换:
@body('myAction')['animal-type'][0]
{
"client": {
"name": "Fido",
"animal-type": [ "dog", "cat", "rabbit", "snake" ]
}
}
如果处理的 JSON 数据未指定标头,可以使用 json() 函数手动将该数据强制转换为 JSON,例如:
@json(triggerBody())['animal-type']
创建 JSON 属性的标记
逻辑应用提供相应的功能来生成用户友好的标记,用于表示 JSON 内容中的属性,以便在逻辑应用的工作流中更轻松地引用和使用这些属性。
请求触发器
在逻辑应用设计器中使用此触发器时,可以提供一个 JSON 架构用于描述预期要接收的有效负载。 设计器使用此架构分析 JSON 内容,并生成用户友好的标记来表示 JSON 内容中的属性。 然后,你可以在整个逻辑应用工作流中轻松引用和使用这些属性。
如果没有架构,可以生成架构。
在请求触发器中,选择“使用示例有效负载生成架构”。
在“输入或粘贴示例 JSON 有效负载”下,提供示例有效负载并选择“完成”。 例如:
此时,生成的架构会显示在触发器中。
下面是代码视图编辑器中请求触发器的基础定义:
"triggers": { "manual": { "type": "Request", "kind": "Http", "inputs": { "schema": { "type": "object", "properties": { "client": { "type": "object", "properties": { "animal-type": { "type": "array", "items": { "type": "string" }, }, "name": { "type": "string" } } } } } } } }
在客户端应用发送到 Azure 逻辑应用的 HTTP 请求中,请确保包含名为 Content-Type 的标头,并将标头的值设置为 application/json。
Parse JSON 操作
在逻辑应用设计器中使用此操作时,可以分析 JSON 输出,并生成用户友好的标记用于表示 JSON 内容中的属性。 然后,你可以在整个逻辑应用工作流中轻松引用和使用这些属性。 与请求触发器类似,可以提供或生成一个 JSON 架构用于描述想要分析的 JSON 内容。 这样,便可以更轻松地使用 Azure 服务总线、Azure Cosmos DB 等服务中的数据。
text/plain
当逻辑应用收到 Content-Type
标头设置为 text/plain
的 HTTP 消息时,逻辑应用将以原始格式存储这些消息。
如果在后续操作中包含这些消息且不进行强制转换,则会在将 Content-Type
标头设置为 text/plain
的情况下传出请求。
例如,在处理某个平面文件时,可能会收到 Content-Type
标头设置为 text/plain
内容类型的 HTTP 请求:
Date,Name,Address
Oct-1,Frank,123 Ave
如果随后在某个后续操作中发送此请求作为另一个请求的正文(例如 @body('flatfile')
),则第二个请求的 Content-Type
标头也会设置为 text/plain
。 如果正在处理纯文本数据但未指定标头,可按以下表达式中所示,使用 string() 函数手动将该数据强制转换为文本:
@string(triggerBody())
application/xml and application/octet-stream
逻辑应用始终保留收到的 HTTP 请求或响应中的 Content-Type
。
因此,如果逻辑应用收到了 Content-Type
设置为 application/octet-stream
的内容,而你在某个后续操作中包含该内容且不进行强制转换,则传出的请求的 Content-Type
也会设置为 application/octet-stream
。
这样,逻辑应用可以保证在经历工作流的不同阶段时,该数据不会丢失。
但是,当状态在工作流中转移时,操作状态或输入和输出将存储在 JSON 对象中。
转换器函数
为了保留某些数据类型,逻辑应用会将内容转换为二进制 base64 编码的字符串,该字符串包含同时保留 $content
有效负载和 $content-type
(可自动转换)的相应元数据。
此列表描述了使用这些函数时逻辑应用如何转换内容:
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()
:将字符串转换为数据 URIdataUriToBinary()
:将数据 URI 转换为二进制字符串dataUriToString()
:将数据 URI 转换为字符串
例如,如果收到 Content-Type
设置为 application/xml
的 HTTP 请求,如以下内容所示:
<?xml version="1.0" encoding="UTF-8" ?>
<CustomerName>Frank</CustomerName>
可以使用包含 xml()
和 triggerBody()
函数的 @xml(triggerBody())
表达式来强制转换此内容,然后再使用此内容。 或者,可以使用包含 xpath()
和 xml()
函数的 @xpath(xml(triggerBody()), '/CustomerName')
表达式。
其他内容类型
逻辑应用使用并支持其他内容类型,但你可能需要通过解码 $content
变量来手动获取消息正文。
例如,假设具有 application/x-www-url-formencoded
内容类型的请求触发了逻辑应用。
为了保留所有数据,请求正文中的 $content
变量包含一个编码为 base64 字符串的有效负载:
CustomerName=Frank&Address=123+Avenue
由于该请求未采用纯文本或 JSON 格式,因此将存储在操作中,如下所示:
"body": {
"$content-type": "application/x-www-url-formencoded",
"$content": "AAB1241BACDFA=="
}
逻辑应用提供本机函数用于处理表单数据:
或者,可以使用以下示例所示的表达式来手动访问数据:
@string(body('formdataAction'))
如果希望传出的请求包含相同的 application/x-www-url-formencoded
内容类型标头,可将请求添加到操作的正文,而无需使用类似于 @body('formdataAction')
的表达式执行任何强制转换。
但是,仅当正文是 body
输入中的唯一参数时,此方法才有效。 如果尝试在 application/json
请求中使用 @body('formdataAction')
表达式,将发生运行时错误,因为发送了编码的正文。