- Вопрос или проблема
- Обзор функции:
- Что работает:
- Проблемы:
- Вопросы:
- Что я пробовал:
- Код для чтения параметров из запроса:
- Ответ или решение
- 1. Тестирование Azure Function через Code + Test
- 2. Вызов Azure Function из Logic App
- Шаги по созданию HTTP-запроса в Logic App
- 3. Пример кода для считывания параметров в функции
- Заключение
Вопрос или проблема
У меня есть 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 файл, как и ожидалось.
Проблемы:
-
Экран Azure Code + Test:
- Когда я тестирую функцию здесь, я не могу правильно передать CSV-файлы и строку даты. В логах функции я вижу пустые значения для входных данных, хотя функция выполняется без ошибок.
- Я не уверен, как правильно структурировать входные данные с помощью интерфейса Code + Test, который использует поля ввода запросов. Если я передаю данные в формате json в секции тела, возникает исключение при попытке их прочитать из результата. Если я передаю данные в полях запроса в виде пар “ключ-значение”, все три значения читаются как null без возникновения исключения.
-
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
-
Создание HTTP-экшена:
- Добавьте новый шаг в вашей Logic App и выберите действие
HTTP
.
- Добавьте новый шаг в вашей Logic App и выберите действие
-
Настройка 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}");
Заключение
- Тестирование через Code + Test: невозможно корректно протестировать функцию с файлами из этого интерфейса. Лучше используйте Postman.
- Вызов из Logic App: правильно настройте формирование тела запроса в формате
multipart/form-data
, как описано выше. - Логирование: продолжайте использовать логирование для поиска возможных проблем в передаче данных.
Если у вас остались вопросы или потребуется дополнительная помощь, не стесняйтесь задавать их!