14 мар. 2022 г.

Отправить файл POST запросом с учетом ultipart/form-data

Пример запроса отправки прайс листа на сервис "Вачсно" с последующей обработкой ответа от сервиса

#Область ВЧАСНО
Функция ОтправитьФайлПрайсВчасно(ПолноеИмяФайла, МассивID)
//пример запроса:
//
//POST https://edi.vchasno.ua/api/documents/prices?buyer_edrpou=ИдентификаторКонтрагентаДляКоторогоВыгружаемПрайс
//
//authorization: <vchasno-edi_token>
//content-type: multipart/form-data; boundary=BOUNDARY
//
//--BOUNDARY
//Content-Disposition: form-data; name="file"; filename="pricat.xml"
//Content-Type: application/xml
//<?xml version='1.0' encoding='utf-8'?>
//<PRICAT>
//...
//</PRICAT>
//--BOUNDARY--
урлОтправитьДокумент = "/api/documents/prices?buyer_edrpou=" + "ИдентификаторКонтрагентаДляКоторогоВыгружаетсяПрайс";
СерверАПИ = "edi.vchasno.ua";
Токен = "ХХХХХХХХХХХХХХХХ";
BOUNDARY = Строка(Новый УникальныйИдентификатор); //просто произвольные символы
лПолноеИмяФайлаXML = ПолноеИмяФайла; //ХМЛ файл, с которого будем получать ХМЛ строку
тФайл = Новый Файл(лПолноеИмяФайлаXML);
Если НЕ тФайл.Существует() Тогда
Сообщить(НСтр("ru = 'Не найден файл '; uk = 'Не знайдено файл '")+лПолноеИмяФайлаXML+" для отправки на сервис ""Вчасно""", СтатусСообщения.Внимание);
Возврат МассивID;
ИначеЕсли НЕ тФайл.ЭтоФайл() Тогда
Сообщить(НСтр("ru = 'Не является файлом '; uk = 'Не є файлом '")+лПолноеИмяФайлаXML+" для отправки на сервис ""Вчасно""", СтатусСообщения.Внимание);
Возврат МассивID;
КонецЕсли;
Текст = Новый ТекстовыйДокумент;
тмпОтвет = ПолучитьИмяВременногоФайла("txt");
ИмяФайлаОтправки = ПолучитьИмяВременногоФайла("txt");
ФайлОтправки = Новый ЗаписьТекста(ИмяФайлаОтправки, КодировкаТекста.ANSI, Символы.ПС, Ложь);
ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
ФайлОтправки.ЗаписатьСтроку("Content-Disposition: form-data; name=""file""; filename=""pricat.xml""");
ФайлОтправки.ЗаписатьСтроку("Content-Type: application/xml");
ФайлОтправки.ЗаписатьСтроку("");
//вставка Прайса ХМЛ
ТекстXML = Новый ТекстовыйДокумент;
ТекстXML.Прочитать(лПолноеИмяФайлаXML, КодировкаТекста.ANSI, );
ФайлОтправки.ЗаписатьСтроку(СокрЛП(ТекстXML.ПолучитьТекст()));
ФайлОтправки.ЗаписатьСтроку("");
ФайлОтправки.ЗаписатьСтроку("--" + Boundary + "--");
ФайлОтправки.Закрыть();
ЗаголовокHTTP = Новый Соответствие();
ЗаголовокHTTP.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary);
ЗаголовокHTTP.Вставить("Authorization", Токен);
ХСоединение = Новый HTTPСоединение( СерверАПИ,,,,, 60, Новый ЗащищенноеСоединениеOpenSSL());
ХЗапрос = Новый HTTPЗапрос(урлОтправитьДокумент, ЗаголовокHTTP);
ХЗапрос.УстановитьИмяФайлаТела(ИмяФайлаОтправки);
ХОтвет = ХСоединение.ОтправитьДляОбработки(ХЗапрос, тмпОтвет);
КодОтвета = ХОтвет.КодСостояния;
Если КодОтвета = 200 Тогда
Попытка
УдалитьФайлы(лПолноеИмяФайлаXML);
Исключение
Сообщить(НСтр("ru = 'Неудачная попытка удаления файла '; uk = 'Невдала спроба видалення файла '")+лПолноеИмяФайлаXML, СтатусСообщения.Внимание);
Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);
КонецПопытки;
Если ВРЕГ(ХОтвет.Заголовки.Получить("Content-Type")) = ВРЕГ("application/json") Тогда
тФайлОтвета = Новый Файл(тмпОтвет);
Текст.Прочитать(тмпОтвет, КодировкаТекста.UTF8);
ЧтениеДЖ = Новый ЧтениеJSON;
ЧтениеДЖ.УстановитьСтроку(Текст.ПолучитьТекст());
ОбъектДЖ = ПрочитатьJSON(ЧтениеДЖ, Истина); // читаем в соответвие
ИДВчасно = ОбъектДЖ.Получить("id");
Если ИДВчасно <> Неопределено Тогда
Сообщить("Отправленный прас получил ИД: " + ИДВчасно);
МассивID.Добавить(ИДВчасно);
Попытка
УдалитьФайлы(тмпОтвет);
Исключение
Сообщить(НСтр("ru = 'Неудачная попытка удаления файла '; uk = 'Невдала спроба видалення файла '")+тмпОтвет, СтатусСообщения.Внимание);
Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);
КонецПопытки;
Возврат МассивID
КонецЕсли;
Иначе
Возврат МассивID
КонецЕсли;
Иначе
Сообщить(НСтр("ru = 'Получен ответ с кодом '; uk = 'Отримано відповідь з кодом '")+КодОтвета, СтатусСообщения.Внимание);
// разобрать ошибки
ОшибкаРазбора = Ложь;
тФайлОтвета = Новый Файл(тмпОтвет);
Если НЕ тФайлОтвета.Существует() Тогда
Сообщить(НСтр("ru = 'Не найден файл ответа сервиса: '; uk = 'Не знайдено файл відповіді сервісу: '")+тмпОтвет, СтатусСообщения.Внимание);
Иначе
Текст.Прочитать(тмпОтвет, КодировкаТекста.UTF8);
Если Текст.КоличествоСтрок() > 0 Тогда
ОтветСервера = Текст.ПолучитьТекст();
_ЧтениеXML = Новый ЧтениеXML;
Попытка
_ЧтениеXML.УстановитьСтроку(ОтветСервера);
Исключение
Сообщить(НСтр("ru = 'Неудачная попытка чтения ответа сервиса: '; uk = 'Невдала спроба читання відповіді сервісу: '")+ОписаниеОшибки(), СтатусСообщения.Внимание);
ОшибкаРазбора = Истина;
КонецПопытки;
КонецЕсли;
Если НЕ ОшибкаРазбора Тогда
Поз = Найти(Лев(ОтветСервера, 5), "xml");
Если Поз = 0 Тогда
Сообщить(НСтр("ru = 'Неудачная попытка разбора ответа сервиса (Код состояния = '; uk = 'Невдала спроба розбору відповіді сервісу (Код стану = '")+КодОтвета+"): ", СтатусСообщения.Внимание);
Сообщить(ОтветСервера, СтатусСообщения.Внимание);
Иначе
ОбработатьОписаниеОшибки(_ЧтениеXML, КодОтвета);
КонецЕсли;
КонецЕсли;
Возврат МассивID
КонецЕсли;
КонецЕсли;
Возврат МассивID
КонецФункции
Процедура ОбработатьОписаниеОшибки(_ЧтениеXML, КодСостояния)
Если КодСостояния = 504 Тогда // иная структура ответа
Сообщить(НСтр("ru = 'Ответ сервиса (Код состояния = '; uk = 'Відповідь сервісу (Код стану = '")+КодСостояния+")", СтатусСообщения.Внимание);
Возврат;
КонецЕсли;
СтруктураОшибки = Новый Структура("title, body");
ИмяУзла = "";
Читать = Ложь;
Пока _ЧтениеXML.Прочитать() Цикл
ТипУзла = _ЧтениеXML.ТипУзла;
Если ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если ИмяУзла = "files" Тогда
СтруктураОшибки.Вставить("ИмяФайла", _ЧтениеXML.Имя);
Читать = Ложь;
Иначе
ИмяУзла = _ЧтениеXML.Имя;
Читать = СтруктураОшибки.Свойство(ИмяУзла);
КонецЕсли;
ИначеЕсли ТипУзла = ТипУзлаXML.Текст И Читать Тогда
СтруктураОшибки.Вставить(ИмяУзла, _ЧтениеXML.Значение);
Читать = Ложь;
Иначе
Читать = Ложь;
КонецЕсли;
КонецЦикла;
Сообщить(НСтр("ru = 'Ответ сервиса (Код состояния = '; uk = 'Відповідь сервісу (Код стану = '")+КодСостояния+"):", СтатусСообщения.Внимание);
Сообщить(" - заголовок: "+СтруктураОшибки["title"], СтатусСообщения.Внимание);
Сообщить(" - описание: "+СтруктураОшибки["body"] , СтатусСообщения.Внимание);
КонецПроцедуры

#КонецОбласти

Комментариев нет:

Отправить комментарий

 

CopyPaste Copyright © 2017 - |- Шаблон создан O Pregador - |- Отредактирован myr4ik07