Gestire i tipi di contenuto di app per la logicaHandle content types in logic apps

Molti tipi diversi di contenuto possono attraversare un'app per la logica, tra cui JSON, XML, file flat e dati binari.Many different types of content can flow through a logic app, including JSON, XML, flat files, and binary data. Sebbene il motore di App per la logica supporti tutti i tipi di contenuto, alcuni vengono riconosciuti in modo nativo dal motore.While the Logic Apps Engine supports all content types, some are natively understood by the Logic Apps Engine. Altri potrebbero richiedere cast o conversioni in base alle esigenze.Others might require casting or conversions as necessary. Questo articolo descrive come il motore gestisce i differenti tipi di contenuto e come gestire correttamente questi tipi quando è necessario.This article describes how the engine handles different content types and how to correctly handle these types when necessary.

Intestazione Content-TypeContent-Type Header

Per semplicità, esaminiamo due valori Content-Types che non richiedono alcuna conversione o cast da usare nei tipi di contenuto application/json e text/plain di un'app per la logica.To start basically, let's look at the two Content-Types that don't require conversion or casting that you can use in a logic app: application/json and text/plain.

Application/JSONApplication/JSON

Il motore del flusso di lavoro si basa sull'intestazione Content-Type delle chiamate HTTP per determinare la gestione appropriata.The workflow engine relies on the Content-Type header from HTTP calls to determine the appropriate handling. Qualsiasi richiesta con tipo di contenuto application/json viene archiviata e gestita come un oggetto JSON.Any request with the content type application/json is stored and handled as a JSON Object. Per impostazione predefinita, il contenuto JSON può anche essere analizzato senza che sia necessario alcun cast.Also, JSON content can be parsed by default without needing any casting.

Ad esempio, è possibile analizzare una richiesta con l'intestazione content-type application/json in un flusso di lavoro usando un'espressione come @body('myAction')['foo'][0] per ottenere il valore bar in questo caso:For example, you could parse a request that has the content type header application/json in a workflow by using an expression like @body('myAction')['foo'][0] to get the value bar in this case:

{
    "data": "a",
    "foo": [
        "bar"
    ]
}

Non è necessario alcun cast aggiuntivo.No additional casting is needed. Se si lavora con dati JSON ma non è stata specificata un'intestazione, è possibile impostare manualmente i dati su JSON usando la funzione @json(), ad esempio @json(triggerBody())['foo'].If you are working with data that is JSON but didn't have a header specified, you can manually cast it to JSON using the @json() function, for example: @json(triggerBody())['foo'].

Schema e generatore di schemiSchema and schema generator

Il trigger della richiesta consente di immettere uno schema JSON per il payload che si prevede di ricevere.The Request trigger lets you to enter a JSON schema for the payload you expect to receive. Questo schema consente alla finestra di progettazione di generare token per consentire di usare il contenuto della richiesta.This schema lets the designer generate tokens so you can consume the content of the request. Se non si dispone di uno schema pronto, selezionare Usare il payload di esempio per generare lo schema per generare uno schema JSON da un payload di esempio.If you don't have a schema ready, select Use sample payload to generate schema, so you can generate a JSON schema from a sample payload.

Schema

Azione di "analisi JSON"'Parse JSON' action

L'azione Parse JSON consente di analizzare il contenuto JSON in token descrittivi per l'uso di app per la logica.The Parse JSON action lets you parse JSON content into friendly tokens for logic app consumption. Analogamente al trigger di richiesta, questa azione consente di immettere o generare uno schema JSON per il contenuto da analizzare.Similar to the Request trigger, this action lets you enter or generate a JSON schema for the content you want to parse. Questo strumento rende molto più semplice l'uso di dati da Bus di servizio, Cosmos DB e così via.This tool makes consuming data from Service Bus, Azure Cosmos DB, and so on, much easier.

Analizzare JSON

Text/plainText/plain

Come per application/json, i messaggi HTTP ricevuti con l'intestazione Content-Type di text/plain vengono archiviati nel formato non elaborato.Similar to application/json, HTTP messages received with the Content-Type header of text/plain are stored in raw form. Inoltre, se questi messaggi sono inclusi in azioni successive senza eseguire il cast, queste richieste passano con l'intestazione Content-Type: text/plain.Also, if those messages are included in subsequent actions without casting, those requests go out with Content-Type: text/plain header. Ad esempio, quando si usa un file flat, è possibile che venga visualizzato questo contenuto HTTP come text/plain:For example, when working with a flat file, you might get this HTTP content as text/plain:

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

