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

 

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

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь 1С:Предприятие 8 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM / LOGICSTARS. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM / LOGICSTAR разных брендов в одной информационной базе в ручном и автоматическом режиме.

42700 руб.

03.08.2020    24351    37    24    

28

WEB-интеграция Программист Бизнес-аналитик 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

17568 руб.

20.12.2024    6319    28    4    

30

WEB-интеграция Программист 1С:Предприятие 8 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Расширение для автоматизации передачи данных между сервисом Vetmanager с 1С: Бухгалтерия 3.0. Решение позволяет загружать документы и справочники из Ветменеджер в 1С:Бухгалтерию, сокращая время на ручной ввод данных и минимизируя ошибки.

24000 руб.

02.02.2021    23060    69    52    

43

WEB-интеграция Загрузка и выгрузка в Excel Программист Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Розничная и сетевая торговля (FMCG) Россия Платные (руб)

Расширение освободит вас от необходимости вручную обновлять информацию о товарах в группах ВКонтакте. Достаточно задать правила один раз, и система автоматически формирует файлы yml для дальнейшей загрузки в группы в ВК. Вы сможете легко выбирать, какие товары публиковать, создавая гибкие критерии отбора. Например, можно добавить важные для покупателей параметры: цвет, размер или другие характеристики.

12200 руб.

29.08.2025    2800    7    8    

8

Обмен с ГосИС WEB-интеграция Бухгалтер Пользователь 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:Документооборот 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

5283 руб.

28.04.2016    101202    120    219    

368
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. papami 55 13.09.20 23:12 Сейчас в теме
Во всех случаях тело запроса собирается по крупицам(
2. malikov_pro 1355 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 1355 13.09.20 23:26 Сейчас в теме
(3) Чем отличается от добавления в параметры запроса в варианте Коннектора с последующей компоновкой тела запроса? Вижу только разницу синтаксиса и удобства использования. Напишите свою удобную обертку, разберем на сколько удобно ей использовать.
5. papami 55 13.09.20 23:30 Сейчас в теме
(4)Ну так об удобстве и речь. Про крупицы - это просто констатация факта. Без претензий. В рамках 1С пока лучше не сделать.
6. zeegin 214 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);
Показать
tulakin_s; vovchai; JesteR; JohnyDeath; slax; malikov_pro; +6 Ответить
7. malikov_pro 1355 14.09.20 13:57 Сейчас в теме
(6) по OSL: инструмент есть, а описания на русском к нему нет (сам английский через google.translate читаю).
Понял что используете EDT, нужен пример как использовать сборку без оного, многие его не ставят и не собираются.
Есть подобная наработка https://github.com/Shadawn/A1-Export, но с менее проработанным описанием, вариант скоординировать усилия.
8. zeegin 214 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 1355 14.09.20 14:25 Сейчас в теме
(8) 1. Нужно хотя бы общее описание библиотеки и куда проект двигается. Вижу "Stored files -> Amazon S3" что пересекается с моими интересами, в каком формате взаимодействовать непонятно.
2. При использовании EDT есть вариант собирать из набора библиотек нужный функционал на уровне расширений?
Пример, у меня google API который использует Коннектор и еще одно расширение которое использует его же.
Как обновлять версии библиотек и проверять работоспособность своего проекта после обновления (в общем)? Книгу по xUnit начинаю читать.
10. zeegin 214 14.09.20 14:33 Сейчас в теме
(9) К сожалению над реализацией работы с файлами и взаимодействием с S3 руки пока не дошли, пока не чего описывать.

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

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

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