Работа с 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-сервис на веб-сервере.