REST API multipart/form-data или отправка файлов в nexus

28.02.20

Интеграция - Файловый обмен (TXT, XML, DBF), FTP

Понадобилось в nexus складывать файлы для автодеплоя. Для этого использовал onescript и rest api. Библиотека 1connector не отработала, примеры на зазеркалье и ИТС тоже. В этой статье расскажу как поборол проблему.

По REST API много документации и проблем при работе с ним не ожидалось.
Но при попытке отправить в нексус файл получал ошибки.
Пробовал компоненту "1connector",
статьи
https://its.1c.ru/db/metod8dev/content/5917/hdoc
https://wonderland.v8.1c.ru/blog/novye-instrumenty-dlya-raboty-s-dvoichnymi-dannymi-obespechivayut-kak-posledovatelnyy-dostup-k-danny/
и поисковики.

Вики дает неполное описание формата https://ru.wikipedia.org/wiki/Multipart/form-data.
Добирал описание на разных ресурсах.

Требования к формату "multipart/form-data"

1. определить нужные заголовки запроса
2. правильно описать тело запроса

Заголовки запроса

Сначала идет разделитель состоящий из букв и цифр.
Потом длина тела сообщения.

Пример:

ТипКонтента = СтрШаблон("multipart/form-data; boundary=%1", Разделитель); 
HTTPЗапрос.Заголовки.Вставить("Content-Type", ТипКонтента);
HTTPЗапрос.Заголовки.Вставить("Content-length", РазмерСодержимого);

Описание тела запроса

Сначала открывается сообщение "--Разделитель"
Потом описываются переменные и их значения
При необходимости добавить другие переменные указываем еще один разделитель и описываем их.
Для закрытия сообщения указываем "--Разделитель--"
Обращаем внимание: для закрытия сообщения после разделителя указывается "--".

Пример:

--Разделитель
Content-Disposition: form-data; name=""Имя переменной"""
Пустая строка
Значение переменной
--Разделитель
Content-Disposition: form-data; name=""Имя переменной"""
Пустая строка
Значение переменной
--Разделитель--
 

Как проверить

Для проверки корректного разделения можно посмотреть в фидлере как отработало разделение.

 

Образец кода

Работает как в OneScript версии 1.2 и выше так и в 1С 8.3.14
На вход подается адрес репозитория, полный путь к файлу.
Код не полный и предоставляется для ознакомления только отправка.

Процедура ОтправитьФайлВНексус(АдресРепозитория, ПолноеИмяФайла)
	
	Отладка = Истина;
	
	Если Отладка Тогда
		Сообщить("ПолноеИмяФайла " + ПолноеИмяФайла);
	КонецЕсли;
	
	СтруктураURI = СтруктураURI(АдресРепозитория);
	
	Логин = "---";
	Пароль = "---";
	
	Соединение = Новый HTTPСоединение(СтруктураURI.Хост, , Логин, Пароль, , 1200);
	
	ЗаголовокЗапросаHTTP = Новый Соответствие();
	ЗаголовокЗапросаHTTP.Вставить("User-Agent", "1C+Enterprise/8.3");
	
	ЗапросHTTP = Новый HTTPЗапрос(СтруктураURI.ПутьНаСервере, ЗаголовокЗапросаHTTP);
	ЗакодироватьФайлы(ЗапросHTTP, ПолноеИмяФайла);
	
	Ответ = Соединение.ВызватьHTTPМетод("POST", ЗапросHTTP);
	СообщениеОтвет = Ответ.ПолучитьТелоКакСтроку();
	
	ОписаниеОтвета = "" + Ответ.КодСостояния + " " + СообщениеОтвет;
	
	Если НЕ (Ответ.КодСостояния = 200 или Ответ.КодСостояния = 204) Тогда
		ВызватьИсключение ОписаниеОтвета;
	КонецЕсли;

КонецПроцедуры

