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

11.09.20

Интеграция - WEB-интеграция

В статье опишу вариант формирования запроса

Вводные

  • Нужно отправить файл на HTTP сервис, который принимает формат multipart/form-data
  • Платформа 1С 8.3.9+

Описание формата

Каждое значение посылается как блок данных ("body part"), с заданными пользовательским клиентом разделителем ("boundary"), разделяющим каждую часть, документация на русском (ссылка)

При отправки текстовых данных форматирование относительно простое, при необходимости отправить двоичные данные (файл например) возникает проблема с компоновкой.

 

Варианты реализации

1. Через файл, описано в статье //infostart.ru/public/20017/, решается через "ОбъединитьФайлы()", несколько громоздко и дополнительно нагружает файловую систему

2. Через поток, увидел решение в //infostart.ru/1c/articles/993225/,

Функция ПолучаемДвоичныеДанныеДляПакетныхСообщенийHTTP(Разделитель, МассивДвоичныхДанных) Экспорт 
	
	ПотокТело = Новый ПотокВПамяти();
	ЗаписьДанных = Новый ЗаписьДанных(ПотокТело);
	
	Для Каждого Стр Из МассивДвоичныхДанных Цикл 
		ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
		ЗаписьДанных.Записать(Стр);
	КонецЦикла;	
	
	ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
	ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + "--");

	ЗаписьДанных.Закрыть();
	
	Возврат ПотокТело.ЗакрытьИПолучитьДвоичныеДанные();
	
КонецФункции

 

3. При разборе вопроса нашел более продвинутый вариант в публикации //infostart.ru/public/709325/, из плюсов поддержка заголовков для каждого блока данных

Разделитель = СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
РазделительСтрок = Символы.ВК + Символы.ПС;

ТелоЗапроса = HTTPЗапрос.ПолучитьТелоКакПоток();
ЗаписьДанных = Новый ЗаписьДанных(ТелоЗапроса, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian, "", "", Ложь);
Для Каждого Часть Из Части Цикл
	ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + РазделительСтрок);
	ЗаписьДанных.ЗаписатьСтроку(ЗаголовкиВСтроку(Часть.Заголовки));
	Если ТипЗнч(Часть.Данные) = Тип("ДвоичныеДанные") Тогда
		ЗаписьДанных.Записать(Часть.Данные);
	Иначе
		ЗаписьДанных.ЗаписатьСтроку(Часть.Данные);
	КонецЕсли;
	ЗаписьДанных.ЗаписатьСтроку(РазделительСтрок);
КонецЦикла;
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + "--" + РазделительСтрок);
ЗаписьДанных.Закрыть();

 

Итог

При работе с форматом multipart/form-data есть готовые функции, которые можно использовать как отдельно, так и в составе библиотеки работы с http.

 

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

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме. Без существенных изменений типовой конфигурации. Проверено с брендами: Интеграция 1С и GEELY Интеграция 1С и HAVAL Интеграция 1С и KIA Интеграция 1С и FORD Интеграция 1С и LADA ГАРАНТИЯ 100% ВНЕДРЕНИЯ!

36000 руб.

03.08.2020    15655    9    17    

9

Модуль для обмена "1С:Предприятие 8. УАТ. ПРОФ" с FortMonitor

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    12809    30    8    

10

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17419    6    15    

13

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25686    9    0    

7

Интеграция с сервисом vetmanager

WEB-интеграция Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16253    41    49    

