Каталог решений - Формирование HTTP запроса формата multipart/form-data с двоичными данными, используя ПотокВПамяти

Формирование HTTP запроса формата multipart/form-data с двоичными данными, используя ПотокВПамяти

Формирование 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.

 

Благодарю за внимание.

has been added to your cart:
Оформление заказа