Формирование 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 разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    15749    10    17    

11

Интеграция 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    17556    6    15    

13

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

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

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

12000 руб.

02.02.2021    16362    42    49    

23

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

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

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

8400 руб.

01.02.2019    25746    9    0    

7

Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС

Обмен с ГосИС 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    88587    160    215    

318
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. papami 55 13.09.20 23:12 Сейчас в теме
Во всех случаях тело запроса собирается по крупицам(
2. malikov_pro 1292 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 1292 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 1292 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 1292 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 1292 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 1292 30.09.21 11:23 Сейчас в теме
(14) Lобавить HTTP запрос не сложно, сам использую https://infostart.ru/public/709325/,
сложность была в компоновке тела, которую и описал в статье, статья как подспорье статьи по AliExpress
16. Attya 08.05.23 09:07 Сейчас в теме
Большое спасибо за статью! Очень полезно! Использовал в мобильном приложении для сканирования штрихкода, фотографирования и отправки всего это на Flask сервер
Оставьте свое сообщение