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

 

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

См. также

WEB-интеграция Администрирование веб-серверов Платные (руб)

Веб-портал обеспечивает удобный доступ к конфигурации 1С:ITIL(ИТИЛ), 1С:ITILIUM, Управление IT-отделом 8 через интернет с любого устройства посредством браузера, увеличивая эффективность работы пользователей и снижая нагрузку на сервер. Быстрая инсталляция портала за пару часов, удобный и интуитивно понятный интерфейс и безопасность данных помогут упростить работу с порталом и ускорить выполнение бизнес-процессов компании.

128000 руб.

19.12.2023    2905    3    0    

11

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

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

60000 руб.

07.05.2019    34976    69    45    

27

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

Онлайн-заказ - это решение для автоматизации процесса оформления заказов на сайте в торговых организациях. Продукт обеспечивает легкое взаимодействие между компанией и клиентами через веб-интерфейс, интегрированный с 1С:Предприятие. Система позволяет снизить операционные расходы, повысить лояльность клиентов и оптимизировать работу отдела продаж.

57600 руб.

26.11.2024    2651    2    3    

5

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

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

14400 руб.

20.12.2024    1006    6    2    

8

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

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    4524    4    2    

5

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

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

36000 руб.

03.08.2020    19231    23    22    

20

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

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

12000 руб.

02.02.2021    18996    54    50    

31

Обмен с ГосИС WEB-интеграция Бухгалтер Пользователь Платформа 1С v8.3 Управляемые формы 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

2400 руб.

28.04.2016    93376    194    217    

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

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

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

Я не люблю и не использую xUnit, я использую расширение для EDT 1Unit которое позволяет писать тесты в расширении и запускать и просматривать результаты и замерна покрытия прямо в EDT.
11. malikov_pro 1331 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 1331 30.09.21 11:23 Сейчас в теме
(14) Lобавить HTTP запрос не сложно, сам использую https://infostart.ru/public/709325/,
сложность была в компоновке тела, которую и описал в статье, статья как подспорье статьи по AliExpress
16. Attya 08.05.23 09:07 Сейчас в теме
Большое спасибо за статью! Очень полезно! Использовал в мобильном приложении для сканирования штрихкода, фотографирования и отправки всего это на Flask сервер
Оставьте свое сообщение