Как передать два файла CSV и строку в функцию Azure из Logic App и кода Azure + экран тестирования?

Вопрос или проблема

У меня есть Azure Function App, которая принимает два CSV-файла и строку даты в качестве входных данных (через multipart/form-data) и возвращает объединённый Excel файл.

  • Функция работает корректно, когда её тестируют локально или когда она вызывается удалённо через Postman (с использованием типа содержимого multipart/form-data).
  • Однако у меня возникают проблемы при попытке протестировать её из портала Azure с использованием экрана Code + Test, а также при вызове функции из HTTP-триггера в Logic App.

Обзор функции:

  • HTTP-триггер (POST)
  • Принимает 2 CSV-файла и строку даты (всё через multipart/form-data).

Что работает:

  • Тестирование функции локально или удалённо после развертывания в Azure с использованием Postman проходит успешно. Я передаю два CSV-файла, закодированных в base64, и строку даты, используя multipart/form-data, и функция обрабатывает и возвращает Excel файл, как и ожидалось.

Проблемы:

  1. Экран Azure Code + Test:

    • Когда я тестирую функцию здесь, я не могу правильно передать CSV-файлы и строку даты. В логах функции я вижу пустые значения для входных данных, хотя функция выполняется без ошибок.
    • Я не уверен, как правильно структурировать входные данные с помощью интерфейса Code + Test, который использует поля ввода запросов. Если я передаю данные в формате json в секции тела, возникает исключение при попытке их прочитать из результата. Если я передаю данные в полях запроса в виде пар “ключ-значение”, все три значения читаются как null без возникновения исключения.
  2. HTTP-триггер Logic App:

    • Когда я вызываю функцию из своего Logic App, я использую HTTP-действие после действия Create CSV Table для передачи CSV-файлов и строки даты, но функция не получает данные корректно. Содержимое CSV и строка даты не обрабатываются ожидаемым образом функцией.

Вопросы:

  • Как я могу правильно протестировать Azure Function, используя экран Code + Test в портале, передавая два CSV-файла и строку даты?
  • Как правильно структурировать HTTP-действие в Logic App, чтобы отправить два CSV-файла и строку даты в мою Azure Function App с использованием multipart/form-data?

Что я пробовал:

  • Я установил Content-Type на multipart/form-data в HTTP-действии Logic App и использовал @{body('Create_CSV_Table')} для передачи содержимого CSV, но не уверен, правильно ли я конструирую многочастичное тело.
  • Я также использовал логирование (_logger.LogInformation) внутри функции, чтобы проверить, что приходит, но поля для CSV-файлов и строки даты пустые при использовании Code + Test или Logic App, в то время как они показывают правильные значения при тестировании через Postman.

Буду весьма признателен за любые рекомендации по структуре запроса как от Logic App, так и от экрана Code + Test!

Код для чтения параметров из запроса:

Вот код, который я использую для чтения параметров из HTTP-запроса в Azure Function:

var form = await req.ReadFormAsync();
var file1Base64 = form["file1"];
var file2Base64 = form["file2"];
var stringDate = form["stringDate"];

Ответ или решение

Чтобы успешно передать два CSV-файла и строку даты в Azure Function из интерфейса Code + Test и из Logic App, вам следует обратить внимание на несколько важных аспектов структуры данных и формата запроса.

1. Тестирование Azure Function через Code + Test

При использовании интерфейса Code + Test в Azure Portal для отправки тестового запроса, вам необходимо учесть, что этот интерфейс ограничен и не поддерживает отправку данных в формате multipart/form-data. Вместо этого вам нужно будет использовать формат JSON или передавать параметры как часть URL.

К сожалению, для вашего случая (отправка файлов) этот метод не будет работать, так как ваш Azure Function ожидает данные в формате multipart/form-data. Таким образом, вы не сможете протестировать функцию с файлами через Code + Test.

2. Вызов Azure Function из Logic App

Чтобы отправить два CSV-файла и строку даты из Logic App, вам необходимо правильно сформировать HTTP-запрос с использованием формата multipart/form-data. Вот пошаговая инструкция по настройке:

Шаги по созданию HTTP-запроса в Logic App

  1. Создание HTTP-экшена:

    • Добавьте новый шаг в вашей Logic App и выберите действие HTTP.
  2. Настройка HTTP-запроса:
    Определите следующее в поле конфигурации HTTP:

    • Метод: POST
    • URI: Укажите URL вашей Azure Function.
    • Заголовки:
      • Content-Type: multipart/form-data
    • Тело: Для формирования тела запроса вам нужно использовать контент файлов и строки.

    Пример формата тела может выглядеть следующим образом, если вы используете динамические поля для передачи CSV:

    --boundary
    Content-Disposition: form-data; name="file1"; filename="file1.csv"
    Content-Type: text/csv
    
    @{body('Create_CSV_Table1')}
    --boundary
    Content-Disposition: form-data; name="file2"; filename="file2.csv"
    Content-Type: text/csv
    
    @{body('Create_CSV_Table2')}
    --boundary
    Content-Disposition: form-data; name="stringDate"
    
    @{variables('YourDateVariable')}
    --boundary--

    Не забудьте заменить 'Create_CSV_Table1' и 'Create_CSV_Table2' на ваши реальные идентификаторы действий, где создаются CSV-файлы.

3. Пример кода для считывания параметров в функции

Ваш код для получения параметров выглядит правильно. Убедитесь, что вы используете правильные ключи:

var form = await req.ReadFormAsync();
var file1Base64 = form["file1"];
var file2Base64 = form["file2"];
var stringDate = form["stringDate"];

// Для отладки вы можете добавить логирование
_logger.LogInformation($"File1: {file1Base64}, File2: {file2Base64}, StringDate: {stringDate}");

Заключение

  1. Тестирование через Code + Test: невозможно корректно протестировать функцию с файлами из этого интерфейса. Лучше используйте Postman.
  2. Вызов из Logic App: правильно настройте формирование тела запроса в формате multipart/form-data, как описано выше.
  3. Логирование: продолжайте использовать логирование для поиска возможных проблем в передаче данных.

Если у вас остались вопросы или потребуется дополнительная помощь, не стесняйтесь задавать их!

Оцените материал
Добавить комментарий

Капча загружается...