Se nell'azione successiva si invia la richiesta come corpo di un'altra richiesta (@body('flatfile')), la richiesta avrà un'intestazione Content-Type text/plain.If in the next action, you send the request as the body of another request (@body('flatfile')), the request would have a text/plain Content-Type header. Se si lavora con dati che sono testo normale ma non è stata specificata un'intestazione, è possibile impostare manualmente i dati come testo usando la funzione @string(), ad esempio @string(triggerBody()).If you are working with data that is plain text but didn't have a header specified, you can manually cast the data to text using the @string() function, for example: @string(triggerBody()).

Application/xml, Application/octet-stream e funzioni del convertitoreApplication/xml and Application/octet-stream and converter functions

Il motore dell'app per la logica mantiene sempre il valore Content-Type che è stato ricevuto per la richiesta o risposta HTTP.The Logic Apps Engine always preserves the Content-Type that was received on the HTTP request or response. Se quindi il motore riceve contenuto con il Content-Type di application/octet-stream e si include questo contenuto in un'azione successiva senza eseguire il cast, la richiesta in uscita ha Content-Type: application/octet-stream.So if the engine receives content with the Content-Type of application/octet-stream, and you include that content in a subsequent action without casting, the outgoing request has Content-Type: application/octet-stream. In questo modo, il motore può garantire che non vengano persi dati durante lo spostamento nel flusso di lavoro.This way, the engine can guarantee data isn't lost while moving through the workflow. Tuttavia, lo stato dell'azione, ovvero gli input e gli output, viene archiviato in un oggetto JSON mentre attraversa il flusso di lavoro.However, the action state (inputs and outputs) is stored in a JSON object as the state moves through the workflow. Per mantenere alcuni tipi di dati, il motore converte il contenuto in una stringa binaria con codifica Base64, con i metadati appropriati per conservare sia $content che $content-type, che viene automaticamente convertita.So to preserve some data types, the engine converts the content to a binary base64 encoded string with appropriate metadata that preserves both $content and $content-type, which are automatically be converted.

  • @json(): esegue il cast dei dati in application/json@json() - casts data to application/json
  • @xml(): esegue il cast dei dati in application/xml@xml() - casts data to application/xml
  • @binary(): esegue il cast dei dati in application/octet-stream@binary() - casts data to application/octet-stream
  • @string(): esegue il cast dei dati in text/plain@string() - casts data to text/plain
  • @base64() : converte il contenuto in una stringa Base64@base64() - converts content to a base64 string
  • @base64toString(): converte una stringa Base64 codificata in text/plain@base64toString() - converts a base64 encoded string to text/plain
  • @base64toBinary(): converte una stringa Base64 codificata in application/octet-stream@base64toBinary() - converts a base64 encoded string to application/octet-stream
  • @encodeDataUri() : codifica una stringa come matrice di byte dataUri@encodeDataUri() - encodes a string as a dataUri byte array
  • @decodeDataUri() : decodifica un dataUri in una matrice di byte@decodeDataUri() - decodes a dataUri into a byte array

Ad esempio, se si riceve una richiesta HTTP con Content-Type: application/xml:For example, if you received an HTTP request with Content-Type: application/xml:

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

Si potrebbe eseguire il cast e usarlo in un secondo tempo con un elemento simile a @xml(triggerBody()) o all'interno di una funzione come @xpath(xml(triggerBody()), '/CustomerName').You could cast and use later with something like @xml(triggerBody()), or in a function like @xpath(xml(triggerBody()), '/CustomerName').

Altri tipi di contenutoOther content types

Esistono altri tipi di contenuto che sono supportati e funzionano con le app per la logica, ma potrebbero richiedere il recupero manuale del corpo del messaggio con la decodifica di $content.Other content types are supported and work with logic apps, but might require manually retrieving the message body by decoding the $content. Ad esempio si supponga di attivare una richiesta application/x-www-url-formencoded dove $content rappresenta il payload codificato come stringa Base64 per mantenere tutti i dati:For example, suppose you trigger an application/x-www-url-formencoded request where $content is the payload encoded as a base64 string to preserve all data:

CustomerName=Frank&Address=123+Avenue

Poiché la richiesta non è in testo normale o JSON, la richiesta viene archiviata nell'azione come indicato di seguito:Because the request isn't plain text or JSON, the request is stored in the action as follows:

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

Poiché al momento non esiste una funzione nativa per dati del modulo, questi dati possono essere usati all'interno di un flusso di lavoro eseguendo manualmente l'accesso ai dati con una funzione come @string(body('formdataAction')). Se la richiesta in uscita deve avere anche l'intestazione content-type application/x-www-url-formencoded, è sufficiente aggiungere la richiesta al corpo dell'azione senza cast come @body('formdataAction'). Questo metodo tuttavia funziona solo se il corpo è l'unico parametro nell'input body. Se si tenta di usare @body('formdataAction') in una richiesta application/json, verrà visualizzato un errore di runtime perché viene inviato il corpo codificato.If you try to use @body('formdataAction') in an application/json request, you get a runtime error because the encoded body is sent.