В платформе версии 8.3.5 появилась возможность создавать HTTP-сервисы. Как и «старые» SOAP web-сервисы, HTTP-сервис позволяет получать/изменять данные, но при этом, как утверждает компания 1С, HTTP-сервисы потенциально позволяют упростить создание клиентских приложений, уменьшить объем передаваемых данных и вычислительную нагрузку, все это особенно для мобильных устройств.
В этой статья я постараюсь рассказать о том, как создавать, отлаживать и использовать HTTP-сервисы в 1С.
Начнем с того, что для создания HTTP-сервиса нам необходим веб-сервер, например Apache 2.2 (начиная с версии 8.3.8 и Apache 2.4 подойдет). Описывать установку веб-сервера думаю нет необходимости.
Создание HTTP-сервиса
Итак, создаем новый HTTP-сервис:
Корневой URL — важный параметр, входит в адрес по которому сервис будет доступен после публикации.
В соответствующем разделе создаем новый шаблон URL и метод:
У шаблона URL есть единственное свойство — шаблон. Этим свойством можно задать путь по которому будет происходить обращение к HTTP-сервису. В шаблоне можно использовать параметризованные сегменты, как на рисунке ниже (об их использовании ниже).
У метода есть свойство HTTP-метод, которое можно указать выбрав одно из следующих значений: GET, POST, PUT, DELETE, PATCH, MERGE, CONNECT, OPTIONS, TRACE, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK или Любой.
При обращении к HTTP-сервису, платформа пытается сопоставить адрес, по которому произошло обращение с одним из имеющихся шаблонов и методов. Если сопоставить удалось, то будет выполнен обработчик метода, если же сопоставить не удалось, то будет возвращен код ответа 404.
Перейдем к примеру обработчика метода, в нем я возвращаю содержимое переменной «Запрос», которая передается в обработчик:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | Функция ШаблонGetInfo(Запрос) тОтвет = "HTTPМетод - "+Запрос.HTTPМетод+" "; тОтвет = тОтвет+"БазовыйURL - "+Запрос.БазовыйURL+" "; тОтвет = тОтвет+"ОтносительныйURL - "+Запрос.ОтносительныйURL+" "; Для Каждого тЭлем Из Запрос.ПараметрыURL Цикл тОтвет = тОтвет+" "+"ПараметрыURL["+тЭлем.Ключ+"]"+" - "+тЭлем.Значение; КонецЦикла; тОтвет = тОтвет + " "; Для Каждого тЭлем Из Запрос.ПараметрыЗапроса Цикл тОтвет = тОтвет+" "+"ПараметрыЗапроса["+тЭлем.Ключ+"]"+" - "+тЭлем.Значение; КонецЦикла; тОтвет = тОтвет + " "; Для Каждого тЭлем Из Запрос.Заголовки Цикл тОтвет = тОтвет+" "+"Заголовки["+тЭлем.Ключ+"]"+" - "+тЭлем.Значение; КонецЦикла; HTTPОтвет = Новый HTTPСервисОтвет(200); HTTPОтвет.УстановитьТелоИзСтроки(тОтвет); HTTPОтвет.Заголовки["Content-Type"] = "text/html; charset=utf-8"; //сообщаем что это html Возврат HTTPОтвет; КонецФункции |
Публикация и проверка HTTP-сервиса
Наш HTTP-сервис готов к публикации, в этом нет ничего сложного (вероятно потребуется запустить конфигуратор от имени администратора):
После публикации я могу обратиться к сервису вот по такому адресу: http://localhost/HTTPTest/hs/Obmen/test-parametr/Test/GetInfo?param=value, где:
- localhost — адрес сервера;
- HTTPTest — имя указанное при публикации;
- hs — обязательный сегмент пути, дающий понять, что работаем мы именно с HTTP-сервисом;
- Obmen — корневой URL HTTP-сервиса;
- test-paramenter/Test — путь к методу внутри сервиса, определяется шаблоном;
- GetInfo — название метода;
- ?param=value — необязательный пример передачи методу параметров.
Параметры URL, параметры запроса и заголовки представлены в виде фиксированных структур.
Вероятнее всего, при обращение к HTTP-сервису нужно будет авторизоваться (если в базе есть хоть один пользователь), есть несколько способов решения этой проблемы.
Первый — изменить файл default.vrd, который находится в каталоге публикации. В этом файле нужно дополнить строку подключения к базе, например, было:
ib=»File="C:\Base\TEST";»,
стало:
ib=»File="C:\Base\TEST";Usr=Логин;Pwd=Пароль».
В этом случае любые обращения к HTTP-сервису не будут требовать логина и пароля.
Во-вторых, можно указывать логин и пароль при подключении к HTTP-сервису:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | &НаКлиенте Процедура ТестHTTP(Команда) Попытка тСоединение = Новый HTTPСоединение("localhost", 80, "Админ", "123"); Исключение КонецПопытки; тHTTPЗапрос = Новый HTTPЗапрос("/HTTPTest/hs/Obmen/test-parametr/Test/GetInfo?param=value"); тОтвет = ""; Попытка тHTTPОтвет = тСоединение.Получить(тHTTPЗапрос); тОтвет = тHTTPОтвет.ПолучитьТелоКакСтроку(); Исключение Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; Сообщить(тОтвет); КонецПроцедуры |
В других языках программирования аналогично.
Кроме этого можно использовать windows-авторизацию.
Отладка HTTP-сервисов
Для того чтобы иметь возможность отлаживать HTTP-сервисы нужно, во-первых, опубликовать HTTP-сервис со следующими настройками:
Во-вторых, в конфигураторе, в меню «Отладка»->»Подключение…» нужно настроить автоматическое подключение:
И, наконец, в-третьих, нужно перезапустить веб-сервер.
Кроме этого для полноценной отладки могут потребоваться сторонние программы, так как браузер всегда старается использовать метод GET. Для тестирования всех остальных HTTP-методов можно использовать бесплатный Fiddler2 (http://www.telerik.com/fiddler).
На этом все, буду рад услышать любые дополнения и замечания.
Загрузка...
А как в самой 1С увидеть результат обращения к веб сервису? Чтобы в самой 1С выскочило сообщение о том что произошло подключение из вне.. Заранее спасибо
Пишешь функцию отправки уведомления пользователю или всем, потом вешаешь триггер или в модуль отслеживания подключений вызов ставишь.
Спасибо
Спасибо огромное за урок.
Но вылезает ошибка:
Not Found
The requested URL /HTTPTest/hs/Obmen/test-parametr/Test/GetInfo was not found on this server.
Не получается почему то. На localhost заходит, а на ваш урл нет. Куда копать?
Спасибо за статью.
Вопрос по соединению, которое открывает web-сервер к базе (к сервису).
По какой-то причине соединение всегда использует английский язык.
Снимок экрана https://i.imgur.com/msaJnLu.png
В настройках пользователя указан «Русский». При интерактивной работе пользователя используется «Русский».
Не знаете в какую сторону смотреть?
чегой то не получается опубиковать веб сервис!
сама база вроде публикуется а потом косяки какие то!
смогли бы вы глянуть плиииз)
чегой то не получается опубиковать веб сервис!
тт
сама база вроде публикуется а потом косяки какие то!
смогли бы вы глянуть плиииз)
ib=»File="C:\Base\TEST";»,
стало:
ib=»File="C:\Base\TEST";Usr=Логин;Pwd=Пароль».
Залогинил. Все получилось. Единственный вопрос. А возможно ли прописать в модуле HTTP-сервиса логин (пользователя 1с) и пароль, а не менять файл default.vrd ?
В самом начале листинга Вы создали параметр Номер, но в листингах и далее больше нигде не встречается упоминание об этом параметре.
Можете пояснить, почему? Пытаюсь вникнуть в базовые принципы работы c http и много чего не понятно.
Непонятно, откуда ВЫ взяли test-parametr:
test-paramenter/Test — путь к методу внутри сервиса, определяется шаблоном;
Где он прописан?????????
Такого нет в примере когда создаем веб — сервис
Похоже, что тут: https://1c-programmer-blog.ru/wp-content/uploads/2016/03/http-service-1s-3.png
Огромное спасибо. Статья очень помогла. И еще одно, также огромное, спасибо за ссылку на Fiddler программа помогла выяснить, что ошибка не у меня в 1С, а что мне отправляют неправильные данные (ошиблись в ссылке).
Вопрос по публикации web да и http сервисов 1с.
Когда публикаю базу, (apache2 или iis) с анонимно
Вопрос по публикации web да и http сервисов 1с.
Когда публикую базу, (apache2 или iis) с анонимной аутентификацией веб сервера — все нормально, все работает.
Но стоит мне закрыть веб-сервер паролем (базовая аутентификация — AuthType Basic) чтобы базу хоть немного защитить выпуская в нет — веб публикация работает, а любые http сервисы и даже ссылки в самой базе не отрабатывают.
Простой пример — опубликовать типовую конфигурацию БК3, на титульной странице при запуске будет url с картинкой и ссылкой на учебное пособие. с аутентификацией веб-сервера — он эту картинку не покажет.
Бился достаточно долго но пока не понял в чем дело. С такой аутентификацией сайты работают нормально. Возможно сама 1с не умеет так работать правильно.