Имя: Пароль:
1C
1С v8
Как грамотно отправить pdf-файл через http-запрос?
0 Обработка
 
27.09.22
06:57
В компании есть некая система куда с 1С ЗУП заливаю пдф документы который хранится в РС в
реквизите типа ХранилищеЗначения.
При отправке система возвращает адрес путь к базе примерно такой https://ххх.kz/ннн/580c85abb
Если прогнать через Posman то нормально открывается файл из https://ххх.kz/ннн/580c85abb
А с 1С оправленный не открывается хотя система ее записывает у себя и ответ успешно - 200.
Вот ниже код:
СтрокаНабора = НаборЗаписей[0];
ИмяВременногоФайла = КаталогВременныхФайлов() + ТипДокумента;
ДвоичныйФайл = СтрокаНабора.Файл.Получить();
Если ДвоичныйФайл <> Неопределено Тогда
    ДвоичныйФайл.Записать(ИмяВременногоФайла+".pdf");
Иначе
    Сообщить("Файл для отправки не прикреплен!");
    Возврат
КонецЕсли;    
АдресСтраницы = "/ХХХХХХХ/pdf";
Хост = "YYYY.YYY.kz";
МойТокен = "******************";
Строка64 = Base64Строка(ДвоичныйФайл);
// передадим данные на сервер
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Length", XMLСтрока(ДвоичныйФайл.Размер()));
//Заголовки.Вставить("Content-Type", "application/pdf");
Заголовки.Вставить("Content-Type", "text/plain");
Заголовки.Вставить("Authorization", "Bearer "+ МойТокен);
//Заголовки.Вставить("User-Agent", "PostmanRuntime/7.29.2");
Заголовки.Вставить("Accept-Encoding", "*/*");
Заголовки.Вставить("Accept", "gzip, deflate, br");
Заголовки.Вставить("Connection", "keep-alive");
ЗапросHTTP = Новый HTTPЗапрос(АдресСтраницы,Заголовки );
//ЗапросHTTP.УстановитьТелоИзДвоичныхДанных(ДанныеТела); // установили тело
ЗапросHTTP.УстановитьТелоИзСтроки(Строка64); // установили тело
// передадим данные на сервер
Соединение = Новый HTTPСоединение(Хост,443,,,,,Новый ЗащищенноеСоединениеOpenSSL);
ОтветHTTP = Соединение.ОтправитьДляОбработки(ЗапросHTTP); // финал
//ОтветHTTP = Соединение.ВызватьHTTPМетод("POST",ЗапросHTTP);
Сообщить(ОтветHTTP.ПолучитьТелоКакСтроку());
        
ЧЯНТД?
1 Обработка
 
27.09.22
07:01
Ранее через поток организовал отправку файла просто двоичного файла.
Было все успешно. А вот base64  получается не корректно.

Кто ранее решал такое?
В чем моя ошибка?
2 icipher
 
27.09.22
07:25
base64 вставляет переводы строки в итоговую строку. может в этом дело.
3 Обработка
 
27.09.22
07:42
Вот грамотно ответили мне так:
А еще подучи http протокол :)
Ты передаешь хэадер gzip это значит что ты говоришь серверу что чувак, я ща все заархивирую и отправлю. А отправляешь не сжимая как есть.
Данные тела у тебя не устанавливаются в комментарии
зачем то ты временный файл создаешь когда у тебя уже двоичные данные есть
и создаешь временный не по стандарту - он так сам нк удалится
content-length устанавливать не надо его платформа посчитает. Это размер всего тела который получится
а вот Content-type почему то закомментировал. тут надо смотреть чем  кормится сервер может не критичино а может очень критично
соединение в keep-alive  надо переводить только если собираешься несколько запросов делать в рамках одного соединения это чтоб сервер держал сеанс.
а так ты его тупо обманываешь потому что только один запрос делаешь
В общем в этом коде неправильно все
4 Smit1C
 
27.09.22
08:40
(3) а разве есть такой сайт где отвечают на твой вопрос, а не говорят какой ты тупой в первых 100 комментариях?))
5 Смотрящий
 
27.09.22
08:42
(4) Это фантастика. В (3) сто первый коммент ...
6 Обработка
 
27.09.22
08:44
(4) Группа в телеге...
В разных группах по разному.
В некоторых группах админы флуд косят.
В некоторых закрывают глаза.

Кому будет полезно вот туда отправили https://github.com/vbondarevsky/Connector
Похоже сам автор. За что ему спасибо!
7 Обработка
 
27.09.22
11:54
Вот это заработало:

АдресСтраницы = "/хххххххх/pdf";
Хост = "ххххх.ххх.kz";
МойТокен = "****************";
Строка64 = Base64Строка(ДвоичныйФайл);
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type", "text/plain");
Заголовки.Вставить("Authorization", "Bearer "+ МойТокен);
Заголовки.Вставить("Accept-Encoding", "*/*");
ЗапросHTTP = Новый HTTPЗапрос(АдресСтраницы,Заголовки );
ЗапросHTTP.УстановитьТелоИзСтроки(Строка64); // установили тело
Соединение = Новый HTTPСоединение(Хост,443,,,,,Новый ЗащищенноеСоединениеOpenSSL);
ОтветHTTP = Соединение.ОтправитьДляОбработки(ЗапросHTTP); // финал
Сообщить(ОтветHTTP.ПолучитьТелоКакСтроку());
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший