Manipular tipos de conteúdo em Aplicativos Lógicos do Azure
Aplica-se a: Aplicativos Lógicos do Azure (Consumo + Standard)
Vários tipos de conteúdo podem fluir por meio de um aplicativo lógico, por exemplo, JSON, XML, arquivos simples e dados binários. Embora os Aplicativos Lógicos deem suporte a todos os tipos de conteúdo, alguns têm suporte nativo e não exigem transmissão ou conversão nos aplicativos lógicos. Outros tipos podem exigir transmissão ou conversão conforme necessário. Este artigo descreve como os Aplicativos Lógicos manipulam tipos de conteúdo e como é possível transmitir ou converter corretamente esses tipos quando necessário.
Para determinar a maneira apropriada de manipular tipos de conteúdo, os Aplicativos Lógicos dependem do valor de cabeçalho Content-Type
em chamadas HTTP, por exemplo:
- aplicativo/json (tipo nativo)
- texto/simples (tipo nativo)
- Fluxo de dados de aplicativo/xml e aplicativo/octet
- Outros tipos de conteúdo
aplicativo/json
Os Aplicativos Lógicos armazenam e manipulam qualquer solicitação com o tipo de conteúdo aplicativo/json como um objeto JSON (JavaScript Object Notation).
Por padrão, é possível analisar o conteúdo do JSON sem qualquer conversão.
Para analisar uma solicitação que tenha um cabeçalho com o tipo de conteúdo "application/json", é possível usar uma expressão. Este exemplo retorna o valor dog
da matriz animal-type
sem conversão:
@body('myAction')['animal-type'][0]
{
"client": {
"name": "Fido",
"animal-type": [ "dog", "cat", "rabbit", "snake" ]
}
}
Se estiver trabalhando com dados JSON que não especificam um cabeçalho, você poderá converter manualmente esses dados para JSON usando a função json(), por exemplo:
@json(triggerBody())['animal-type']
Criar tokens para propriedades JSON
Os Aplicativos Lógicos possibilitam gerar tokens amigáveis que representam as propriedades no conteúdo JSON para que você possa referenciar e usar essas propriedades com mais facilidade no fluxo de trabalho do aplicativo lógico.
Gatilho de solicitação
Quando você usa esse gatilho no Designer do Aplicativo Lógico, é possível fornecer um esquema JSON que descreva o conteúdo que espera receber. O designer analisa o conteúdo JSON usando esse esquema e gera tokens amigáveis que representam as propriedades no conteúdo JSON. É possível então facilmente referenciar e usar essas propriedades em todo o fluxo de trabalho do aplicativo lógico.
Se não tiver um esquema, você pode gerar o esquema.
No gatilho de Solicitação, selecione Usar o conteúdo de amostra para gerar o esquema.
Em Inserir ou colar um conteúdo JSON de amostra, forneça um conteúdo de exemplo e, em seguida, escolha Concluído. Por exemplo:
O esquema gerado agora aparece no gatilho.
Aqui está a definição subjacente para o gatilho de Solicitação no editor de exibição de código:
"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" } } } } } } } }
Na solicitação HTTP que o aplicativo cliente envia aos Aplicativos Lógicos do Azure, inclua um cabeçalho chamado Content-Type e defina o valor do cabeçalho como application/json.
Ação analisar JSON
Ao usar essa ação no Designer do Aplicativo Lógico, será possível analisar a saída JSON e gerar tokens amigáveis que representem as propriedades no conteúdo JSON. É possível então facilmente referenciar e usar essas propriedades em todo o fluxo de trabalho do aplicativo lógico. Semelhante ao gatilho Solicitar, é possível fornecer ou gerar um esquema JSON que descreva o conteúdo JSON que você quer analisar. Dessa forma, será mais fácil consumir dados do Barramento de Serviço do Azure, Azure Cosmos DB e assim por diante.
texto/sem formatação
Quando o aplicativo lógico recebe as mensagens HTTP que tenham o cabeçalho Content-Type
definido como text/plain
, o aplicativo lógico armazena essas mensagens em forma bruta.
Se essas mensagens forem incluídas em ações subsequentes sem conversão, essas solicitações saem com o cabeçalho Content-Type
definido como text/plain
.
Por exemplo, ao trabalhar com um arquivo simples, você poderá receber uma solicitação HTTP com o cabeçalho Content-Type
definido como tipo de conteúdo text/plain
:
Date,Name,Address
Oct-1,Frank,123 Ave
Se você então enviar essa solicitação em uma ação subsequente como o corpo para outra solicitação, por exemplo, @body('flatfile')
, a segunda solicitação também terá um cabeçalho Content-Type
definido como text/plain
. Caso esteja trabalhando com dados de texto sem formatação, mas não especificar um cabeçalho, será possível converter manualmente esses dados para texto usando a função string() como esta expressão:
@string(triggerBody())
Fluxo de dados de aplicativo/xml e aplicativo/octet
Os aplicativos lógicos sempre mantêm o Content-Type
em uma resposta ou solicitação HTTP recebida.
Portanto, se o aplicativo lógico recebe o conteúdo com Content-Type
definido como application/octet-stream
, e você inclui esse conteúdo em uma ação subsequente sem conversão, a solicitação de saída também terá Content-Type
definido como application/octet-stream
.
Dessa forma, os Aplicativos Lógicos podem garantir que os dados não sejam perdidos ao movê-los através do fluxo de trabalho.
No entanto, o estado de ação, ou entradas e saídas, é armazenado em um objeto JSON conforme o estado é movido no fluxo de trabalho.
Funções de conversor
Para preservar alguns tipos de dados, os Aplicativos Lógicos convertem o conteúdo em uma cadeia de caracteres codificada em base64 binária com os metadados apropriados que preservam o conteúdo $content
e $content-type
, que são convertidos automaticamente.
Esta lista descreve como os Aplicativos Lógicos convertem o conteúdo quando você usa as seguintes funções:
-
json()
: Converte dados emapplication/json
-
xml()
: Converte dados emapplication/xml
-
binary()
: Converte dados emapplication/octet-stream
-
string()
: Converte dados emtext/plain
-
base64()
: Converte o conteúdo para uma cadeia de caracteres codificada em base64 -
base64toString()
: Converte uma cadeia de caracteres codificada em base64 paratext/plain
-
base64toBinary()
: Converte uma cadeia de caracteres codificada em base64 paraapplication/octet-stream
-
dataUri()
: Converte uma cadeia de caracteres para um dado URI -
dataUriToBinary()
: Converte um dado URI para uma cadeia de caracteres binários -
dataUriToString()
: Converte um dado URI para uma cadeia de caracteres
Por exemplo, se você receber uma solicitação HTTP em que Content-Type
é definido como application/xml
, tal como este conteúdo:
<?xml version="1.0" encoding="UTF-8" ?>
<CustomerName>Frank</CustomerName>
É possível converter esse conteúdo usando a expressão @xml(triggerBody())
com as funções xml()
e triggerBody()
, e então usar esse conteúdo posteriormente. Como alternativa, é possível usar a expressão @xpath(xml(triggerBody()), '/CustomerName')
com as funções xpath()
e xml()
.
Outros tipos de conteúdo
Os Aplicativos Lógicos funcionam e são compatíveis com outros tipos de conteúdo, mas podem exigir que você obtenha manualmente o corpo da mensagem, decodificando a variável $content
.
Por exemplo, suponha que o aplicativo lógico é disparado por uma solicitação com o tipo de conteúdo application/x-www-url-formencoded
.
Para preservar todos os dados, a variável $content
no corpo da solicitação tem um conteúdo que é codificado como uma cadeia de caracteres base64:
CustomerName=Frank&Address=123+Avenue
Como a solicitação não é texto sem formatação, nem JSON, ela é armazenada na ação da seguinte maneira:
"body": {
"$content-type": "application/x-www-url-formencoded",
"$content": "AAB1241BACDFA=="
}
Os Aplicativos Lógicos fornecem funções nativas para manipular dados de formulário, por exemplo:
Ou então, é possível acessar manualmente os dados usando uma expressão, como neste exemplo:
@string(body('formdataAction'))
Se quiser que a solicitação de saída também tenha o cabeçalho de tipo de conteúdo application/x-www-url-formencoded
, você pode adicionar a solicitação ao corpo da ação sem conversões, usando uma expressão como @body('formdataAction')
.
No entanto, esse método só funciona se o corpo for o único parâmetro na entrada body
. Se você tentar usar a expressão @body('formdataAction')
em uma solicitação application/json
, receberá um erro de runtime porque o corpo é enviado codificado.