Процедура ЗакодироватьФайлы(HTTPЗапрос, ПолноеИмяФайла)

	Разделитель = СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
	РазделительСтрок = Символы.ВК + Символы.ПС;
	
	Файл = Новый Файл(ПолноеИмяФайла);
	Если НЕ Файл.Существует() Тогда
		ВызватьИсключение "Не найден файл " + ПолноеИмяФайла + " для отправки в нексус";
	КонецЕсли;
	РазмерФайла = Файл.Размер();
	
	БуферДвоичныхДанных = Новый БуферДвоичныхДанных(РазмерФайла);
	
	ФайловыйПоток = Новый ФайловыйПоток(Файл.ПолноеИмя, РежимОткрытияФайла.Открыть);
	ФайловыйПоток.Прочитать(БуферДвоичныхДанных, 0, РазмерФайла);
	ФайловыйПоток.Закрыть();
	
	ПотокТело = Новый ПотокВПамяти();
	ЗаписьДанных = Новый ЗаписьДанных(ПотокТело);
	
	ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
	ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""raw.directory""");
	ЗаписьДанных.ЗаписатьСтроку("");
	ЗаписьДанных.ЗаписатьСтроку("oneclog");
	ЗаписьДанных.ЗаписатьСтроку("");
	
	ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
	ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""raw.asset1.filename""");
	ЗаписьДанных.ЗаписатьСтроку("");
	ЗаписьДанных.ЗаписатьСтроку(Файл.ИмяБезРасширения + Файл.Расширение);
	ЗаписьДанных.ЗаписатьСтроку("");
	
	ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
	ЗаписьДанных.ЗаписатьСтроку("Content-Type: application/x-executable");
	ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""raw.asset1""");
	ЗаписьДанных.ЗаписатьСтроку("");
	ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(БуферДвоичныхДанных);
	ЗаписьДанных.ЗаписатьСтроку("");
	
	ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + "--");
	
	РазмерСодержимого = XMLСтрока(ПотокТело.Размер());
	ЗаписьДанных.Закрыть();
	
	ДвоичныеДанныеТело = ПотокТело.ЗакрытьИПолучитьДвоичныеДанные();
	
	HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеТело);
	
	ТипКонтента = СтрШаблон("multipart/form-data; boundary=%1", Разделитель);
	
	HTTPЗапрос.Заголовки.Вставить("Content-Type", ТипКонтента);
	HTTPЗапрос.Заголовки.Вставить("Content-length", РазмерСодержимого);
	
КонецПроцедуры

 

См. также

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.88.x) и УТ 11.5 (11.5.21.x).

35000 руб.

23.07.2020    56967    265    75    

221

SALE! 15%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27660 руб.

12.06.2017    146394    861    300    

443

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой

55778 50200 руб.

15.04.2019    74739    202    156    

140

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.244.x) и БП 3.0 (3.0.172.x). Правила подходят для версии ПРОФ и КОРП.

35000 руб.

15.12.2021    26634    190    56    

145

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

53111 47800 руб.

03.12.2020    38705    108    70    

102

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 Платформа 1C v8.2 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием Россия Платные (руб)

Регулярный обмен, выгрузка, перенос из КА 1.1, УПП 1.3, УТ 10.3 для обмена с любыми конфигурациями, поддерживающими обмен в формате EnterpriseData (КД3) - БП 3.0, ERP, КА 2, УТ 11, Розница 2, УНФ 1.6 и другими. Правила для старых и доработанных конфигураций не требуют синхронного обновления и совместимы с новыми и будущими конфигурациями. Обмен по расписанию, через папку, FTP, почту.

16260 руб.

18.02.2016    189657    618    534    

537

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:ERP Управление предприятием 2.5 и 1С:Комплексную автоматизацию 2.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.244.x), ERP 2.5 (2.5.21.x), КА 2.5 (2.5.21.x).

35000 руб.

24.06.2020    65169    82    28    

95
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. bonv 1579 29.02.20 13:42 Сейчас в теме
(0)
Пробовал компоненту "1connector",

Можно увидеть пример вызова, который не сработал как надо?
И версию 1connector и 1Script?
2. pashamak 355 01.03.20 15:47 Сейчас в теме
(1)Примера уже нет. Была проблема с заданием имени переменной содержащей точку, например raw.directory.
Оставьте свое сообщение