Передача файла через POST-запрос

1. Ivan_Stepnov 06.02.24 18:48 Сейчас в теме
Коллеги, доброго времени суток!

Возникла проблема отправки POST-запроса с присоединенным звуковым файлом из 1С.

На другой стороне запрос принимает обработчик, реализованный в виде HTTP-сервиса,
который должен этот файл принять и записать на диск своего сервера.
Когда отправляю запрос без вложения, запрос отрабатывает без ошибок -
функция Ответ.ПолучитьТелоКакСтроку() возвращает тестовую строку.

Для отправки запроса с вложением файла пробовал разные способы:

Вариант 1:
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json");
		
СтрокаПодключения = "http://хх.ххх.ххх.х:ххххх/api/<ПутьНаСервере>";
	
ИмяФайла = "Полное_Имя_Файла.WAV";

ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("audio", "@" + ИмяФайла);
	
ЗаписьJSON = Новый ЗаписьJSON();
	
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);				
ЗаписатьJSON(ЗаписьJSON, ПараметрыЗапроса);
СтрЗапрос = ЗаписьJSON.Закрыть();         

//Пробовал с этим оператором, и без него	
СтрЗапрос = СтрЗаменить(СтрЗапрос, "\\", "\");
	
HTTPЗапрос = Новый HTTPЗапрос("/");
HTTPЗапрос.Заголовки = Заголовки;
	
HTTPСоединение = Новый HTTPСоединение("хх.ххх.ххх.х", "ххххх");
	
HTTPЗапрос.АдресРесурса = "/" + СтруктураURI.<ПутьНаСервере>;

HTTPЗапрос.УстановитьТелоИзСтроки(СтрЗапрос);
		
Попытка
	HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);		
	ТелоОтвета = HTTPОтвет.ПолучитьТелоКакСтроку();
	КодСостояния = Ответ.КодСостояния;
Исключение
	ООШ = ОписаниеОшибки();
КонецПопытки;
Показать


В результате получилось: КодСостояния = 200,
но в строке ТелоОтвета вернулась строка "No file part in the request"


Вариант 2 - передавал в теле запроса не путь к файлу, а двоичные данные:

Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json");
		
СтрокаПодключения = "http://хх.ххх.ххх.х:ххххх/api/<ПутьНаСервере>";
	
ИмяФайла = "Полное_Имя_Файла.WAV";

ДвДанные = Новый ДвоичныеДанные(ИмяФайла);

HTTPЗапрос = Новый HTTPЗапрос("/");
HTTPЗапрос.Заголовки = Заголовки;
	
HTTPСоединение = Новый HTTPСоединение("хх.ххх.ххх.х", "ххххх");
	
HTTPЗапрос.АдресРесурса = "/" + СтруктураURI.<ПутьНаСервере>;
HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ДвДанные);
		
Попытка
	HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);		
	ТелоОтвета = HTTPОтвет.ПолучитьТелоКакСтроку();
	КодСостояния = Ответ.КодСостояния;
Исключение
	ООШ = ОписаниеОшибки();
КонецПопытки;
Показать


В результате то же самое: КодСостояния = 200,
в строке ТелоОтвета - "No file part in the request"


Вариант 3 - передавал двоичные данные, преобразованные в строку:

Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json");
		
СтрокаПодключения = "http://хх.ххх.ххх.х:ххххх/api/<ПутьНаСервере>";
	
ИмяФайла = "Полное_Имя_Файла.WAV";

ДвДанные = Новый ДвоичныеДанные(ИмяФайла);
ДвДанныеСтрока = Base64Строка(РезДД);

ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("audio", ДвДанныеСтрока);
	
ЗаписьJSON = Новый ЗаписьJSON();
	
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);				
ЗаписатьJSON(ЗаписьJSON, ПараметрыЗапроса);
СтрЗапрос = ЗаписьJSON.Закрыть();         
	
HTTPЗапрос = Новый HTTPЗапрос("/");
HTTPЗапрос.Заголовки = Заголовки;
	
HTTPСоединение = Новый HTTPСоединение("хх.ххх.ххх.х", "ххххх");
	
HTTPЗапрос.АдресРесурса = "/" + СтруктураURI.<ПутьНаСервере>;

HTTPЗапрос.УстановитьТелоИзСтроки(СтрЗапрос);
		
Попытка
	HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);		
	ТелоОтвета = HTTPОтвет.ПолучитьТелоКакСтроку();
	КодСостояния = Ответ.КодСостояния;
Исключение
	ООШ = ОписаниеОшибки();
КонецПопытки;
Показать

Снова то же самое: КодСостояния = 200,
в строке ТелоОтвета - "No file part in the request"

Подскажите, пожалуйста, в чем может быть проблема, что я делаю неправильно?
По теме из базы знаний
Найденные решения
2. Sashares 35 06.02.24 22:22 Сейчас в теме
(1)В 1 варианте - передавать в сервис путь к файлу, который лежит у вас на компе - это прям сильно.

Примеров передачи файлов полно. Даже под вашей темой ссылка.
Прикрепленные файлы:
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Sashares 35 06.02.24 22:22 Сейчас в теме
(1)В 1 варианте - передавать в сервис путь к файлу, который лежит у вас на компе - это прям сильно.

Примеров передачи файлов полно. Даже под вашей темой ссылка.
Прикрепленные файлы:
3. Ivan_Stepnov 12.02.24 10:13 Сейчас в теме
(2) Sashares, спасибо, помогла отмеченная Вами ссылка.
Поместил в передаваемый в POST-запросе файл не только тело звукового файла, но и требуемые параметры запроса. Это и оказалось решением. А раньше я параметры передавал в тексте запроса.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот