Предположим, что есть сайт (HTML-страница) с формой, в которой пользователь должен заполнить некие поля, прикрепить файл и отправить все эти данные на сервер, чтобы сохранить их в базе 1С, где-то на диске или просто обработать по какому-либо алгоритму. Например, прикрепить скан паспорта в личном кабинете или скриншот при описании своей проблемы с программой и т.п.
Для отправки HTML-форм с двоичными данными методом POST используется составной тип содержимого multipart/form-data.
Получение таких данных HTTP-сервисом 1С реализовано на примере демонстрационной базы. В базе присутствует справочник Пользователи, содержащий имя пользователя, адрес его электронной почты и фотографию. А так же HTTP-сервис для регистрации новых пользователей.
Реализована простейшая HTML-страница регистрации пользователя на сайте.
После нажатия на кнопку Выполнить регистрацию в демонстрационной базе создаётся новый элемент справочника Пользователи, содержащий указанные данные.
Тело передаваемого POST запроса будет выглядеть следующим образом.
POST /form.html HTTP/1.1 Host: server.com Referer: http://server.com/form.html User-Agent: Mozilla Content-Type: multipart/form-data; boundary=-------------573cf973d5228 Content-Length: 288 Connection: keep-alive Keep-Alive: 300 (пустая строка) (отсутствующая преамбула) ---------------573cf973d5228 Content-Disposition: form-data; name="email" phill@bestcompany.com ---------------573cf973d5228 Content-Disposition: form-data; name="name" Филиппов Артем Леонидович ---------------573cf973d5228 Content-Disposition: form-data; name="photo"; filename="photo.png" Content-Type: image/png <Двоичные данные изображения> ---------------573cf973d5228--
Подробно этот метод описан в RFC7578.
Функции по обработке HTTP-запроса с составным содержимым реализованы в общем модуле ОбработкаЗапросовHTTPСервиса. Его можно использовать "как есть" в своих конфигурациях.
Процедура обработчика HTTP-сервиса по регистрации нового пользователя может выглядеть подобным образом.
Функция ЗарегистрироватьНовогоПользователя(Запрос)
ПоляЗапроса = ОбработкаЗапросовHTTPСервиса.ПрочитатьСоставноеСодержимоеЗапроса(Запрос);
// Для простоты демонстрации не выполняется проверка корректности заполнения полей запроса.
ДанныеПользователя = Новый Структура;
ДанныеПользователя.Вставить("АдресЭлектроннойПочты", ПоляЗапроса["email"].Содержимое);
ДанныеПользователя.Вставить("ИмяПользователя", ПоляЗапроса["user_name"].Содержимое);
ДанныеПользователя.Вставить("Фотография", ПоляЗапроса["photo"].Содержимое);
Пользователи.ЗарегистрироватьПользователя(ДанныеПользователя);
Ответ = Новый HTTPСервисОтвет(200);
Возврат Ответ;
КонецФункции
Функция ПрочитатьСоставноеСодержимоеЗапроса разбирает полученный запрос и возвращает Соответствие, содержащее переданные поля с их содержимым.
Синтаксис:
ПрочитатьСоставноеСодержимоеЗапроса(<Запрос>)
Параметры:
<Запрос> (обязательный)
Тип: HTTPСервисЗапрос
Запрос, полученный HTTP-сервисом.
Возвращаемое значение:
Тип: Соответствие
Соответствие, содержащее описание полей составного содержимого. В качестве ключа используется имя поля. Значение содержит структуру с описанием поля:
- Имя - Строка - имя поля (свойство name заголовка Content-Disposition).
- ИмяФайла - Строка - имя файла (свойство filename заголовка Content-Disposition). Если имя файла указано, то содержимое является двоичными данными.
- ТипСодержимого - Строка - тип содержимого, указанный в заголовке Content-Type поля. Например: text/plain, image/jpeg и т.п. Может отсутствовать.
- Содержимое - Строка, ДвоичныеДанные - содержимое поля. Если указано имя файла, то содержит двоичные данные, иначе Строка.
Описание:
Читает тело запроса HTTP-сервиса, имеющее составное содержимое (multipart/form-data) и возвращает поля этого содержимого в виде соответствия. В качестве ключа используется имя поля.
В архиве к публикации содержится cf-файл демонстрационной конфигурации и html-страница регистрации пользователя. Также, ниже приведён полный текст общего модуля ОбработкаЗапросовHTTPСервиса, который можно вставить в свою конфигурацию.
Исходный код распространяется под лицензий Apache 2.0. Вы можете свободно использовать, изменять и распространять его, в том числе и в коммерческих целях с обязательным указанием авторства. Подробнее см. текст лицензии http://www.apache.org/licenses/LICENSE-2.0