Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Передача файла и параметров методом POST

Передача файла и параметров методом POST
Я
   Кицум
 
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 - не может сервер распознать файл.
   Garykom
 
2 - 15.07.21 - 15:15
(0) наймите программиста
   Мультук
 
3 - 15.07.21 - 15:30
(0) Возьми готовую библиотеку
https://github.com/vbondarevsky/Connector
   Garykom
 
4 - 15.07.21 - 15:37
(3) в ней еще разобраться надо и допилить, там недоделок куча, например не все коды ответов
   BeerHelpsMeWin
 
5 - 15.07.21 - 15:42
(0) (1) запахло рекламой
   Kassern
 
6 - 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Ответ.ПолучитьТелоКакСтроку();
    Сообщить(ТекстОтвета);

Список тем форума
 
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.