22
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. papami 55 13.09.20 23:12 Сейчас в теме
Во всех случаях тело запроса собирается по крупицам(
2. malikov_pro 1288 13.09.20 23:16 Сейчас в теме
(1) Есть более интересный вариант?
3. papami 55 13.09.20 23:18 Сейчас в теме
(2) MultipartContent mc = new MultipartContent("form-data", "--myboundary");
4. malikov_pro 1288 13.09.20 23:26 Сейчас в теме
(3) Чем отличается от добавления в параметры запроса в варианте Коннектора с последующей компоновкой тела запроса? Вижу только разницу синтаксиса и удобства использования. Напишите свою удобную обертку, разберем на сколько удобно ей использовать.
5. papami 55 13.09.20 23:30 Сейчас в теме
(4)Ну так об удобстве и речь. Про крупицы - это просто констатация факта. Без претензий. В рамках 1С пока лучше не сделать.
6. zeegin 114 14.09.20 13:23 Сейчас в теме
Используя коннектор (https://github.com/vbondarevsky/Connector)

Файлы = Новый Массив;
Файлы.Добавить(Новый Структура("Имя,Данные,ИмяФайла", "f1", Base64Значение("ZmlsZTE="), "file1.txt"));
Файлы.Добавить(Новый Структура("Имя,Данные,ИмяФайла", "f2", Base64Значение("ZmlsZTI="), "file2.txt"));

Данные = Новый Структура("field1,field2", "value1", "Значение2");

Результат = КоннекторHTTP.Post("https://httpbin.org/post", Неопределено, Новый Структура("Файлы,Данные", Файлы, Данные));
Показать



Используя OSL (https://github.com/zeegin/OpenSubsystemsLibrary)

    Data = New Structure;
    Data.Ins ert("field1", "value1");
    Data.Ins ert("field2", "value2");
    
    File1 = HTTPRequests.TransferedFile();
    File1.Field = "file1";
    File1.FileName = "file1.txt";
    File1.Data = Base64Val ue("ZmlsZTE=");
    File1.ContentType = "text/plain";
    
    File2 = HTTPRequests.TransferedFile();
    File2.Field = "file2";
    File2.FileName = "file2.txt";
    File2.Data = Base64Val ue("ZmlsZTI=");
    File2.ContentType = "text/plain";
    
    Files = New Array;
    Files.Add(File1);
    Files.Add(File2);
    
    Result = HTTPRequests.Post("https://httpbin.org/post", Data, Files);
Показать
Krio2; vovchai; JesteR; JohnyDeath; slax; malikov_pro; +6 Ответить
7. malikov_pro 1288 14.09.20 13:57 Сейчас в теме
(6) по OSL: инструмент есть, а описания на русском к нему нет (сам английский через google.translate читаю).
Понял что используете EDT, нужен пример как использовать сборку без оного, многие его не ставят и не собираются.
Есть подобная наработка https://github.com/Shadawn/A1-Export, но с менее проработанным описанием, вариант скоординировать усилия.
8. zeegin 114 14.09.20 14:03 Сейчас в теме
(7)
1. Описание на русском может быть когда-нибудь, хотя в целом этим не очень интересно заниматься.
2. Использовать без EDT - тоже не интересно, те, кто не хочет использовать EDT - им и плюшки не очень нужны, не вижу смысла ради них стараться что-то делать.
3. Описание о том как начать использовать в несколько шагов есть тут https://github.com/zeegin/OpenSubsystemsLibrary/blob/master/docs/en/Quickst­artGuide.md

Для русского варианта и без едт лучше использовать Коннектор, он прекрасно подходит для этой целевой аудитории да и по функционалу он шире.
9. malikov_pro 1288 14.09.20 14:25 Сейчас в теме
(8) 1. Нужно хотя бы общее описание библиотеки и куда проект двигается. Вижу "Stored files -> Amazon S3" что пересекается с моими интересами, в каком формате взаимодействовать непонятно.
2. При использовании EDT есть вариант собирать из набора библиотек нужный функционал на уровне расширений?
Пример, у меня google API который использует Коннектор и еще одно расширение которое использует его же.
Как обновлять версии библиотек и проверять работоспособность своего проекта после обновления (в общем)? Книгу по xUnit начинаю читать.
10. zeegin 114 14.09.20 14:33 Сейчас в теме
(9) К сожалению над реализацией работы с файлами и взаимодействием с S3 руки пока не дошли, пока не чего описывать.

Этот проект это библиотека первого уровня, ее не предполагается использовать в расширении никак кроме как заимствования фрагментов кода.

В целом про библиотечные разработку есть стандарты 1С можно просто следовать им https://its.1c.ru/db/v8std#content:551:hdoc

Я не люблю и не использую xUnit, я использую расширение для EDT 1Unit которое позволяет писать тесты в расширении и запускать и просматривать результаты и замерна покрытия прямо в EDT.
11. malikov_pro 1288 14.09.20 15:43 Сейчас в теме
(10) "пока не чего описывать." - вопрос был про общее описание и направление библиотеки.
"заимствования фрагментов кода" - нужна методология для работы с версиями библиотеки. Немного сталкиваюсь с БСП, в ней описаны последовательности перехода, на сколько эффективные пока не знаю.
За ссылку спасибо, буду изучать и думать как организовывать процесс.
12. Zelenhof 43 28.07.21 14:20 Сейчас в теме
Добрый день.
Как передать в тело POST вот такой вариант параметров? Пробовал уже по разному.
Прикрепленные файлы:
14. Hans 2 30.09.21 09:42 Сейчас в теме
что за полонвинчатое решение ты сделал? Ты в заголовке обещал показать показать как сделать запрос, а показал как сделать тело.
15. malikov_pro 1288 30.09.21 11:23 Сейчас в теме
(14) Lобавить HTTP запрос не сложно, сам использую https://infostart.ru/public/709325/,
сложность была в компоновке тела, которую и описал в статье, статья как подспорье статьи по AliExpress
16. Attya 08.05.23 09:07 Сейчас в теме
Большое спасибо за статью! Очень полезно! Использовал в мобильном приложении для сканирования штрихкода, фотографирования и отправки всего это на Flask сервер
Оставьте свое сообщение