Книга: Технологии интеграции "1С:Предприятия 8.3""
Назад: Работа с составными (multipart) HTTP-сообщениями
Дальше: Разбор составного сообщения на стороне клиента
Создание сервиса для формирования составного сообщения

Работа с HTTP-сервисами подробно рассматривалась в первой главе в разделе «». Поэтому в этом примере мы не будем еще раз на этом останавливаться. Поясним только моменты, касающиеся работы с двоичными данными.

Добавим в нашу демонстрационную конфигурацию новый HTTP-сервис и назовем его HTTPMultipart с корневым URL multipart. Для простоты будем считать, что наш сервис будет возвращать заданное составное сообщение в ответ на любой GET-запрос. Поэтому добавим шаблон URL с именем Тест и значением "/*". Т. е. данный шаблон соответствует любому запросу. Затем добавим в шаблон HTTP-метод GET с именем GET.

В качестве обработчика для метода создадим в модуле сервиса функцию ТестGET() и заполним ее следующим образом (листинг 6.107).

Листинг 6.107. Функция «ТестGET()»

Функция ТестGET(Запрос)

 

Ответ = Новый HTTPСервисОтвет(200);

 

HTTPСообщение = СоздатьСообщение();

Ответ.Заголовки = HTTPСообщение.Заголовки;

Ответ.УстановитьТелоИзДвоичныхДанных(HTTPСообщение.Тело);

 

Возврат Ответ;

 

КонецФункции

Вся работа по созданию HTTP-сообщения выполняется в функции СоздатьСообщение(). Данную функцию заполним следующим образом (листинг 6.108).

Листинг 6.108. Функция «СоздатьСообщение()»

Функция СоздатьСообщение() Экспорт

 

// Создать вложенные сообщения - текст и две картинки в виде двоичных данных.

 

Текст = СоздатьСообщение_Текст("MessageText",

"Привет, Василий!" + Символы.ПС +

"Твой ручной лев, которого ты оставил у меня на прошлой неделе, разодрал весь мой диван." + Символы.ПС +

"Пожалуйста забери его скорее!" + Символы.ПС +

"Во вложении две фотки с последствиями.");

 

Пингвины = СоздатьСообщение_Изображение("image1", "penguins.jpg", БиблиотекаКартинок.Пингвины);

Коала = СоздатьСообщение_Изображение("image2", "coala.jpg", БиблиотекаКартинок.Коала);

 

// Сформировать основное составное сообщение.

Разделитель = "Asrf456BGe4h";

 

Результат = Новый Структура();

Заголовки = Новый Соответствие();

 

Результат.Вставить("Заголовки", заголовки);

Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Разделитель);

 

Тело = Новый ПотокВПамяти();

ЗаписьДанных = Новый ЗаписьДанных(Тело);

 

ЗаписьДанных.ЗаписатьСтроку("==" + Разделитель);

ЗаписьДанных.Записать(Текст);

 

ЗаписьДанных.ЗаписатьСтроку("==" + Разделитель);

ЗаписьДанных.Записать(Пингвины);

 

ЗаписьДанных.ЗаписатьСтроку("==" + Разделитель);

ЗаписьДанных.Записать(Коала);

 

ЗаписьДанных.ЗаписатьСтроку("==" + Разделитель + "==");

 

ЗаписьДанных.Закрыть();

 

ДанныеТела = Тело.ЗакрытьИПолучитьДвоичныеДанные();

 

Результат.Вставить("Тело", ДанныеТела);

 

Возврат Результат;

 

КонецФункции

Из этой функции, формирующей составное HTTP-сообщение, возвращается структура Результат, содержащая заголовки и тело ответа сервиса, которое затем будет разобрано и показано в обработке на клиенте. Тело ответа сервиса (Результат.Тело) формируется в виде двоичных данных, разделенных разделителем, и содержит три части: текст и две картинки. Функции, возвращающие текст и картинки в виде двоичных данных: СоздатьСообщение_Текст(), СоздатьСообщение_Изображение(), – приведены ниже в листингах 6.109, 6.110.

Для записи тела сообщения создается поток в памяти, и с помощью объекта ЗаписьДанных в него записываются составные части HTTP-сообщения. Затем методом ЗакрытьИПолучитьДвоичныеДанные() поток закрывается, а двоичные данные из него сохраняются в поле Тело структуры Результат.

В заключение после возврата структуры сообщения в функцию ТестGET() (см. листинг 6.107) тело ответа сервиса устанавливается с помощью метода УстановитьТелоИзДвоичныхДанных объекта HTTPСервисОтвет.

Вспомогательную функцию СоздатьСообщение_Текст() заполним следующим образом (листинг 6.109).

Листинг 6.109. Функция «СоздатьСообщение_Текст()»

Функция СоздатьСообщение_Текст(ИмяСообщения, Текст)

 

Поток = Новый ПотокВПамяти();

ЗаписьДанных = Новый ЗаписьДанных(Поток);

 

// Записать заголовки.

ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=" + ИмяСообщения);

ЗаписьДанных.ЗаписатьСтроку("");

 

// Записать тело.

ЗаписьДанных.ЗаписатьСтроку(Текст);

 

записьДанных.Закрыть();

 

Возврат Поток.ЗакрытьИПолучитьДвоичныеДанные();

 

КонецФункции

Вспомогательную функцию СоздатьСообщение_Изображение() заполним следующим образом (листинг 6.110).

Листинг 6.110. Функция «СоздатьСообщение_Изображение()»

Функция СоздатьСообщение_Изображение(ИмяСообщения, ИмяФайла, Картинка)

 

Поток = Новый ПотокВПамяти();

ЗаписьДанных = Новый ЗаписьДанных(Поток);

 

// Записать заголовки.

ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=" + ИмяСообщения + "; filename=" + ИмяФайла);

ЗаписьДанных.ЗаписатьСтроку("Content-Type: image/jpeg");

ЗаписьДанных.ЗаписатьСтроку("");

 

// Записать тело.

ЗаписьДанных.Записать(Картинка.ПолучитьДвоичныеДанные());

 

ЗаписьДанных.Закрыть();

 

Возврат Поток.ЗакрытьИПолучитьДвоичныеДанные();

 

КонецФункции

Осталось только опубликовать наш HTTP-сервис на веб-сервере.

Назад: Работа с составными (multipart) HTTP-сообщениями
Дальше: Разбор составного сообщения на стороне клиента