Формирование HTTP запроса формата multipart/form-data с двоичными данными, используя ПотокВПамяти
В статье опишу вариант формирования запроса
- Описание
- Подробнее
Описание
Вводные
- Нужно отправить файл на HTTP сервис, который принимает формат multipart/form-data
- Платформа 1С 8.3.9+
Описание формата
Каждое значение посылается как блок данных ("body part"), с заданными пользовательским клиентом разделителем ("boundary"), разделяющим каждую часть, документация на русском (ссылка)
При отправки текстовых данных форматирование относительно простое, при необходимости отправить двоичные данные (файл например) возникает проблема с компоновкой.
Варианты реализации
1. Через файл, описано в статье //sale.itcity.ru/public/20017/, решается через "ОбъединитьФайлы()", несколько громоздко и дополнительно нагружает файловую систему
2. Через поток, увидел решение в //sale.itcity.ru/1c/articles/993225/,
Функция ПолучаемДвоичныеДанныеДляПакетныхСообщенийHTTP(Разделитель, МассивДвоичныхДанных) Экспорт
ПотокТело = Новый ПотокВПамяти();
ЗаписьДанных = Новый ЗаписьДанных(ПотокТело);
Для Каждого Стр Из МассивДвоичныхДанных Цикл
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
ЗаписьДанных.Записать(Стр);
КонецЦикла;
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + "--");
ЗаписьДанных.Закрыть();
Возврат ПотокТело.ЗакрытьИПолучитьДвоичныеДанные();
КонецФункции
3. При разборе вопроса нашел более продвинутый вариант в публикации //sale.itcity.ru/public/709325/, из плюсов поддержка заголовков для каждого блока данных
Разделитель = СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
РазделительСтрок = Символы.ВК + Символы.ПС;
ТелоЗапроса = HTTPЗапрос.ПолучитьТелоКакПоток();
ЗаписьДанных = Новый ЗаписьДанных(ТелоЗапроса, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian, "", "", Ложь);
Для Каждого Часть Из Части Цикл
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + РазделительСтрок);
ЗаписьДанных.ЗаписатьСтроку(ЗаголовкиВСтроку(Часть.Заголовки));
Если ТипЗнч(Часть.Данные) = Тип("ДвоичныеДанные") Тогда
ЗаписьДанных.Записать(Часть.Данные);
Иначе
ЗаписьДанных.ЗаписатьСтроку(Часть.Данные);
КонецЕсли;
ЗаписьДанных.ЗаписатьСтроку(РазделительСтрок);
КонецЦикла;
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + "--" + РазделительСтрок);
ЗаписьДанных.Закрыть();
Итог
При работе с форматом multipart/form-data есть готовые функции, которые можно использовать как отдельно, так и в составе библиотеки работы с http.
Благодарю за внимание.