Обработка типов содержимого в Azure Logic Apps

Область применения: Azure Logic Apps (Потребление + Стандартный)

Различные типы содержимого могут проходить через приложение логики, например JSON, XML, неструктурированные файлы и двоичные данные. Служба Logic Apps поддерживает все типы содержимого, некоторые приложения имеют встроенную поддержку и не требуют приведения или преобразования. Другие могут потребовать преобразования или приведения, по необходимости. В этой статье описывается, как служба Logic Apps обрабатывает типы содержимого и как правильно при необходимости приводить или преобразовывать эти типы.

Чтобы определить подходящий метод для обработки типов содержимого, служба Logic Apps полагается на заголовок значения Content-Type в вызовах HTTP.

приложение/json

Служба Logic Apps хранит и обрабатывает любой запрос с типом содержимого application/json как объект JavaScript Notation (JSON). По умолчанию можно проанализировать содержимое JSON без приведения. Чтобы проанализировать запрос, который имеет заголовок с типом содержимого "application/json", можно использовать выражение. Этот пример возвращает значение dog из массива animal-type без приведения.

@body('myAction')['animal-type'][0]

{
  "client": {
     "name": "Fido",
     "animal-type": [ "dog", "cat", "rabbit", "snake" ]
  }
}

Если вы работаете с данными JSON, в которых не указан заголовок, их можно приводить вручную с помощью функции json().

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

Создание токенов для свойств JSON

Служба Logic Apps предоставляет возможность создания удобных пользовательских токенов, представляющих свойства в содержимом JSON, чтобы иметь возможность ссылаться и упрощать использование этих свойств в рабочем процессе приложений логики.

  • Триггер запросов

    При использовании этого триггера в конструкторе приложений логики можно предоставить схему JSON, которая описывает полезные данные, которые рассчитывается получить. С помощью этой схемы конструктор выполняет синтаксический анализ содержимого JSON и создает удобные пользовательские токены, представляющие свойства в содержимом JSON. Можно легко ссылаться на эти свойства и использовать их во время рабочего процесса приложения логики.

    Если нет схемы, ее можно создать.

    1. В триггере запросов выберите Использовать пример полезной нагрузки, чтобы создать схему.

    2. В разделе Введение или вставка примера полезных данных 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"
                           }
                        }
                     }
                  }
               }
            }
         }
      }
      
    3. В HTTP-запросе, который клиентское приложение отправляет в Azure Logic Apps, убедитесь, что вы включили заголовок с именем Content-Type и задайте для него значение application/json.

  • Действие "Анализ JSON"

    При использовании этого действия в конструкторе приложений логики вы можете проанализировать выходные данные JSON и создать удобные пользовательские токены, представляющие свойства в содержимом JSON. Можно легко ссылаться на эти свойства и использовать их во время рабочего процесса приложения логики. Подобно триггеру запроса можно предоставить или создать схему, описывающую содержимое JSON, которое необходимо проанализировать. Таким образом можно легко использовать данные из Служебной шины Azure, Azure Cosmos DB и другого.

    Parse JSON

text/plain

Когда приложение логики получает сообщения HTTP, имеющие заголовок Content-Type со значением text/plain, оно хранит эти сообщения в необработанном виде. Если включить эти сообщения в последующие действия без какого-либо приведения, запросы будут переданы с заголовком Content-Type со значением text/plain.

Например, при работе с неструктурированным файлом, может появиться запрос HTTP с заголовком Content-Type со значением типа содержимого text/plain.

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

Если отправить этот запрос в позднем действии как тело другого запроса, например @body('flatfile'), этот второй запрос также имеет заголовок Content-Type со значением text/plain. Если вы работаете с данными, которые являются простым текстом, но не указали заголовок, можно вручную перевести эти данные в текст с помощью функции string(), такой как в следующем выражении.

@string(triggerBody())

application/xml and application/octet-stream

Служба Logic Apps всегда сохраняет Content-Type в полученных запросе или ответе HTTP. Поэтому приложение логики получает содержимое с Content-Type установленным как application/octet-stream и вы добавляете это содержимое в следующее действие без приведения. Исходящий запрос будет иметь заголовок Content-Type со значением application/octet-stream. Таким образом служба Logic Apps может гарантировать, что данные не потеряются при прохождении через рабочий процесс. При этом состояние действия или входов и выходов хранится в объекте JSON, в то время как состояние проходит через рабочий процесс.

Функции преобразователя

Для сохранения некоторых типов данных служба Logic Apps преобразует содержимое в двоичную строку в кодировке base64 с соответствующими метаданными, сохраняя полезные данные $content и $content-type, преобразование которых выполняется автоматически.

Ниже приводится список преобразований службой Logic Apps содержимого при использовании этих функций.

  • 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(triggerBody()), '/CustomerName') с функциями xpath() и xml().

Другие типы содержимого

Служба Logic Apps работает и поддерживает другие типы содержимого, но может потребоваться получить тело сообщения вручную, расшифровав переменную $content.

Например, приложение логики получает инициируемый запрос с типом содержимого application/x-www-url-formencoded. Для сохранения всех данных переменная $content в теле запроса имеет полезные данные, которые кодируются в виде строки base64.

CustomerName=Frank&Address=123+Avenue

Так как запрос не имеет формат простого текста или JSON, он сохраняется в действии в следующем виде:

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

Служба Logic Apps предоставляет собственные функции для обработки данных формы. Например следующие.

Или можно вручную сделать доступ к данным с помощью выражения следующего вида.

@string(body('formdataAction'))

Если исходящему запросу необходимо иметь такой же тип заголовка содержимого application/x-www-url-formencoded, можно добавить запрос в тело действия используя выражение, как @body('formdataAction'). Однако этот метод работает, только если body является единственным параметром в body входа. Если попытаться использовать выражение @body('formdataAction') в запросе application/json, вы получите ошибку выполнения, так как тело будет отправлено в закодированном виде.