Web-сервисы |
Web-сервис - это реализуемая программными средствами система для поддержки межмашинного взаимодействия через сеть с использованием HTTP.
Web-сервисы, реализованные средствами
, публикуются в сети с использованием механизмов архитектуры Internet Information Service. В процессе использования web-сервисов участвуют 3 программных продукта:клиент, написанный на любом подходящем языке программирования. Может поставляться вместе с сервером приложений или разрабатываться силами пользователя или сторонних фирм;
IIS с подключенными web-сервисами. Необходимый код генерируется с помощью утилит из скомпилированных ресурсов сервера приложений;
сервер приложений (
), содержащий код с функциональным наполнением опубликованных web-сервисов.Сгенерированные сервисы инкапсулируют обращения к серверу приложений. Вся прикладная логика выполняется на сервере приложений. Результат возвращается на клиент также через web-сервисы.
В данном разделе рассматриваются средства языка VIP для разработки сервера приложений в части, отвечающей за функциональное наполнение web-сервисов. Разработка клиента, генерация и публикация web-сервисов выходит за рамки данного документа.
В процессе функционирования клиент оперирует с бизнес-объектами. Клиент может запросить экземпляр бизнес-объекта для просмотра и обработки, передать его серверу приложений для сохранения в БД отредактированного экземпляра или запросить у сервера приложений другую функциональность, предусмотренную разработчиком бизнес-объекта.
Для доступа к функциональности приложения через web-сервисы используются объектные интерфейсы. Объектный интерфейс определяет тип бизнес-объекта: состав данных (свойства интерфейса) и функциональность (методы интерфейса). Чтобы объектный интерфейс стал доступен клиентам, он должен быть опубликован. Т.е. на интернет-сервере необходимо подключить код соответствующих web-сервисов.
Публикуемые объектные интерфейсы и vip-интерфейсы должны иметь квалификатор web (см. "Синтаксис объектного интерфейса. " и "Описание реализации объектов. "). В этом случае необходимый код будет сгенерирован утилитой atlIdl.
Поскольку клиент работает автономно от сервера приложений, необходимо иметь ссылку на обрабатываемый экземпляр бизнес-объекта. Такая ссылка хранится в структуре, называемой хендл на vip-интерфейс (в текущем разделе - просто хендл). Хендл создается сервером приложений в момент запроса клиентом экземпляра бизнес-объекта. Для этого публикуемый интерфейс должен реализовать интерфейс IGetHandle.
Экземпляр бизнес-объекта, передаваемого клиенту, создается конструктором. Имя конструктора и список параметров определяется при создании хендла (см. "Интерфейс создания хендла. ").
В момент запроса клиентом экземпляра бизнес-объекта ядро приложения выполняет следующие действия:
вызывает метод CreateHandle интерфейса IGetHandle для создания хендла;
вызывает конструктор, указанный в хендле, с параметрами, полученными от клиента;
сохраняет ссылка на экземпляр в хендле.
Для корректной работы алгоритма модификации данных для свойств введены понятия левого и правого соединения (ссылок): leftJoin, rightJoin и noJoin (см. "Свойства. "). Указание типа соединения влияет на порядок вызовов метода DoSetData для свойств текущего объекта (подробнее см. описание интерфейса ISetData).
Если объект ссылается на подобъект, то это считается правой ссылкой. Пример - ссылки на каталоги.
Если подобъект ссылается на объект, то это считается левой ссылкой. Пример - спецификация ссылается на счет.
По умолчанию ссылка считается правой.
Еще одним важным нюансом является отслеживание пассивных блокировок. Т.е. необходимо убедиться, что с момента получения данных клиентом до возврата их серверу приложений для модификации их другой пользователь не изменил указанные данные. В стандартном режиме работы эта функциональность обеспечивается платформо-зависимым образом, который в данном случае никоим образом не может быть использован.
В связи с этим прикладному разработчику нужно добавить в выборку данных поля ATL_LASTDATE, ATL_LASTTIME и ATL_LASTUSER, через которые и будут отслеживаться пассивные блокировки. Далее, прикладному разработчику необходимо написать соответствующий прикладной код для отслеживания данной ситуации. Для этого в метод ISetData.DoSetData (или иной, модифицирующий данные) нужно будет добавить код, подобный нижеприведенному:
if ( <таблица>.ATL_LASTDATE <> <старый>ATL_LASTDATE or <таблица>.ATL_LASTTIME <> <старый>ATL_LASTTIME or <таблица>.ATL_LASTUSER <> <старый>ATL_LASTUSER ) { result := tsConflict; exit; }
Подробнее см. "Пример программирования web-сервиса на VIP. ".
Начиная с Атлантис 5.1.36.