Имя: Пароль:
1C
1С v8
Передача файла и параметров методом POST
0 Кицум
 
15.07.21
15:06
Добрый день!
Есть стороннее API с нужным мне методом для загрузки PDF файла + некоторые параметры. Формирую запрос в POSTMANe - все хорошо: я просто перечисляю список необходимых параметров в body, один параметр делаю файлом и загружаю туда нужный файл.
Как подобное реализовать в 1С 8.3? Использовал конструкцию
    АдресСтраницы = "/api/explorer/file";
    Сервер= "new.хххх.kz";
    //

    
    имяФайлаДанных = "C:\qwe.pdf";
    
    имяФайлаОтправки = ПолучитьимяВременногоФайла("txt");
    
    Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
    
    ЗаписьТекста = Новый ЗаписьТекста(имяФайлаОтправки);
    

    // параметр "json"
    ЗаписьТекста.ЗаписатьСтроку("--"+boundary);
    ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""json""");
    ЗаписьТекста.ЗаписатьСтроку("");
    ЗаписьТекста.ЗаписатьСтроку("{}");
    
    // параметр "type"
    ЗаписьТекста.ЗаписатьСтроку("--"+boundary);
    ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""type""");
    ЗаписьТекста.ЗаписатьСтроку("");
    ЗаписьТекста.ЗаписатьСтроку("File1c");
    
    // параметр "parent_uuid"
    ЗаписьТекста.ЗаписатьСтроку("--"+boundary);
    ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""parent_uuid""");
    ЗаписьТекста.ЗаписатьСтроку("");
    ЗаписьТекста.ЗаписатьСтроку("93bd929f-6ec3-4888-bd6b-3964aff2e9a4");

    // параметр "file"
    ЗаписьТекста.ЗаписатьСтроку("--"+boundary);
    ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""file""; filename=""qwe.pdf""");
    ЗаписьТекста.ЗаписатьСтроку("Content-Type: application/pdf");
    ЗаписьТекста.ЗаписатьСтроку("");
    ЗаписьТекста.Записать(Новый ДвоичныеДанные(имяФайлаДанных));
    ЗаписьТекста.ЗаписатьСтроку("");
    
    // параметр "name"
    ЗаписьТекста.ЗаписатьСтроку("--"+boundary);
    ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""name""");
    ЗаписьТекста.ЗаписатьСтроку("");
    ЗаписьТекста.ЗаписатьСтроку("Test123");

    // закроем разделитель
    ЗаписьТекста.ЗаписатьСтроку("--"+boundary+"--");
    
    ЗаписьТекста.Закрыть();
    
    ФайлОтправки = Новый Файл(имяФайлаОтправки);
    РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());
    
    // заголовки
    Заголовки = Новый Соответствие();
    Заголовки.Вставить("Authorization", "Bearer "+ МойТокен);
    Заголовки.Вставить("Content-Type", "multipart/form-data, boundary="+boundary);
    Заголовки.Вставить("Accept", "application/json");
    Заголовки.Вставить("Content-Lenght", РазмерФайлаОтправки);
    Заголовки.Вставить("workspace-id", "52185");

    
    имяВыходногоФайла = ПолучитьИмяВременногоФайла("txt");
    
    ЗапросHTTP = Новый HTTPЗапрос(АдресСтраницы, Заголовки);
    ЗапросHTTP.УстановитьИмяФайлаТела(имяФайлаОтправки);
    
    Соединение = Новый HTTPСоединение(Хост,443,,,,,Новый ЗащищенноеСоединениеOpenSSL());

    Ответ = Соединение.ОтправитьДляОбработки(ЗапросHTTP);

Но в ответ получаю 422 - не может сервер распознать файл.
2 Garykom
 
гуру
15.07.21
15:15
(0) наймите программиста
3 Мультук
 
гуру
15.07.21
15:30
(0) Возьми готовую библиотеку
https://github.com/vbondarevsky/Connector
4 Garykom
 
гуру
15.07.21
15:37
(3) в ней еще разобраться надо и допилить, там недоделок куча, например не все коды ответов
5 BeerHelpsMeWin
 
15.07.21
15:42
(0) (1) запахло рекламой
6 Kassern
 
15.07.21
15:49
(5) так же показалось
7 Кицум
 
16.07.21
10:15
нашел решение Хелп! выгрузка файла POST запросом

работающий код в моем случае будет:

    ИмяФайлаОтправки = КаталогВременныхФайлов() + "post.txt";    
    ИмяФайлаДляЗагрузки = "C:\qwe.pdf";
    
    Сервер = "new.хххх.kz";
    Подключение = Новый Структура ("HTTP, ЗаголовокHTTP, Адрес" );    
    Подключение.Адрес = "/api/explorer/file";
    
    HTTP = Новый HTTPСоединение(Сервер,,,,,,Новый ЗащищенноеСоединениеOpenSSL);
    
    
    Boundary = Строка(Новый УникальныйИдентификатор());

    //Определяем массив для процедуры ОбъединитьФайлы

    МассивФайловДляОбъединения = Новый Массив;

    //Формируем начальный фрагмент файла POST-запроса

    ИмяФайлаОтправкиНачало = ПолучитьИмяВременногоФайла("txt");
    ФайлОтправкиНачало = Новый ЗаписьТекста(ИмяФайлаОтправкиНачало, КодировкаТекста.ANSI, Символы.ПС, Ложь);
    //Определяем раздел двоичных данных
    
    
    // параметр "json"
    ФайлОтправкиНачало.ЗаписатьСтроку("--"+boundary);
    ФайлОтправкиНачало.ЗаписатьСтроку("Content-Disposition: form-data; name=""json""");
    ФайлОтправкиНачало.ЗаписатьСтроку("");
    ФайлОтправкиНачало.ЗаписатьСтроку("{}");
    
    // параметр "type"
    ФайлОтправкиНачало.ЗаписатьСтроку("--"+boundary);
    ФайлОтправкиНачало.ЗаписатьСтроку("Content-Disposition: form-data; name=""type""");
    ФайлОтправкиНачало.ЗаписатьСтроку("");
    ФайлОтправкиНачало.ЗаписатьСтроку("File1c");
    
    // параметр "parent_uuid"
    ФайлОтправкиНачало.ЗаписатьСтроку("--"+boundary);
    ФайлОтправкиНачало.ЗаписатьСтроку("Content-Disposition: form-data; name=""parent_uuid""");
    ФайлОтправкиНачало.ЗаписатьСтроку("");
    ФайлОтправкиНачало.ЗаписатьСтроку("93bd929f-6ec3-4888-bd6b-3964aff2e9a4");
    
    // параметр "name"
    ФайлОтправкиНачало.ЗаписатьСтроку("--"+boundary);
    ФайлОтправкиНачало.ЗаписатьСтроку("Content-Disposition: form-data; name=""name""");
    ФайлОтправкиНачало.ЗаписатьСтроку("");
    ФайлОтправкиНачало.ЗаписатьСтроку("Test123");


    ФайлОтправкиНачало.ЗаписатьСтроку("--" + Boundary);
    //Указываем имя файла для передачи        

    ФайлОтправкиНачало.ЗаписатьСтроку("Content-Disposition: form-data; name=""file""; filename=""" + ИмяФайлаДляЗагрузки + """");
    //Указываем тип передаваемых данных.
    ФайлОтправкиНачало.ЗаписатьСтроку("Content-Type: application/x-octet-stream");
    ФайлОтправкиНачало.ЗаписатьСтроку("");
    ФайлОтправкиНачало.Закрыть();

    МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиНачало);

    //Копируем файл для загрузки во временный и добавляем в массив файлов для объединения

    ИмяФайлаДляЗагрузкиВременный = ПолучитьИмяВременногоФайла("tmp");
    КопироватьФайл(ИмяФайлаДляЗагрузки, ИмяФайлаДляЗагрузкиВременный);
    МассивФайловДляОбъединения.Добавить(ИмяФайлаДляЗагрузкиВременный);

    //Формируем конечный фрагмент файла POST-запроса

    ИмяФайлаОтправкиКонец = ПолучитьИмяВременногоФайла("txt");
    ФайлОтправкиКонец = Новый ЗаписьТекста(ИмяФайлаОтправкиКонец, КодировкаТекста.ANSI, Символы.ПС, Ложь);

    //Завершение раздела двоичных данных

    ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary);

    ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary + "--");
    ФайлОтправкиКонец.Закрыть();

    МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиКонец);

    //Теперь сформированные фрагменты сообщения для сервера объединяем в один файл POST-запроса

    ОбъединитьФайлы(МассивФайловДляОбъединения, ИмяФайлаОтправки);    
    Заголовки = Новый Соответствие();
    Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary);
    Заголовки.Вставить("Authorization", "Bearer "+ МойТокен);
    Заголовки.Вставить("Accept", "application/json");
    Заголовки.Вставить("workspace-id", "52185");
  
    HHTPЗапрос = Новый HTTPЗапрос(Подключение.Адрес, Заголовки);
    HHTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаОтправки);    

    HTTPОтвет = HTTP.ОтправитьДляОбработки(HHTPЗапрос);
    ТекстОтвета = HTTPОтвет.ПолучитьТелоКакСтроку();
    Сообщить(ТекстОтвета);
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.