98
В. А . Курчидис М.Ю. Лунев А. С. Назанский С. А . Рыльков ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС-ОРИЕНТИРОВАННЫХ ПРИКЛАДНЫХ СИСТЕМАХ

ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

В.А. КурчидисМ.Ю. ЛуневА.С. НазанскийС.А. Рыльков

ОРГАНИЗАЦИЯWEB-ВЗАИМОДЕЙСТВИЙ

В СЕРВИС-ОРИЕНТИРОВАННЫХПРИКЛАДНЫХ СИСТЕМАХ

Page 2: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

Министерство образования Российской ФедерацииЯрославский государственный университет

им. П.Г. Демидова

В.А. КурчидисМ.Ю. Лунев

А.С. НазанскийС.А. Рыльков

ОРГАНИЗАЦИЯWEB-ВЗАИМОДЕЙСТВИЙ

В СЕРВИС-ОРИЕНТИРОВАННЫХПРИКЛАДНЫХ СИСТЕМАХ

Ярославль 2002

Page 3: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

ББК К 93УДК 004.432

Курчидис В.А., Лунев М.Ю., Назанский А.С., Рыльков С.А.Организация Web-взаимодействий в сервис-ориентированныхприкладных системах Яросл. гос. ун-т. Ярославль, 2002. 97 с.

Проводится исследование принципов организации взаимодействиймежду компонентами распределенных прикладных систем, ориентиро-ванных на предоставление информационных услуг и сервисов с исполь-зованием Web-технологий.

Показывается, что концепция сервис-ориентированных архитектур,ведущая от базовой Web-технологии к Web-сервисам и Web-службам,является основой целого ряда эффективных решений сложной пробле-мы интеграции прикладных систем в глобальных сетях.

Обсуждаются особенности практического построения программ-ных компонентов сервис-ориентированных прикладных систем, на ос-нове которых может осуществляться реальное взаимодействие междуприложениями в распределенных системах.

Ил. 37. Библиогр.: 40 назв.

Рецензенты:

Печатается при финансовой поддержке федеральной целевой про-граммы "Интеграция" (гос. контракт № )

ISBN © Ярославскийгосударственныйуниверситет, 2002© В.А. Курчидис,М.Ю. Лунев,А.С. Назанский,С.А. Рыльков, 2002

Page 4: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

3

ПРЕДИСЛОВИЕ

Развитие компьютерных сетей и Internet способствовало быстромусовершенствованию сферы предоставления информационных услуг, врезультате чего за сравнительно короткий срок сложились новые под-ходы к работе с информацией (ее передаче, обработке и представлению)в глобальных системах и сетях.

Такой бурный процесс развития информационных и сетевых техно-логий, активно поддерживаемый различными фирмами-производи-телями программных и технических средств, привел к появлению ог-ромного разнообразия программных продуктов, совместное использо-вание которых в глобальных и корпоративных системах превращается впроблему межплатформенной совместимости.

Учитывая большие масштабы и сложность современных распреде-ленных прикладных систем, трудно переоценить важность и необходи-мость решения разрастающейся проблемы. Поэтому в настоящее времяочень большое значение приобретают вопросы интеграции приложенийи данных в распределенных системах, связанные прежде всего с обес-печением возможности взаимодействия любых компонентов между со-бой.

Современное решение проблемы заключается в создании универ-сальных промежуточных форматов данных, с помощью которых можнообеспечить обмен между любыми приложениями в любой системе.Здесь уместно упомянуть попытку реализации такого промежуточногостандарта для разных человеческих языков в конце 19 века в виде «эс-перанто», которая в целом оказалась не очень удачной, что подчеркива-ет сложность обсуждаемой проблемы. Появление Web-технологий и языка HTML в качестве определен-ного стандарта можно рассматривать как важный шаг на этом пути.Развивая определенным образом клиент-серверную архитектуру систем,Web-технология стала выступать как основа интеграции распределен-ных прикладных систем и привела к Web-интерфейсной архитектуре, вкоторой взаимодействия между приложениями организуются по прин-ципу удаленного доступа к информационным службам и услугам.

Дальнейшее развитие форм и методов интеграции способствовалопоявлению нового стандарта в виде языка XML. Проникновение XML вWeb-технологии привело к концепции Web-сервисов и Web-служб, какновой платформы интеграции. При этом многие идеи компонентныхтехнологий, например, COM/DCOM, развиваются применительно к гло-бальным информационным системам, определяя взаимодействие междуприложениями как удаленный доступ к сервисам (функциям и операци-ям) через Web.

Page 5: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

4

Появление Web-служб и XML приводит к переходу от Web-интерфейсной архитектуры прикладных систем к сервис-ориентирован-ной архитектуре, что существенно упрощает интеграцию приложений иданных.

Развитие такого подхода позволяет выйти за рамки простого дос-тупа к удаленным информационным ресурсам и службам и отвечаетсовременным тенденциям организации прикладных систем информаци-онного обслуживания, направленных на развитие электронных компь-ютерных услуг (системы типа B2B, B2C, CRM и т.п.), подобно тому, какэто происходит в других сферах общественного потребления.

Web-службы поддерживаются крупными производителями про-граммных продуктов, в первую очередь, фирмами Microsoft, Oracle, SunMicrosystems. Однако широкому применению этой технологии препят-ствуют проблемы практического характера (отсутствие единых стандар-тов, проблемы безопасности и т.п.), так что в целом вопросы организа-ции прикладных систем с сервис-ориентированной архитектурой оста-ются малоизученными.

В данной работе с единых общесистемных позиций обсуждаютсявопросы организации взаимодействия приложений в таких системах наоснове Web-технологий. Делается попытка представить существо ис-пользуемых при этом технологий и решений в рамках абстрактной мо-дели информационного обслуживания, что должно способствоватьлучшему пониманию одного из развивающихся подходов к решениюпроблемы интеграции прикладных проблем.

В основу работы положены результаты исследований, ведущихсяна кафедре информационных и сетевых технологий Ярославского госу-дарственного университета им. П.Г.Демидова совместно с лабораториейраспределенных информационно-вычислительных систем и сетей Ин-ститута микроэлектроники и информатики Российской академии наук.

Работа может оказаться полезной для начинающих научных со-трудников, аспирантов, студентов, а также технических специалистов,которые активно интересуются новыми информационными техноло-гиями и средствами интеграции корпоративных компьютерных систем.

Page 6: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

5

1. СТРУКТУРИЗАЦИЯ И ИНТЕГРАЦИЯ СЕРВИС-ОРИЕНТИРОВАННЫХ ПРИКЛАДНИХ СИСТЕМ

НА ОСНОВЕ WEB-ТЕХНОЛОГИЙ

1.1. Развитие информационных услугв современных компьютерных системах

Современную информационную систему в общем виде можнопредставить как распределенную компьютерную систему, в которойобеспечивается взаимодействие большого числа удаленных пользовате-лей с распределенным информационным ресурсом через компьютернуюсеть (рис.1.1).

П1, П2, . . . ,ПN – пользователи системыR1, R2, . . . , RL – информационные ресурсы системы

Рис.1.1

В качестве информационного ресурса Ri системы может выступатьбаза данных, сайт, торговая площадка, почтовая служба, удаленное при-ложение и т.п. С программно-технической точки зрения пользователь иинформационный ресурс могут быть представлены как программныеприложения (прикладные процессы), которые исполняются на соответ-ствующих компьютерных средствах. И таким образом, в целом инфор-мационная система представляется как распределенная прикладная сис-тема, в которой реализуются определенные правила информационноговоздействия между компонентами.

Представленная модель соответствует современным принципам ор-ганизации информационных систем, направленным на развитие элек-тронных услуг. Это позволяет рассматривать информационную системукак совокупность информационных служб, предоставляющих пользова-телям свои услуги для оперирования различными видами информаци-онных ресурсов (рис.1.2).

Page 7: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

6

Рис.1.2

Данная концепция наглядно отражает тот факт, что информациявыступает в системе не просто в качестве ресурса, а как товар, которыйможет являться основой для организации бизнеса. В корпоративныхсистемах развитие такой концепции способствует повышению эффек-тивности информационного обслуживания участников и позволяет вый-ти за рамки простого доступа пользователей к информационным ресур-сам предприятия.

Приведенная структура ориентирована на организацию достаточномощных служб с распределенной архитектурой. В развитии этой струк-туры важную роль сыграли клиент-серверные и Web-технологии. Убе-дительным примером жизненности такого подхода к организации ин-формационных систем служит опыт развития Internet.

1.2. Информационные сервисы в Internet

Под интернет (internet) в узком смысле этого слова понимается се-тевая коммуникационная среда, в которой обмен данными между ком-пьютерами, подключенными к ней, осуществляется по протоколамTCP/IP. В таком значении более распространенным является терминintranet (интранет), который по существу означает использование техно-логии internet при организации корпоративных информационных системи сетей [27]. В широком смысле под Интернет (Internet) (пишется обыч-но с заглавной буквы) понимают всемирную «сеть сетей», то есть сово-купность соединенных между собой компьютерных сетей во всем мире,в которой используются единые согласованные правила обмена данны-ми. Основу Internet (и, соответственно, intranet) составляет стек прото-колов TCP/IP.

Page 8: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

7

Сама по себе сеть Internet не определяет, какая именно информацияи с какой целью будет передаваться. Практическую ценность представ-ляют прикладные программы и протоколы стека TCP/IP, образующиеоснову для организации ряда типовых сетевых информационных серви-сов: HTTP, FTP, Telnet, POP, SMTP и другие. Компьютеры, предостав-ляющие такие сервисы, называются соответствующими серверами. Со-ответственно, компьютеры, пользующиеся услугами, называются кли-ентами. Аналогичные термины используются применительно к соответ-ствующим программным компонентам.

Среди первых услуг, которые предоставлялись пользователям в се-ти Internet, были Telnet, FTP и электронная почта. В настоящее времяодной из наиболее популярных услуг является WWW (World WideWeb – буквально: «всемирная паутина»).

Сервис Telnet применяется для подключения к удаленным систе-мам, присоединенным к сети. При использовании этого сервиса пользо-ватель должен зарегистрироваться на сервере Telnet, после чего рабочаястанция пользователя функционирует в режиме терминала, подключен-ного к внешнему хост-компьютеру. С этого терминала пользовательможет вводить команды, которые обеспечивают ему доступ к файлам изапуск программ на удаленном компьютере.

Публичный доступ к файлам удаленным пользователям Internetпредлагают так называемые FTP-серверы. На FTP-серверах в виде фай-ловых архивов хранятся документы, программы, графика и другие видыинформации. Пересылка файлов с сервера на компьютер пользователяосуществляется с помощью протокола FTP (File Transfer Protocol).

Электронная почта является аналогом обычной почтовой службы ипредназначена для пересылки сообщений в сети от одного почтовогоадреса к другому. В Internet для работы с электронной почтой исполь-зуются прикладные протоколы SMTP, POP или IMAP.

Протокол SMTP (Simple Mail Transfer Protocol) выполняет передачусообщений между почтовыми серверами в сети Internet. POP (Post OfficeProtocol) дает пользователю доступ к пришедшим к нему электроннымсообщениям, то есть осуществляет связь между компьютером пользова-теля и почтовым сервером, на котором зарегистрирован почтовый ящикпользователя, пересылая все сообщения на компьютер пользователя.

Сервис WWW (World Wide Web, Web, W3) использует среду Inter-net (intranet) для передачи гипертекстовых документов, содержащих нетолько собственно информацию (текст, изображение, звук), но такжессылки на другие аналогичные документы. Совокупность всех докумен-тов с перекрестными ссылками образуют своего рода «паутину» (Web).По определению основателя WWW Тима Бернес-Ли (Tim Barnes-Lee),эта служба представляет собой «распределенную систему мультимедиа

Page 9: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

8

коллективного пользования» [13]. Информация, доступная по WWW,чрезвычайно разнообразна, и в целом эта служба напоминает огромнуюнеупорядоченную библиотеку.

Для работы с WWW на клиентских компьютерах устанавливаютсяпрограммы-браузеры (browser). В настоящее время одним из довольнопопулярных браузеров является Microsoft Internet Explorer. Web-браузерпредоставляет пользователю возможность просматривать гипертексто-вые документы, находящиеся на удаленных компьютерах-серверах.

Гипертекстовые документы подготавливаются с помощью языкаразметки гипертекста HTML (Hyper Text Mark-up Language). Основнымсетевым протоколом, предназначенным для работы системы WWW,является протокол передачи гипертекста HTTP (Hyper Text TransferProtocol ).

1.3. Web-технология и Web-системы

Принципы, заложенные в WWW, удобно рассматривать как основуWWW-технологии (или Web-технологии) для организации информаци-онных систем различного масштаба (подразделения, предприятия, ми-рового масштаба), ориентированных на предоставление информацион-ных услуг определенного вида. Развивая определенным образом клиент-серверную организацию систем, Web-технология привела к Web-интерфейсной системной архитектуре и стала выступать как основа ин-теграции прикладных систем, создаваемых в различных областях наразличных платформах.

Можно указать несколько основных моментов, определяющих ба-зовую Web-технологию [13].

Использование языка HTML гипертекстовой разметки докумен-тов. Это позволяет встраивать гипертекстовые ссылки в тело самогодокумента и сохранять их. Сами документы в WWW являются обычны-ми текстовыми файлами, благодаря чему отпадает необходимость всоздании новой гипертекстовой базы данных.

Универсальный способ адресации ресурсов в сети URL (UniversalResource Locator). Адресация URL представляет собой специальнуюсистему, в которой учитывается опыт адресации и идентификации ре-сурсов из других служб Internet. URL используется для организациигипертекстовых ссылок в WWW, обеспечивая адресный доступ к рас-пределенным ресурсам сети.

Использование прикладного протокола HTTP. Протокол HTTPпредназначен для обмена гипертекстовыми документами и учитываетспецифику такого обмена.

Page 10: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

9

WWW является клиент-серверной технологией, в которой взаи-модействие между компонентами организуется с использованием двухтипов сообщений: запросы от Web-клиента (браузера) к Web-серверу иответы сервера клиенту. Предполагается, что в ответ на запрос серверпредоставляет клиенту некоторую информацию (так называемый кон-тент). В простейшем случае контент ответа представляет собой содер-жимое файла, расположенного на диске сервера. Это может быть какHTML-файл, так и файл иного формата.

Взаимодействие Web-клиента и Web-сервера по описанной схеме,называемое также Web-взаимодействием, может рассматриваться какоснова для организации простейшей Web-системы (рис.1.3).

Рис.1.3

С точки зрения предоставляемого сервиса Web-сервер для пользо-вателя представляется как информационный ресурс – набор информа-ционных документов, доступ к которым осуществляется по определен-ным правилам. Информационный обмен между Web-сервером и Web-клиентом осуществляется с помощью протокола HTTP, который являет-ся транспортной основой всякого Web-взаимодействия.

HTTP является клиент-серверным протоколом прикладного уровня,который работает поверх TCP/IP [34, 39]. В роли HTTP-клиента высту-пает соответствующая компонента Web-браузера или прокси-сервера,которая посылает запрос от имени своего клиента. Особо следует отме-тить, что HTTP – это протокол без сохранения состояния. Это означает,что каждое взаимодействие «запрос-ответ» является абсолютно авто-номным и никак не связано с другими клиентскими запросами, дажеесли серия запросов-ответов выполняется в рамках одного TCP-соединения.

В связи с возможностью использования виртуальных серверов сле-дует различать понятия WWW-сервера и HTTP-сервера. WWW-серверопределяется как пространство документов и иных информационныхресурсов, которые могут быть запрошены клиентом через протоколHTTP. Идентифицируется WWW-сервер доменным именем. HTTP-сервер – это программное средство обслуживания HTTP-запросов, на-

Page 11: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

10

правляемых к одному или нескольким WWW-серверам. HTTP-серверидентифицируется IP-адресом и номером порта.

С учетом сделанного замечания в структуре Web-клиента и Web-сервера иногда удобно выделять соответствующие HTTP-компоненты, врезультате чего структура базовой Web-системы может быть представ-лена в виде рисунка 1.4.

Рис.1.4

1.4. Расширение функциональныхвозможностей Web-сервера

HTTP и HTML, определяя архитектуру Web-систем, имеют суще-ственные ограничения, в результате чего стали проявляться недостаткисервисов, предоставляемых в рамках базовой Web-технологии. Это обу-словлено тем, что Web-сервер способен работать только с наборамистатических документов и поэтому он может обрабатывать только оп-ределенные виды запросов.

Для повышения функциональности Web-сервера используются до-полнительные технологии, называемые расширениями. Расширения нетребуют кардинальной перестройки Web-системы, а включаются в неёестественным образом и реализуются на стороне сервера.

Принцип организации расширений сервера

На рисунке 1.5 показана схема взаимодействия Web-сервера и при-ложения расширения. Как видно из рисунка, данная технология основа-на на включении в структуру сервера средств организации взаимодейст-вия с внешним приложением. Если сервер неспособен сам обработатьзапрос, он отдаёт его приложению расширения.

Page 12: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

11

Рис.1.5

Средства организации взаимодействия с расширением передаютданные HTTP-запроса приложению расширения, при необходимостипредварительно преобразовав эти данные в требуемый формат. Этисредства реализуются как программный интерфейс, обеспечивающийвзаимодействие Web-сервера с внешним приложением по некоторымправилам, определяемым конкретной используемой технологией.

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

В этой системе с позиций клиента приложение расширения факти-чески реализует некоторые дополнительные функции сервера. Такимобразом, появляется возможность подключения к Web-системе некото-рых дополнительных сервисов, которые становятся доступны по запро-сам клиентов.

Рассмотренный подход лежит в основе таких технологий как CGI,WINCGI, ISAPI, NSAPI, Java Servlet, ASP [4, 9, 22, 27, 33].

1.5. Развитие сервис-ориентированной архитектурыи интеграция прикладных систем

В крупной информационной системе обычно функционируетбольшое количество приложений, которые обеспечивают доступ поль-зователям к информационным ресурсам системы, находящимся на сер-верах. Эти ресурсы необходимы пользователям для решения опреде-ленных бизнес-задач.

Page 13: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

12

С другой стороны, пользователь в процессе работы может созда-вать собственную информацию, которая может также выступать в сис-теме как общий информационный ресурс, предназначенный для исполь-зования другими приложениями системы. Но поскольку приложения,выступающие в системе, могут сильно различаться по средствам разра-ботки, по интерфейсам, по средам и платформам, то зачастую интегра-ция информации из этих приложений оказывается трудноразрешимойзадачей.

Одним из движущих мотивов развития концепции сервис-ориентированной архитектуры является использование такой парадиг-мы взаимодействия приложений, которая способствует упрощению ихинтеграции в прикладных системах.

Основным принципом сервис-ориентированной архитектуры явля-ется наличие разрозненных сервисов, которые могут быть предоставле-ны из приложений, созданных различными разработчиками на различ-ных платформах и в различных средах. При этом не ставится задачаувязать все приложения друг с другом, что привело бы к непомерно вы-сокой сложности организации прикладной системы.

Вместо этого создаются специфицированные методы доступа ксервисам и средства публикации сервисов, которые архитектурно опре-деляют виртуальную информационно-коммуникационную среду, своегорода информационную шину, посредством которой взаимодействуютразличные приложения (рис.1.6). При этом всякое взаимодействие меж-ду приложениями представляется как доступ к сервису. В свою очередь,всякий сервис при таком подходе может быть представлен как функ-ционально законченный компонент (объект), выполняющий определен-ную функцию или бизнес-функцию (например, финансовую, админист-ративную либо информационную операцию).

Рис. 1.6

Page 14: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

13

Разделение в системе собственно приложений и предоставляемыхими сервисов придает архитектуре системы свойство объектной ориен-тированности. Это определяет целый ряд положительных качеств архи-тектуры, являющихся следствием принципа организованной сложности[5]. Применение объектного подхода хорошо согласуется с современ-ными принципами объектно-ориентированного проектирования и про-граммирования, позволяя снизить затраты на создание однотипныхкомпонентных сервисов, что повышает экономическую эффективностьинтеграции приложений. Информация, будучи созданной в системеодин раз, становится доступной во всех приложениях системы.

В сервисно-ориентированной архитектуре определенным образомупорядочиваются правила работы с информационным ресурсом, чтопозволяет специфицировать различные виды взаимодействий и упроща-ет сложные процессы навигации в информационном пространстве сис-темы.

Существующие подходы к интеграции сервис-ориентированныхсистем активно используют Web-технологии. Современная фаза разви-тия технологий Web-интеграции основана на широком использованииязыковых средств XML и концепции Web-сервисов и Web-служб (такназываемая Х-фаза Internet) [21, 28, 32].

1.6. Web-интеграция прикладных системна основе XML и Web-служб

Структуризация данных в Web-системах

Взаимодействие компонентов в распределенной системе предпола-гает наличие средств обмена информацией между ними. Одно из реше-ний задачи информационного обмена между приложениями состоит виспользовании двусторонних конверторов, позволяющих осуществлятьвзаимопреобразование форматов данных. Однако в условиях глобализа-ции информационных систем и необходимости интеграции данных ме-жду большим числом приложений такой подход неприемлем.

Современное решение проблемы основывается на создании унифи-цированных промежуточных форматов данных, с помощью которыхосуществляется представление данных, участвующих в обмене междуприложениями. Разработка языка HTML стала важным шагом на путисоздания подобных средств информационного обмена. Однако, с пере-ходом на сервис-ориентированную архитектуру возможностей HTMLдля обеспечения полной информационной совместимости компонентовприкладных систем стало недостаточно.

Page 15: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

14

Дело в том, что HTML был разработан как средство структуриро-ванного доступа к информации для последующего ее представления вграфическом виде. HTML, в основном, ориентирован на форматирова-ние информации, предоставляя средства для оформления передаваемыхдокументов [4, 22, 36]. Содержимое и структура документов, позво-ляющие отразить особенности семантики и расположения данных внут-ри документов, средствами HTML не учитываются. Так, например, кон-струкция <h1>BOOK</h1> легко разбирается парсером Web-браузеракак заголовок. Однако смысловое значение содержимого BOOK в этойязыковой конструкции браузер разобрать не может.

В отличие от HTML, язык XML ориентирован на описание струк-туры данных внутри документов [23, 37, 38]. Он оказался реально оченьэффективным средством создания большого числа решений по обменуданными в прикладных системах.

XML, будучи языком разметки, сам по себе не содержит никакихтегов, предназначенных для разметки, он просто определяет порядок ихследования. Теги XML описывают значение, а не представление выде-ляемой ими части документа. Точные правила языка XML определяют,где именно начинается и где заканчивается определенная структура до-кумента. Эти правила создают четко определенную иерархическуюструктуру XML-документа, что позволяет поэлементно выполнять раз-личные операции над данными. Собственно форма представления XML-документа определяется с помощью расширяемых стилей, позволяю-щих менять внешний вид документа, не затрагивая его содержимого.

XML позволяет также осуществлять контроль за корректностьюданных, хранящихся в документах, производить проверки иерархиче-ских соотношений внутри документа и устанавливать единый стандартна структуру документов, содержимым которых могут быть самые раз-личные данные [25].

XML в настоящее время становится одним из важнейших элемен-тов современных Web-технологий [16, 28]. При использовании XML вWeb-системах взаимодействие между компонентами системы осущест-вляется путем обмена XML-документами. При этом транспортной осно-вой Web-взаимодействия остается протокол HTTP, но в потоке инфор-мации, передаваемой посредством этого протокола, содержатся сведе-ния не только о самих данных, но и об их структуре.

Web-службы как платформадля интеграции сервис-ориентированных систем

Широкое проникновение XML в Web-технологии способствовалопоявлению новых форм, методов и средств интеграции прикладных

Page 16: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

15

систем, называемых общим термином Web-интеграция [6]. XML послу-жил основой для развития новой платформы – Web-служб, в соответст-вии с которой взаимодействие между компонентами осуществляется какудаленный доступ к сервисам (функциям и операциям) через Web. Web-службы, развивая многие идеи компонентных технологий, например,COM/DCOM, позволяют осуществлять взаимодействие приложений,построенных на различных платформах с применением различных ин-струментариев и работающих в различных средах.

Организация прикладных систем с сервис-ориентированной архи-тектурой на базе Web-служб предполагает создание и использованиеWeb-сервисов, определяющих функциональность услуг, предоставляе-мых приложениями [17, 21]. При этом Web-сервис выступает как объ-ект, реализующий один или несколько методов, к которым можно об-ращаться средствами Web из какого-либо приложения.

В настоящее время технология Web-служб базируется на трех ос-новных спецификациях, имеющих статус Web-стандартов:

SOAP (Simple Object Access Protocol) – протокол, определяющийправила взаимодействия с удаленными объектами по Internet-протоко-лам, в частности, по протоколу HTTP;

WSDL (Web Services Description Language) – язык описания про-граммных интерфейсов для Web-служб;

UDDI (Universal Description, Discovery and Integration) – службасправочника для регистрации Web-услуг (сервисов).

Протокол SOAP лежит в основе технологии Web-служб, и посред-ством этого протокола производится отправка и получение XML-сообщений в Web-системах. Спецификация SOAP определяет XML-«конверт» для передачи сообщений, структура которого показана нарисунке 1.7, а также метод для кодирования структур данных в форматеXML и средства связи по протоколу HTTP [24, 28].

Рис. 1.7

Page 17: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

16

Взаимодействие приложений на основе протокола SOAP осуществ-ляется по схеме клиент-сервер с помощью SOAP-сообщений типа за-прос/ответ (рис.1.8). По запросу клиента сервер вызывает на исполнениеметод обработки соответствующего Web-сервиса и возвращает клиентурезультат выполнения.

Рис. 1.8

Для описания методов, предоставляемых конкретным Web-сервисом (то есть его программного интерфейса), создается и делаетсядоступным специальный документ на языке WSDL, являющемся под-множеством языка XML. С этой точки зрения язык WSDL играет ту жероль, что и язык IDL (Interface Definition Language) в распределенныхвычислениях. Описание может включать такую информацию, как про-токол, адрес сервера, номер используемого порта, список доступныхопераций, формат запроса, ответа и т.п.

UDDI предоставляет механизм для обнаружения Web-сервисов всети. С этой целью используются реестры UDDI, в которых регистри-руются Web-сервисы, что позволяет находить их из других приложенийи служб. Реестр UDDI сам является Web-сервисом. Он поддерживаетоперации создания, модификации, удаления и поиска элементов.

Некоторые направления развитиясервис-ориентированных архитектур

Сервис-ориентированный подход к организации прикладных сис-тем на основе Web-служб способствует быстрому совершенствованиюсферы информационных услуг в компьютерных средах подобно тому,как это происходит в других сферах общественного потребления.

Page 18: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

17

Одно из направлений развития этой концепции приводит к инфор-мационным системам нового поколения, основанным на применениипринципов самообслуживания [35]. При этом подходе любой бизнес-процесс представляется как цепочка сервисов. Тогда, используя реестрысервисов, методы доступа к ним и алгоритмы построения бизнес-процессов, можно создавать приложения, которые сами занимаютсявыбором необходимых сервисов и построения из них оптимальных це-почек.

Другое направление в использовании технологии Web-служб ведетк развитию средств консолидированного доступа пользователей черезWeb-интерфейс к информационным корпоративным ресурсам – так на-зываемым корпоративным порталам [3].

Опираясь на технологию Web-служб и язык XML, порталы пре-вращаются из набора разрозненных корпоративных приложений в ком-понентные прикладные системы, представляющие собой набор связан-ных Web-сервисов. От простого доступа к Web-страницам и корпора-тивным базам данных порталы переходят к поддержке средств бизнес-аналитики, интеграции приложений и совместной работы.

Новые концепции и средства позволяют создавать корпоративныеинформационные системы, реализованные по принципу, хорошо из-вестному в торговле, общественном питании и других сферах, когдавнутри предприятия организуются виртуальные сообщества из участни-ков, объединенных общими интересами и бизнес-целями. Это обеспе-чивает превращение информационного пространства предприятия врабочее пространство для сотрудничества.

Page 19: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

18

2. ОРГАНИЗАЦИЯ ВЗАИМОДЕЙСТВИЙ НА ОСНОВЕПРОТОКОЛА HTTP

2.1. Простейший Web-клиент

Протокол HTTP работает по принципу простого взаимодействиязапрос/ответ, и процесс загрузки Web-клиентом (в частности Web-браузером) HTML-документа с Web-сервера представляет последова-тельность таких «простейших» взаимодействий (рис. 2.1) [39].

Рис. 2.1

Клиент, в качестве которого может выступать стандартный Web-браузер, посылает HTTP-запрос на необходимый ему документ. Серверобрабатывает запрос и возвращает требуемый HTML-документ в телеHTTP-ответа клиенту, и последний начинает его разбор и анализ. Походу анализа клиент может определить, что в документе имеются теги,указывающие на наличие в нём встроенных изображений, анимаций,исполняемых объектов и т.п. Чтобы получить, к примеру, встроенноеизображение, клиент извлекает из соответствующего тега идентифика-тор требуемой картинки и делает очередной запрос серверу.

В общем случае встроенные объекты не обязаны находиться на томже сервере, с которого принимается основной документ. В теге можетприсутствовать ссылка на любой другой Web-сервер. Добравшись доконца документа, клиент в итоге генерирует цепочку HTTP-запросов ксерверам. Собрав ответы на все запросы, клиент получает все необхо-

Page 20: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

19

димые данные для полноценного графического представления HTML-документа.

Ниже показано, как можно программно реализовать в среде BorlandDelphi 6 клиентскую часть «простейшего» HTTP- взаимодействия. Соз-даваемая программа способна закачивать с сервера простые HTML-страницы (без встроенных изображений и других объектов) и отобра-жать их в текстовом виде. Общая логика работы программного модуляопределяется схемой, представленной на рисунке 2.2.

Рис. 2.2

Чтобы нагляднее продемонстрировать HTTP-взаимодействие, впрограммном модуле используется низкоуровневый компонентTClientSocket, отвечающий за работу по протоколу TCP/IP [29].

Для программирования соответствующего приложения создадим всреде Delphi 6 проект. Добавим на главную форму компонентыTLaleledEdit, TButton, TRichEdit, TClientSocket и оформим их так, какпоказано на рисунке 2.3. В свойство Text компонента TLabeledEditможно заранее записать URL страницы, которая будет загружаться.

Рис. 2.3.

Page 21: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

20

Необходимо также добавить несколько обработчиков событий (длякомпонента типа TButton - обработчик события OnClick, для компонен-та TClientSocket - обработчики OnConnect, OnError, OnRead) и запол-нить их соответствующим кодом. Полный текст программного модуля,за исключением некоторых несущественных деталей, представлен влистинге 2.1.

Листинг 2.1

// Простой Web клиент.// Позволяет задать страницу в формате,// соответствующем протоколу HTTP// (servername[/pagename]).// Указанную страницу можно загрузить,// отобразив её HTML-текст в мемо-поле главной// формыunit MainUn;

interface

usesWindows, Messages, SysUtils, Classes, Graphics,Controls, Forms, Dialogs, OleCtrls, SHDocVw,Mask, StdCtrls, ExtCtrls, ComCtrls, ScktComp;

type // Главная форма программы TMainF = class(TForm)

// Компонент, отвечающий за работу по //протоколу TCP/IP

ClientSocket: TClientSocket; // Компонент для отображения текста //загружаемой страницы

HtmlRE: TRichEdit; // Поле редактирования адреса

AddressLE: TLabeledEdit; // Кнопка активации процесса загрузки LoadB: TButton; StatusBar1: TStatusBar; procedure LoadBClick(Sender: TObject); procedure ClientSocketRead(Sender: TObject;

Socket: TCustomWinSocket);

Page 22: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

21

procedure ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); public // Название страницы PageName:String; // Адрес сервера HostName:String; // Выделить адрес сервера из URL function GetHostName(Astr:String):String; // Выделить название страницы из URL function GetPageName(AStr:String):String; end;var MainF: TMainF;

implementation{$R *.DFM}

{ TMainF }

procedure TMainF.LoadBClick(Sender: TObject);begin ClientSocket.Close; // Получить имя хоста HostName:=GetHostName(AddressLE.Text); // Получить название страницы PageName:=GetPageName(AddressLE.Text); ClientSocket.Host:=HostName; // Попытка установить соединение ClientSocket.Open;end;

procedure TMainF.ClientSocketRead(Sender: TOb-ject; Socket: TCustomWinSocket);

begin // Чтение текста должно происходить только // в обработчике события, // так как большие страницы передаются

Page 23: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

22

// несколькими пакетами и // принудительное чтение может привести к // потере данных HtmlRE.Text:=HtmlRE.Text+Socket.ReceiveText;end;

procedure TMainF.ClientSocketConnect(Sender:TObject; Socket: TCustomWinSocket);var HttpGetStr:string;beginwith Socket do begin // Формируется строка запроса // метод HttpGetStr:='GET /'+PageName+' HTTP/1.1'+#$0D+#$0A; // хост (обязательный параметр) HttpGetStr:=HttpGetStr+'Host: client'+#$0D+#$0A; // пустая строка - признак окончания //запроса HttpGetStr:=HttpGetStr+#$0D+#$0A; // Послать запрос серверу SendText(HttpGetStr); //------------------------- end;end;

procedure TMainF.ClientSocketError(Sender:TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);begin

Socket.Close;MessageDlg(Format('Произошла ошибка сокета кодсобытия:%d код ошибки %d', [inte-ger(ErrorEvent),ErrorCode]),mtError,[mbOK],0);

end;

end.

Page 24: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

23

Работа с программным модулем осуществляется следующим обра-зом. После запуска программы необходимо ввести URL требуемойстраницы и нажать кнопку «Загрузить». По нажатию кнопки активиру-ется обработчик события OnClick. При этом из введённого URL выде-ляется название Web-сервера, которое записывается в свойство Hostкомпонента ClientSocket, а также название страницы на сервере, запи-сываемое в поле PageName.

Затем идёт вызов метода ClientSocket.Open( ), в котором активиру-ется API сокетов и происходит попытка установки TCP/IP соединения.Если попытка удачна и соединение установлено, будет вызван обра-ботчик события ClientSocket.OnConnect. В нём генерируется строкаHTTP-запроса с использованием свойства PageName. В методе Client-Socket.SendText( ) происходит посылка запроса серверу. Web-сервер,получив и обработав запрос, отсылает HTTP-ответ, содержащий тексттребуемой HTML-страницы.

Компонент ClientSocket определяет, что появились данные, дос-тупные для чтения, и генерирует событие OnRead. В коде обработчикаTMainF.ClientSocketRead( ) данного события вызывается метод приёмаданных ReceiveText( ) и производится их отображение в компонентеHtmlRe (рис. 2.4).

В тексте программы предусмотрено наличие обработчика событияOnError, которое генерируется, если во время работы компонентаTClientSocket происходит ошибка API сокетов. В коде обработчика вы-зывается принудительный разрыв соединения.

Рис. 2.4

Page 25: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

24

2.2. Принципы организации Web-сервера

Простой Web-сервер

Взаимодействие со стороны Web-сервера определяется общим ал-горитмом его работы [12]: 1) ожидание инициации клиентом установки соединения; 2) приём HTTP-запроса; 3) обработка запроса и посылка клиенту HTTP ответа.

Вначале создадим программный модуль Web-сервера, который налюбой запрос возвращает единственную заранее заданную страницу.Кроме этого, разрабатываемый сервер будет отображать лог обменасообщениями с клиентом и список подключившихся клиентов.

Главная форма программы показана на рисунке 2.5. В верхней об-ласти формы расположено поле ввода для указания запрашиваемойстраницы и кнопка запуска/останова сервера. Ниже расположен компо-нент TListBox для отображения клиентов, подключившихся к серверу, икомпонент TRichEdit для показа лога HTTP-сообщений.

Рис. 2.5

На форме также имеется два невизуальных компонента:TOpenDialog – диалог выбора файла c HTML-документом,TServerSocket – реализация серверной части API-сокетов. Если свойст-во Active компонента TServerSocket установлено в True, то он начинаетслушать сеть по порту, указанному в свойстве Port. Ключевые фраг-менты программного кода Web-сервера представлены в листинге 2.2.

Листинг 2.2

// Пример, демонстрирующий принцип работы Web-// сервера. Программа принимает запрос// браузера и отдаёт страницу, указанную как

Page 26: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

25

// начальная. При этом обновляется список// соединений. Имеется также простейшая// обработка ошибок.

Unit MainUn;uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Mask, StdCtrls, ComCtrls, ExtCtrls, Buttons, ScktComp, Syncobjs;

type TMainF = class(TForm) Panel1: TPanel; StatusBar1: TStatusBar; Panel2: TPanel; Splitter1: TSplitter; // Запуск/Останов сервера StartB: TBitBtn; // Отвечает за работу по протоколу TCP/IP ServerS: TServerSocket; Panel3: TPanel; // Список клиентов ClientsLB: TListBox; Label1: TLabel; // Поле выбора начальной страницы StartPageEd: TEdit; FOpenSB: TSpeedButton; StartPageOD: TOpenDialog; // Компонент для отображения лога LogRE: TRichEdit; procedure FOpenSBClick(Sender: TObject); private // Состояние сервера: запущен или //остановен isRunning:Boolean; published // Нажата кнопка старта сервера procedure StartBClick(Sender: TObject); procedure FormCreate(Sender: TObject); // Клиент устанавливает соединение procedure ServerSClientConnect(Sender: TObject; Socket: TCustomWinSocket);

Page 27: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

26

// Клиент разрывает соединение procedure ServerSClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); // Имеются данные для чтения procedure ServerSClientRead(Sender: TObject; Socket: TCustomWinSocket); // Обработчик ошибок procedure ServerSClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); end;

var MainF: TMainF;

implementation

{$R *.DFM}

procedure TMainF.StartBClick(Sender: TObject);begin isRunning:= not isRunning; // Если сервер запущен, то активировать сокет if isRunning then begin StartB.Caption:='СТОП'; LogRE.Lines.Add('Сервер запущен'+#$0D+#$0A); ServerS.Open; end else// Иначе прекратить прослушивать begin StartB.Caption:='СТАРТ'; LogRE.Lines.Add('Сервер остановлен'+#$0D+#$0A); ServerS.Close; end;end;

procedure TMainF.FormCreate(Sender: TObject);begin

Page 28: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

27

LogRe.Clear; LogRE.Lines.Add('Демонстрационный Web сервер.'#$0D+#$0A); isRunning:=false;end;

procedure TMainF.ServerSClientConnect(Sender:TObject; Socket: TCustomWinSocket);begin // Отобразить лог и добавить строку в список //соединений LogRE.Lines.Add('Соединение с клиентом '+Socket.RemoteHost+' установлено'+#$0D+#$0A); ClientsLB.Items.Add('Хост:Socket.RemoteHost+', Адрес:'+Socket.RemoteAddress);end;

procedure TMainF.ServerSClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);begin // Отобразить лог и удалить строку из списка //соединений LogRE.Lines.Add('Соединение с клиентом '+Socket.RemoteHost+' разорвано'+#$0D+#$0A);

Cli-entsLB.Items.Delete(ClientsLB.Items.IndexOf('Хост:'+Socket.RemoteHost+',Адрес:'+Socket.RemoteAddress))

end;

procedure TMainF.ServerSClientRead(Sender:TObject; Socket: TCustomWinSocket);Var // Поток, из которого будет читаться // отдаваемая клиенту страница SourceStream:TFileStream; f:File; str,size:String;begin with Socket do begin // Получить запрос от клиента LogRE.Lines.Add('---------------Запрос клиента--------------

Page 29: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

28

'+#$0D+#$0A+Socket.ReceiveText); // Создать файловый поток if SysUtils.FileExists(StartPageOD.FileName) then begin SourceStream:=TFileStream.Create( StartPageOD.FileName,fmOpenRead); end else begin LogRe.Lines.Add('Страница не найдена'); exit; end; // Отправить ответ // Код состояния str:='HTTP/1.0 200 OK'+#$0D+#$0A; str:=str+'Server: Demo WebServer/1.0'+#$0D+#$0A; str:=str+'Connection: Keep-Alive'+#$0D+#$0A; str:=str+'Content-Type: text/html'+#$0D+#$0A; str:=str+'Content-Length: '+IntToStr(SourceStream.size)+#$0D+#$0A; str:=str+#$0D+#$0A; SendText(str); LogRE.Lines.Add('---------------Ответ сервера--------------'+#$0D+#$0A+str); // Тело SendStream(SourceStream); end;end;

procedure TMainF.FOpenSBClick(Sender: TObject);begin if StartPageOD.Execute then StartPageEd.Text:=StartPageOD.FileName;end;

end.

Работа сервера начинается с указания в поле редактирования(TEdit) полного пути к файлу HTML-документа, который он будет воз-вращать клиентам. Затем необходимо нажать кнопку СТАРТ, после чего

Page 30: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

29

активизируется обработчик TMainF.StartBClick соответствующего со-бытия, в котором вызывается метод ServerS.Open( ), и сокет начинаетпрослушивать сеть. В момент, когда клиент устанавливает соединение ссервером, происходит событие OnClientConnect и вызывается соответ-ствующий обработчик TMainF.ServerSClientConnect( ). В указанном об-работчике извлекаются имя хоста клиента и его IP-адрес, после чегодобавляется соответствующая строка в список клиентов. По событиюOnClientDisconnect происходит удаление из списка этой строки.

Обработка запроса клиента выполняется в методеTMainF.ServerSClientRead( ), вызываемом по событию OnClientRead.При этом cначала идёт приём запроса клиента:

LogRE.Lines.Add('---------------Запрос клиента—------------'+#$0D+#$0A+Socket.ReceiveText).

Поскольку разбор запроса не производится, он просто выводится вмемо-поле лога и далее никак не используется сервером. Затем создаёт-ся файловый поток для документа, который будет отдан клиенту:

SourceStream:=TFileStream.Create(StartPageOD.FileName,fmOpenRead);

Далее формируется строка HTTP-ответа. Здесь важно правильноуказать тип содержимого (Content-Type) и его размер (Content-Length)для того, чтобы клиент имел возможность верной интерпретации от-вета [26]:

str:='HTTP/1.0 200 OK'+#$0D+#$0A; str:=str+'Server: Demo WebServer/1.0' +#$0D+#$0A; str:=str+'Connection: Keep-Alive'+#$0D+#$0A; str:=str+'Content-Type: text/html'+#$0D+#$0A; str:=str+'Content-Length: '+IntToStr(SourceStream.size)+#$0D+#$0A; str:=str+#$0D+#$0A;

И наконец, посылается заголовок и тело ответа, а также отображе-ние лога:

SendText(str); LogRE.Lines.Add('---------------Ответ сервера- -------------'+#$0D+#$0A+str); SendStream(SourceStream);

Page 31: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

30

Результат работы программы показан на рисунке 2.6.

Рис. 2.6

Простой Web-сервер с дополнительными возможностями

Для того, чтобы сервер был способен возвращать клиенту произ-вольные документы, необходимо в программном модуле сервера сде-лать ряд изменений. Во-первых, надо добавить процедуру разбораHTTP-запроса и выделения из него названия страницы. Во-вторых,нужно организовать службу каталогов сервера, поскольку в относитель-ных гиперссылках указывается путь от корневой директории сервера.Когда сервер выделяет название страницы из запроса, он должен иметьсвоеобразную точку входа, относительной которой он будет искатьтребуемый документ. В службу каталогов сервера могут входить папкидля размещения скриптов, приложений CGI, ISAPI и т.д.

Главная форма проекта Web-сервера с дополнительной возможно-стью представлена на рисунке 2.7, из которого видно, что интерфейспрактически не изменился. Единственное, что добавлено, - это полеввода для указания корневого каталога сервера.

Page 32: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

31

Рис. 2.7

Рассмотрим общий алгоритм работы сервера. После указания на-чальной страницы и корневого каталога необходимо нажать кнопкуСТАРТ. В результате активизируется обработчик нажатия кнопки, икомпонент TServerSocket начинает прослушивать сеть. После установ-ления соединения с клиентом и приёма запроса сервер не отсылает кли-енту ответ со страницей по умолчанию, а начинает выполнять следую-щий код:

FileName:=GetRequestFileName(Request);// Если требуется начальная страницаif FileName='' thenbegin// Создать файловый потокSourceStream:=TFileStream.Create(FileOD.FileName,fmOpenRead);end// если запрошен конкретный документelsebegin// Заменить все вхождения '%20' на пробелFileName:=ReplaceSpaces(FileName);// Создать файловый потокSourceStream:=TFileStream.Create(DirOD.InitialDir+FileName,fmOpenRead);end;

Наиболее важным здесь является вызов функции GetRequest-FileName, в которой из запроса выделяется название документа. Еслиеё значение - пустая строка, значит, необходимо вернуть документ поумолчанию. Если значение функции - не пустая строка, значит, требует-ся конкретный документ сервера.

Page 33: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

32

Поскольку протокол HTTP не предусматривает возможности вхож-дения символов пробела в название файла, Web-браузер, пославшийзапрос, автоматически заменяет их на комбинацию символов %20. Вфункции ReplaceSpaces( ) производится обратное преобразование и вос-становление исходного названия документа. После этого название до-кумента объединяется с корневой директорией, и по полному именифайла создается соответствующий файловый поток. Далее программаработает по аналогии с модулем для простого Web-сервера.

Для работы запустим созданный программный модуль сервера. Ус-тановим некоторую корневую директорию RootDir. Укажем в качественачальной страницы файл Test_Page.html, текст которого приведён ни-же (листинг 2.3).

Листинг 2.3

<HTML> <HEAD> <TITLE>Тестовая страница демонстрационного Web-сервера </TITLE> </HEAD> <BODY> <CENTER> <H1>Добро пожаловать на тестовую страницу! </H1> <BR> <A href="Test page2.html"> Ссылка на страницу Test page2.html демонстрирует дополнительные возможности программы </A> <p><IMG SRC="/images/Image.jpg"> </CENTER> </BODY></HTML>

В этом тексте имеется одна относительная гиперссылка и одно изо-бражение. Документ Test_Page2.html должен находится в директорииRootDir, изображение Image.jpg - в директории RootDir+’/images’.

Теперь, если из браузера (например, Internet Explorer) обратиться ксозданному серверу (указав его DNS-имя, IP-адрес или имя NetBIOS влокальной сети), страница с изображением будет загружена и отобра-жена в окне браузера.

Page 34: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

33

Ниже приведён лог обмена HTTP-сообщениями между клиентом исервером (листинг 2.4), который отражает схему загрузки страницы.

Листинг 2.4

---------------Запрос клиента--------------GET / HTTP/1.1Accept: application/vnd.ms-powerpoint,application/vnd.ms-excel, application/msword,image/gif, image/x-xbitmap, image/jpeg,image/pjpeg, */*Accept-Language: ruAccept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 5.01;Windows 98)Host: sergConnection: Keep-Alive

---------------Ответ сервера--------------HTTP/1.0 200 OKServer: Demo WebServer/1.0Connection: Keep-AliveContent-Type: text/htmlContent-Length: 420

---------------Запрос клиента--------------GET /images/Image.jpg HTTP/1.1Accept: */*Referer: http://serg/Accept-Language: ruAccept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 5.01;Windows 98)Host: sergConnection: Keep-Alive

---------------Ответ сервера--------------HTTP/1.0 200 OKServer: Demo WebServer/1.0Connection: Keep-AliveContent-Type: text/htmlContent-Length: 41388

Page 35: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

34

2.3. Организация взаимодействийв Web-системах через прокси-сервер

Прямое HTTP-взаимодействие между клиентом и сервером пред-ставляет собой простейший случай. В реальности же часто приходитсясталкиваться с так называемыми процессами посредниками: заместите-лями, шлюзами, туннелями [39]. Так, процесс-заместитель (в дальней-шем прокси-сервер) довольно часто используется в Web-системах дляобеспечения доступа в Internet/intranet нескольким компьютерам с одно-го IP-адреса, а также для фильтрации документов, приходящих из сети.Общая схема Web-системы с таким сервером представлена на рисун-ке 2.8.

Рис. 2.8

Клиентские программы не способны напрямую, обратиться квнешней сети Internet/intranet, поскольку не имеют c ней прямого со-единения. Все клиенты подключены через локальную сеть к компьюте-ру, на котором устанавливается программа прокси-сервера. Все своизапросы клиентские приложения посылают ей. При этом в HTTP-запросе обязательно должен быть полный URL документа, даже еслизакачивается страница по умолчанию. Прокси-сервер последовательноили параллельно обрабатывает запросы и отправляет их соответствую-щим Web-серверам от своего имени. Получая HTTP-ответы, прокси-сервер по внутренней информационной базе определяет клиента, отпра-вившего запрос на определенный документ, после чего отдает ему этотдокумент.

Отметим, что несмотря на появление программы-посредника, ни-где не нарушена логика HTTP-взаимодействий. И клиенты, и серверыфункционируют так, как если бы прокси-сервера не было. Кроме того,при разборе HTTP-запросов и ответов прокси-сервер может произво-дить дополнительную обработку (разбор, фильтрацию и т.п.).

Page 36: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

35

Создадим теперь простой прокси-сервер со следующим алгорит-мом работы:

1) приём HTTP-запроса клиента;2) переадресация HTTP-запроса Web-серверу;3) приём HTTP-ответа Web-сервера;4) обработка HTTP-ответа (отображение содержимого ответа в

визуальном компоненте);5) посылка HTTP-ответа клиенту.Главная форма программы представлена на рисунке 2.9. Она доста-

точно проста и содержит всего два компонента: TRichEdit иTServerSocket. TRichEdit будет использоваться для отображения лога.TServerSocket будет обрабатывать запросы клиентов и устанавливатьTCP/IP соединение. Этому компоненту необходимо установить свойст-во Port, например, 2002.

В листинге 2.5 приведен исходный код программного модуля.

Рис. 2.9

Листинг 2.5

unit MainUn;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, StdCtrls, ComCtrls, Psock, NMHttp;

type // Главная форма TMainF = class(TForm)

// Отвечает за работу по протоколу TCP/IP ServerSocket: TServerSocket;

LogRE: TRichEdit; // Показ лога procedure FormCreate(Sender: TObject); procedure ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);

Page 37: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

36

privateprocedure SocketEvent(Sender: TObject; Socket:TCustomWinSocket;SocketEvent: TSocketEvent);

end;

// Заменяет в строке символы %20 на пробелы function ReplaceSpaces(str:String):String; // Извлечь имя файла из HTTP запроса function GetRequestFileName( ARequest:String):String;

var MainF: TMainF;implementation

{$R *.dfm}procedure TMainF.ServerSocketClientConnect(Sender:TObject; Socket: TCustomWinSocket);begin LogRE.Lines.Add('Поключен новый клиент '+Socket.RemoteHost+#$0D+#$0A); Socket.OnSocketEvent:=SocketEvent;end;

procedure TMainF.SocketEvent(Sender: TObject;Socket: TCustomWinSocket;SocketEvent: TSocketEvent);var // Страница, на которую пришёл запрос клиента PageName : String; NMHTTP : TNMHTTP;begin case SocketEvent of // Доступны данные для чтения seRead: begin

// Получить название требуемой страницы // Считать, что все запросы типа GET PageName := GetRequestFileName( Socket.ReceiveText); NMHTTP := TNMHTTP.Create(nil); NMHTTP.Get(PageName); // Обработка принятого документа

LogRe.Lines.Add('Принят документ'+PageName+'. Клиент: '+

Page 38: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

37

Socket.RemoteHost+#$0D+#$0A);LogRe.Lines.Add('Ответ Web сервера:

'+NMHTTP.RemoteIP+#$0D+#$0A); // Анализ типа принятого документа

// Обрабатывать его только в том случае,//если Content-type = text/html

LogRe.Lines.Add(NMHTTP.Header); LogRe.Lines.Add('Тело документа' +Socket.RemoteHost+#$0D+#$0A); LogRe.Lines.Add(NMHTTP.Body); // Отдать полученный документ клиенту Socket.SendText( NMHTTP.Header+#$0D+#$0A); Socket.SendText(NMHTTP.BODY); NMHTTP.Free; end; end;end;

end.

В этой программе важную роль играет обработчикTMainF.ServerSocketClientConnect( )

события OnClientConnect. Это событие происходит, когда клиентскийсокет посылает запрос на соединение. TServerSocket принимает запрос,создаёт объект класса TСustomWinSocket и связывает его с клиентом.Таким образом, фактически код, отвечающий за соединение, инкапсу-лирован в классе TCustomWinSocket. У этого класса есть событие On-SocketEvent, которое происходит в случае, когда класс получает уве-домления Windows о событиях сокета. В обработчик события

TSocketEventEvent = procedure (Sender: TObject;Socket: TCustomWinSocket; SocketEvent: TSocketE-vent) of object

кроме самого сокета передается параметр типа TSocketEvent, иденти-фицирующий событие, которое произошло.

Если обратиться к коду обработчика TMainF.SocketEvent( ), томожно увидеть, что метод выполняется только тогда, когда значениеSocketEvent равно seRead, то есть имеются доступные для чтения дан-ные. В этом случае принимается текст запроса клиента и из него извле-кается полный адрес документа:PageName := GetRequestFileName(Socket.ReceiveText);

Page 39: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

38

Уже на этом этапе может быть произведена предварительная обра-ботка, например фильтрация адресов.

В программе используется компонент класса TNMHTTP, представ-ляющий собой «высокоуровневый» HTTP-клиент. Данный компонентинкапсулирует код, необходимый для установки соединения поTCP/IP, а так же код работы по протоколу HTTP. Вызовом метода NMHTTP.Get( ) требуемая страница загружается сWeb-сервера, после чего может производиться анализ и обработка до-кумента. Например, можно определить, что страница содержит недо-пустимые данные и вместо неё отослать клиенту документ с соответст-вующим информационным сообщением. В программе для упрощениявместо полноценной обработки происходит отображение документа вмемо-поле. После анализа и обработки NMHTTP отсылает страницуклиенту.

Работу с созданной программой прокси-сервера можно провести вследующем порядке.

1. Установить на компьютере Web-сервер, например, MicrosoftPWS (Personal Web Server). Указать серверу в качестве начальной про-стую HTML-страницу (без встроенных объектов, изображений, фреймови т.п.), например, взяв за основу листинг 2.6.

2. Запустить программу прокси-сервер.3. Изменить настройки Web-браузера. При использовании браузера

Microsoft IE (например, версии 5) выбрать пункт меню Tools/InternetOptions. В появившемся диалоге выбрать вкладку Connections. По кноп-ке LAN Settings открыть диалог настроек работы через локальную сеть.Здесь требуется установить флажок Use a proxy Server (использоватьпрокси-сервер), указать в поле address адрес компьютера, на которомустановлена программа прокси-сервера, в поле port указать номер пор-та, по которому работает прокси-сервер, и, возможно, потребуется снятьфлажок By pass proxy server for local addresses (Не использовать прокси-сервер для локальных адресов).

4. Ввести адрес Web-сервера PWS в браузер и загрузить страницу.При этом в мемо-поле программы прокси-сервера должны отобразитьсялог и текст принятой HTML-страницы (рис. 2.10).

Листинг 2.6

<HTML> <HEAD> <TITLE>Тестовая страница для демонстрационного Web сервера </TITLE>

Page 40: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

39

</HEAD> <BODY> <CENTER> <H1>Добро пожаловать на тестовую страницу! </H1> <BR> <A href="Test page2.html">Ссылка на страницу Test page2.html демонстрирует дополнительные возможности программы</A> </CENTER> </BODY></HTML>

Рис. 2.10

Несмотря на простоту логики протокола HTTP, он тем не менее позво-ляет реализовывать достаточно сложные виды взаимодействия в Web-cистемах, и до настоящего времени этот протокол остается основопола-гающим в Internet-технологиях.

Page 41: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

40

3. РАСШИРЕНИЯ КАК СРЕДСТВО ПОВЫШЕНИЯФУНКЦИОНАЛЬНОСТИ WEB-СЕРВЕРА

3.1. Общее описание расширений

В настоящее время используется целый ряд технологий расшире-ния Web-сервера, среди которых получили широкое распространениеCGI (Common Gateway Interface), ISAPI (Internet Server API), ASP (Ac-tive Server Pages).

Интерфейс CGI был одним из первых средств интеграции Web-серверов и отдельных приложений, и в настоящее время эта специфика-ция является одной из наиболее популярных [33]. Этот интерфейс под-держивают практически все Web-серверы. CGI-приложение может соз-даваться с использованием любого языка и средства разработки и опре-деляется только используемой платформой, поскольку оно запускаетсякак автономный процесс.

Достоинством Web-приложений с использованием CGI является ихотносительно высокая надежность и безопасность для Web-сервера.Однако при обработке большого количества запросов Web-сервер ис-пытывает значительные нагрузки, так как для каждого запроса необхо-димо отдельно запускать CGI-приложение. К тому же в СGI-приложениях отсутствует возможность взаимодействия с данными, по-ступающими от других запущенных приложений и Web-сервера (кромепеременных окружения), что не позволяет создавать достаточно мас-штабные и сложные проекты.

Интерфейс ISAPI разработан корпорацией Microsoft для своего ин-формационного сервера Internet (Internet Information Server – IIS). Кромеэтого продукта, данный интерфейс поддерживает также MicrosoftPersonal Web Server (PWS).

ISAPI-приложение – это библиотеки dll, экспортирующие наборопределенных функций, используемых для взаимодействия сервера срасширением. В отличие от CGI-расширения, сервер выполняет ISAPI-приложение в рамках собственного процесса. Вместо передачи инфор-мации между сервером и приложением расширения в виде файлов (сиспользованием средств файловой системы) производится обмен дан-ными через память в пределах одного и того же адресного пространства.Благодаря этому расширения стали работать быстрее, с большей эффек-тивностью и меньшим потреблением ресурсов [15].

Page 42: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

41

ISAPI позволяет создавать многопользовательские приложения, чтоособенно важно при разработке соответствующих приложений, взаимо-действующих с базами данных и имеющих сложную логику. Главныйнедостаток ISAPI в том, что данный интерфейс поддерживается исклю-чительно серверами MS IIS и MS PWS, а некорректная работа ISAPI-приложения может стать причиной сбоя в работе всего Web-сервера.

ASP – это технология от Microsoft, позволяющая также разрабаты-вать приложения для серверов WWW. ASP работает на серверах IIS иPWS и позволяет подключать программы к Web-страницам. В основеASP лежит использование простого скриптового языка (Visual BasicScript или Java Script) и возможность подключения внешних COM-компонент [9].

Технология ASP имеет ряд достоинств. Во-первых, текст скриптане передается клиенту, что ограничивает возможность несанкциониро-ванного использования программного продукта. Во-вторых, в отличиеот CGI- и ISAPI-расширений, скрипты проще разрабатывать и отлажи-вать. К тому же интерпретатор отслеживает все ошибки скрипта, что вслучае сбоя не приведет к нарушению работы сервера.

К недостаткам ASP можно отнести то, что подобно ISAPI, эта тех-нология поддерживается только в продуктах компании Microsoft. Так-же имеет смысл упомянуть об относительно медленной скорости вы-полнения скрипта, связанной с использованием интерпретатора.

Среди различных типов расширений нет явного лидера. Поэтому напрактике выбор расширения обычно определяется личными предпочте-ниями группы разработчиков и требованиями выполняемого проекта.Тем не менее, на практике при разработке глобальных прикладных сис-тем во многих случаях предпочтение отдается технологии CGI ввиду еемежплатформенного характера.

3.2. Использование интерфейса CGI

Общее описание CGI

При использовании интерфейса CGI в роли серверной части высту-пают Web-сервер и CGI-приложение, которое осуществляет обработкуполученных от клиента данных и формирование ответа в форматеHTML. CGI-приложение реализуется в соответствии со спецификациейCGI. Задачей Web-сервера является запуск CGI-приложения и передачаданных от клиента этому приложению и обратно.

На стороне клиента генерируется запрос к CGI-приложению. Еслив роли клиента выступает Web-браузер, то запрос может быть воспри-нят из поля ввода адреса в виде URL или из загруженной на данный

Page 43: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

42

момент HTML-страницы. Браузер преобразует запрос CGI в HTTP-запрос и отсылает его серверу.

Web-сервер, получив запрос, извлекает из пути, указанном в запро-се, имя CGI-приложения и запускает это приложение в отдельном про-цессе операционной системы. Запущенное приложение анализируетпереданный сервером запрос и в соответствии с внутренней логикойвыдает HTTP-заголовок, который и возвращается клиенту Web-сервером.

Время жизни CGI-программы ограничено временем обслуживанияпользовательского запроса, так что по окончании его выполнения про-цесс завершается. При этом для каждого отдельного запроса запускает-ся копия CGI-приложения.

Запросы к CGI-расширению

Для интерактивной работы с клиентом CGI-приложение должнополучить некоторую информацию (например, строку поиска). В стан-дарте CGI определено два метода, именуемых GET и POST по аналогиис соответствующими запросами протокола HTTP.

Метод запроса GET определяет правила передачи данных черезкомандную строку. В методе запроса POST для передачи данных ис-пользуется входной поток CGI-приложения. Метод, которым осуществ-ляется запрос, определяется в HTML-странице.

При методе GET запрос передается, как часть URL. Со стороныклиента строка запроса выглядит как http://host/cgi-bin/program.exe/pathname?name1=value1&name2=value2…, где

host – имя машины, к которой обращается клиент;/cgi-bin/program.exe – путь к файлу запрашиваемого CGI-

приложения;pathname – часть пути, расположенная между именем приложения

и строкой запроса, называемая также дополнительным или виртуаль-ным путем;

name1, name 2, … – имя передаваемого аргумента;value1, value 2, … – значение передаваемого аргумента.Список аргументов запроса отделяется от пути знаком вопроса “?”.

Аргументы разделяются знаком амперсанта “&”.Все имена и значения кодируются в соответствии со стандартом

кодирования ASCII. Все пробелы заменяются знаком “+”, а служебныесимволы и символы с кодом больше 128 заменяются на символ “%” иследующий за ним шестнадцатеричный код символа.

Сервер, получив такой URL, извлекает имя CGI-приложения, за-пускает это приложение и передает запрос в командной строке. Сервер

Page 44: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

43

также помещает список аргументов и их значений в переменную окру-жения QUERY_STRING, а виртуальный путь – в PATH_INFO.

Командная строка выглядит следующим образом: собственный URL в качестве нулевого аргумента; виртуальный путь в качестве первого аргумента командной стро-

ки; список аргументов в виде <имя>=<значение>.

CGI-расширение может извлечь запрос из переменной окруженияQUERY_STRING.

Существенным недостатком данного метода является ограничениена количество передаваемых данных – оно ограничено 255 символами,что может быть недостаточно для ряда ситуаций.

В отличие от метода GET, метод POST не накладывает ограниче-ний на объем информации, передаваемой от клиента к приложению.Размер передаваемых записывается в переменной окруженияCONTENT_LENGTH. Список аргументов и их значений передается вформате, аналогичном способу, используемому при передаче по методуGET. В остальном формат запроса по методу POST аналогичен форматузапроса по методу GET [33].

Взаимодействие CGI-приложения с Web-сервером

CGI-приложение является, по сути, обычным консольным прило-жением. Все взаимодействие с сервером реализуется через стандартныесредства операционной системы, на которой выполняются сервер иCGI-приложение.

Согласно стандарту CGI, приложение может взаимодействовать сWeb-сервером, используя четыре механизма обмена данными (рис.3.1).К этим механизмам относятся:

переменные среды; формат командной строки; формат стандартного ввода; формат стандартного вывода.Все эти механизмы поддерживаются операционной системой, бла-

годаря чему разработчикам серверов и Web-приложений не требуютсяспециальные средства (вроде дополнительных библиотек функций) дляорганизации взаимодействий.

Page 45: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

44

Рис 3.1.

Сервер предоставляет CGI-приложению разнообразную информа-цию, которая находится в переменных окружения. Эти переменныеможно разбить на группы.

Общие переменные – различная информация о сервере, на кото-ром исполняется приложение, например, SERVER_NAME – имя хоста,на котором запущен сервер.

Запрос-ориентированные переменные – информация, касающаясязапроса к приложению, например:

REQUEST_METHOD – метод запроса, который был использован(GET или POST);

CONTENT_LENGTH – длина данных, которые передает клиент ме-тодом POST.

Переменные идентификации пользователя и его машины, напри-мер, REMOTE_HOST – символическое имя удаленной машины, произ-водящей запрос.

CGI-приложение осуществляет свой вывод в стандартный выход-ной поток. Этот вывод может представлять собой или документ, сгене-рированный приложением, или инструкции серверу, где получить необ-ходимый документ.

Вывод приложения начинается с маленького заголовка. Он содер-жит текстовые строки в том же формате, что и в заголовке HTTP, и за-вершается пустой строкой (содержащей только символ перевода строкиили CR/LF).

Page 46: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

45

Любые строки заголовка, не являющиеся директивами сервера, по-сылаются непосредственно клиенту. В настоящий момент специфика-ция CGI определяет три директивы сервера:

Content-type. MIME тип возвращаемого документа. Это можетбыть, например, text/html, если отсылается HTML-страница.

Location. Это поле используется в случае, когда необходимо ука-зать серверу, что возвращается не сам документ, а ссылка на него.

Status. Эта директива используется для задания серверу HTTP/1.0строки-статус, которая будет послана клиенту. Формат этой строки:nnn xxxxx, где nnn - трехцифровой статус-код, а xxxxx строка причины,такая, как Forbidden (Запрещено) [15].

Приведем простой пример CGI-приложения, формирующего дляэкрана клиента страницу с текстом Hello, client! Для этого необходимосоздать в IDE Delphi 6 консольное приложение:

program HelloWorld; {$APPTYPE CONSOLE}

uses SysUtils; begin // Insert user code here

end.

Затем надо добавить между begin и end следующие строки кода:

writeln ('CONTENT-TYPE: TEXT/HTML');writeln;writeln ('<html>');writeln ('<head>');writeln ('<title>Example!</title>');writeln ('</head>');writeln ('Hello, client!');writeln ('</body>');writeln ('</html>');

Первая строка указывает на тип данных, которые CGI-приложениевозвращает клиенту – HTML-документ. Следующим оператором выво-дится пустая строка – признак завершения заголовка и начала передачиданных. Далее просто формируются строки HTML-страницы.

Сохраним исполняемый файл созданного приложения под именемHelloClient.exe в каталоге \Inetpub\cgi-bin\ сервера PWS (или IIS) и за-пустим этот сервер, сконфигурировав его соответствующим образом.Если теперь из Web-браузера указать URL http://localhost/cgi-bin/HelloClient.exe, то на экране отобразится страница с приветствием,подтверждая появление в Web-системе дополнительной функции.

Page 47: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

46

3.3. Создание CGI-приложений средствами DelphiВ Delphi 6 присутствует ряд технологий, призванных упростить

разработку Web-приложений. Одной из таких технологий являетсяWebBroker. WebBroker – это набор компонентов, мастеров и другихвспомогательных средств, существенно упрощающих разработку Web-приложений. Благодаря этой технологии разработчик может сосредото-читься на функциональном содержимом приложений, не беспокоясь одеталях реализации протоколов.

Компонент TWebModule позволяет создавать CGI/ISAPI-приложения, избавляя при этом от необходимости всякий раз писатьпохожий код. Кроме того, компонент убирает различия в написанииCGI- и ISAPI-приложений. Для создания CGI/ISAPI-приложения в Del-phi 6, необходимо выбрать новый проект как Web Server Application. Впоявившемся окне выбрать тип будущего приложения – CGI (илиISAPI). После этого мастер Delphi 6 создаст шаблон проекта, включивтуда все необходимые компоненты (TWebModule, в частности), и про-изведет все предварительные настройки [30].

Класс TWebModule обладает свойством Actions, которое содержитколлекцию элементов TWebActionItem. Элемент TWebActionItem по-зволяет выполнять код, основанный на определенном запросе. Каждыйэлемент TWebActionItem имеет собственное имя, хранящееся в свойствеPathInfo, а когда клиент посылает основанный на этом имени запрос,выполняется подготовленный код и формируется соответствующий от-вет. Имя запроса передается клиентом как дополнительный путь (тоесть сразу после имени приложения). Событие будет происходить присовпадении первого параметра командной строки (виртуального пути) ссодержимым свойства PathInfo. Если это свойство содержит пустуюстроку, а свойство default установлено в true, событие выполнится призапуске приложения с пустым первым параметром (то есть без дополни-тельного пути).

Создадим на базе CGI-расширения простейшую информационнуюслужбу, предоставляющую сведения о погоде за неделю. Соответст-вующее приложение будет возвращать Web-страницу с таблицей темпе-ратуры за неделю. При этом предоставляется возможность выбрать дан-ные по дневной и ночной температуре, а также единицы измерения тем-пературы – градусы Цельсия либо Кельвина.

Данные по температуре за неделю будут храниться в двух файлах –daytemp.dat и nighttemp.dat – значения дневной и ночной температурысоответственно. В файлах значения будут в градусах Цельсия. Преобра-

Page 48: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

47

зование в шкалу Кельвина должно производиться в приложении. CGI-запросы будут иметь один аргумент – arg, в качестве возможных значе-ний используются строковые константы - celsium и kelvin, позволяю-щие выбрать единицы измерения. Время суток будет выбираться черезвиртуальный путь: /day определяет день, /night – ночь.

Теперь необходимо создать новый проект Web Server Application.В появившемся окне необходимо выбрать тип будущего приложения –CGI. Сохраним это приложение под именем CGITemper.

Затем требуется определить глобальный массив temper : array [1..7]of real, в котором будет храниться температура, и список строк -prehtml:TstringList – в него будет заноситься HTML-код.

Также требуется написать одну функцию и две вспомогательныхпроцедуры.

Функция LoadTemper( ) загружает из текстового файла значениятемпературы и возвращает нулевое значение в случае отсутствия файла(листинг 3.1).

Листинг 3.1

function LoadTemper(FileName:string):integer;var TableList:TStringList; a: integer;begin TableList:=TStringList.Create; result:=0; try

if FileExists(FileName) then TableList.LoadFromFile(FileName)

else exit; if TableList.Count<7 then exit; for a:=1 to 7 do temper[a]:=StrToFloat(TableList.Strings[a-1]); result:=1; finally TableList.Free; end;end;

Процедура ConvertToKelvin( ) конвертирует данные таблицы изградусов по Цельсию в градусы по Кельвину:

procedure ConvertToKelvin;var a:integer;begin

Page 49: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

48

for a:=1 to 7 do temper[a]:=temper[a]+273;end; Процедура GenerateHTML( ) - генерирует HTML-код, отправляе-

мый в качестве результата Web-клиенту (листинг 3.2). Аргументы str1 иstr2 используются для сообщения времени суток и единиц измеренияданных в выводимой таблице.

Листинг 3.2

procedure GenerateHTML(str1,str2:string);var a:integer;begin with prehtml do begin Add('<HTML>'); Add('<HEAD>'); Add('<TITLE>Недельная температура '+str1+'('+str2+')</TITLE>'); Add('</HEAD>'); Add('<BODY>'); Add('<TABLE BORDER>'); Add('<CAPTION>Недельная температура'+str1+'('+str2+')</CAPTION>'); Add('<TR><TH>Понедельник</TH><TH>Вторник</TH><TH>Среда</TH>'); Add('<TH>Четверг</TH><TH>Пятница</TH>'); Add('<TH>Суббота</TH><TH>Воскресенье</TH></TR>'); Add('<TR>'); for a:=1 to 7 do Add('<TD>'+FloatToStr(temper[a])+'</TD>'); Add('</TR></TABLE>'); Add('Цельсий<br>'); Add('<a href= “day?arg=celsium ">Днем</a>'); Add('<a href="night?arg=celsium">Ночью</a>'); Add('<br>Кельвин<br>'); Add('<a href="night?arg=kelvin">Днем</a>'); Add('<a href="night?arg=kelvin">Ночью</a>'); Add('</BODY>'); Add('</HTML>'); end;end;

Теперь нужно создать обработчики трех событий. Первый возвра-щает серверу стартовую страницу, когда вызывается приложение без

Page 50: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

49

аргументов и дополнительных путей. Два остальных показывают соот-ветственно дневную и ночную температуру за неделю.

В меню View надо выбрать Object Tree View, выбрать в появив-шемся окне узел Actions и создать три новых элемента (кнопка NewItem). Каждому из элементов необходимо добавить обработчик событияOnAction (двойной щелчок на поле Actions закладки Events окна ObjectInspector). Для второго действия в свойство PathInfo надо поместитьстроку /day, для третьего – /night. Для первого действия это поле остаёт-ся пустым, а свойство default должно быть установлено в true – дейст-вие будет выполняться при вызове без параметров.

Обработчик первого события представлен ниже в листинге 3.3.

Листинг 3.3

Procedure TWebMoule1.WebModule1WebActionItem1Action(Sender: TObject; Request: TWebRequest; Response:TWebResponse; var Handled: Boolean);begin prehtml:=TStringList.Create; try with prehtml do begin // Заголовок HTML документа Add('<HTML>'); Add('<HEAD>'); Add('<TITLE>Данные по температуре за неделю</TITLE>'); Add('</HEAD>'); Add('<BODY>'); Add('<h3>Данные по температуре

за неделю</h3>'); // Ссылки для вызова расширения с параметрами Add('Цельсий<br>'); // Дневная температура по Цельсию Add('<a href = " CGITemper.exe/day?arg=celsium">Днем</a>'); // Ночная температура по Цельсию Add('<a href = "CGITemper.exe/night?arg=celsium">Ночью</a>'); Add('<br>Кельвин<br>'); //Дневная температура по Кельвину Add('<a href = "CGITemper.exe/day?arg=kelvin">Днем</a>'); //Ночная температура по Кельвину

Page 51: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

50

Add('<a href = "CGITemper.exe/night?arg=kelvin">Ночью</a>'); Add('</BODY>'); Add('</HTML>'); end; Response.Content:=prehtml.Text; finally prehtml.Free; end; Handled:=true;end;

Изображение страницы, которая должна генерироваться по умол-чанию, представлено на рисунке 3.2.

Рис. 3.2

Вторые два обработчика похожи (листинги 3.4 и 3.5) и отличаютсялишь используемым файлом и сообщениями, возвращаемыми клиенту.В них происходит непосредственно генерация страницы с таблицей по-годы.

Листинг 3.4

procedureTWebModule1.WebModule1WebActionItem2Action(Sender: TObject; Request: TWebRequest; Response:TWebResponse; var Handled: Boolean);

Page 52: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

51

begin // День prehtml:=TStringList.Create; try // Загрузка файла LoadTemper('daytemp.dat'); // Определить единицы измерения if Request.QueryFields.Values ['ARG']='celsium' then //генерируется результат по Цельсию GenerateHTML('днем','по Цельсию') else begin //по Кельвину – конвертируется массив ConvertToKelvin; GenerateHTML('днем','по Кельвину'); end; //возврат полученной страницы Response.Content:=prehtml.Text; finally prehtml.Free; end; Handled:=true;end;

Листинг 3.5

procedureTWebModule1.WebModule1WebActionItem3Action(Sender: TObject;Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);begin //Ночь prehtml:=TStringList.Create; try LoadTemper('nighttemp.dat'); // Определить единицы измерения if Request.QueryFields.Values ['ARG']='celsium' then //генерируется результат по Цельсию GenerateHTML('ночью','по Цельсию') else begin

Page 53: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

52

//по Кельвину – конвертируется массив ConvertToKelvin; GenerateHTML('ночью','по Кельвину'); end;

//возврат полученной страницы Response.Content:=prehtml.Text; finally prehtml.Free; end; Handled:=true;end;

Откомпилированный файл CGITemper.exe надо поместить в ката-лог \Inetpub\cgi-bin. Для доступа к сервису, предоставляемому создан-ным CGI-приложением, необходимо запустить Web-сервер (PWS илиIIS) и указать URL http://localhost/cgi-bin/ CGITemper.exe приложения изWeb-браузера. В результате исполнения этого запроса в окне браузераотобразится начальная страница, на которой предлагается выбрать гра-фик дневной или ночной температуры за неделю.

После щелчка мышью, например, на ссылке Днем под меткойЦельсий в окне Web-браузера появится изображение страницы с табли-цей погоды (рис.3.3).

Рис. 3.3

Таким образом, создав CGI-приложение, в системе удалось реали-зовать функциональность, которую невозможно было бы получитьсредствами базового Web. Наличие подобного инструментария позволя-ет решать большое число задач, возникающих в практике примененияInternet-технологий.

Page 54: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

53

4. XML КАК СРЕДСТВО ОБМЕНАСТРУКТУРИРОВАННЫМИ

ДАННЫМИ В WEB-ВЗАИМОДЕЙСТВИЯХ

4.1. XML-документ как средствоструктурирования передаваемых данных

Структура XML-документаИспользование средств XML при организации Web-

взаимодействий предполагает обмен данными, оформленными в видеXML-документов. При этом в передаваемом потоке содержатся нетолько собственно данные, но также информация об их структуре.

XML-документ представляет из себя текстовый файл, оформлен-ный в соответствии с требованиями, определяемыми стандартом языкаXML [23].

В частности, любой XML-документ должен всегда начинаться синструкции <?xml?>, внутри которой также можно задавать номер вер-сии языка, номер кодовой страницы и другие параметры, необходимыепрограмме-анализатору в процессе разбора документа.

Тело документа XML состоит из элементов разметки (markup) инепосредственно содержимого документа - данных (content). XML-тегипредназначены для определения элементов документа, их атрибутов идругих конструкций языка.

Пример XML-документа приведен в листинге 4.1.

Листинг 4.1

<?xml version="1.0" encoding="Windows-1251"?><books description="Русская классическаялитература"> <book ident="b1"> <author>Пушкин А.С.</author> <title>Евгений Онегин</title> <pages>120</pages> </book> <book ident="b2"> <author>Толстой Л.Н.</author> <title>Война и мир</title> <pages>1180</pages> </book> <book ident="b3"> <author>Лермонтов М.Ю.</author>

Page 55: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

54

<title>Герой нашего времени</title> <pages>440</pages> </book></books>

Если XML-документ не нарушает правила языка, то он называетсяформально-правильным и все анализаторы, предназначенные для разбо-ра XML-документов, смогут работать с ним корректно.

Разбор XML-документовДля выделения данных из принимаемых XML-документов в при-

ложениях должны использоваться средства для разбора этих докумен-тов. Язык XML является общепринятым стандартом, и для решения за-дачи разбора XML-документов можно применять готовые программы-парсеры различных фирм-производителей, которые могут быть интег-рированы в разрабатываемые приложения.

На сегодня существует два стандарта, на основе которых создаютсяпрограммы-парсеры: SAX и DOM.

SAX (Simple API for XML) – это API, позволяющий создавать при-ложения, читающие данные из XML-документов.

SAX основан на событиях, то есть он генерирует события, обнару-жив в XML-документе указанную информацию. При использованииSAX затраты памяти гораздо ниже, чем у DOM, что эффективнее приработе с большими документами. Однако SAX малопригоден для рабо-ты с внутренними ссылками.

XML Document Object Model (DOM) – это представление XML-документа в виде иерархии объектов некоторого языка программирова-ния, позволяющее анализировать и/или изменять структуру XML-документа. Наиболее известная реализация DOM для Windows созданафирмой Microsoft.

DOM-парсер поставляется с браузером Internet Explorer, начиная сверсии IE 4. Наиболее свежую версию можно бесплатно скачать с сер-вера Microsoft (www.microsoft.com).

DOM-парсер создает хранящееся в памяти представление целогоXML-документа в виде дерева объектов, что позволяет работать со всемего содержимым. Документ рассматривается как единый узел, содер-жащий все остальные узлы, включая узел, представляющий корневойэлемент, который, в свою очередь, содержит все элементы, атрибуты итекстовые узлы документа.

Например, для XML-файла, приведенного в листинге 4.1, DOM-парсером будет построено дерево, показанное на рисунке 4.1.

Page 56: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

55

Рис.4.1

Проверка правильности XML-документаКроме проверки на формальное соответствие грамматике языка, в

документе могут присутствовать средства контроля над содержаниемдокумента, а также за соблюдением правил, определяющих необходи-мые соотношения между элементами и формирующих структуру доку-мента.

Для выполнения проверки правильности XML-документов исполь-зуются верифицирующие анализаторы.

На сегодняшний день существует два способа контроля правильно-сти XML-документа: DTD-определения (Document Type Definition) исхемы данных (Semantic Schema).

В XML-документах DTD определяет набор действительных эле-ментов, идентифицирует элементы, которые могут находиться в другихэлементах, и определяет действительные атрибуты для каждого из них.

Для XML-документа, приведенного в листинге 4.1, DTD может вы-глядеть следующим образом (листинг 4.2).

Листинг 4.2

<!ELEMENT books (book+)><!ELEMENT book (author,title,pages?)><!ELEMENT title (#PCDATA)><!ELEMENT author (#PCDATA)><!ELEMENT pages (#PCDATA)>

Page 57: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

56

<!ATTLIST book ident ID #REQUIRED><!ATTLIST books description CDATA #REQUIRED>

Элемент в DTD определяется с помощью дескриптора !ELEMENT,в котором указывается название элемента и структура его содержимого.

Списки атрибутов элемента определяются с помощью ключевогослова !ATTLIST. Внутри него задаются названия атрибутов, типы ихзначений и дополнительные параметры.

Чтобы подключить этот DTD-файл к XML-документу, в последнийнужно добавить строчку:<!DOCTYPE books SYSTEM "books.dtd">

XML-файл, приведенный в листинге 4.1, сохраним под именемbooks.xml, а определение DTD, приведенное в листинге 4.2, сохраним втой же директории под именем books.dtd.

Интеграция XML-парсера в приложениеСоздадим в среде Delphi простое приложение для проверки пра-

вильности XML-документов с использованием XML-парсера Microsoft.Форма этого приложения показана на рисунке 4.2.

Рис. 4.2

В приложении используется компонент OpenDialog для задания пу-ти и имени XML-файла. При нажатии на кнопку «Открыть…» выполня-ется следующий код:

procedure TForm1.OpenButtonClick(Sender: TObject);begin if OpenDialog1.Execute then XMLFileEd.Text:=OpenDialog1.FileName;end;

Page 58: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

57

Для того, чтобы использовать в приложении XML-парсер Microsoft,необходимо подключить модуль msxml.pas.

Основным классом, используемым для хранения и анализа XML-документа, является XMLDOMDocument, доступ к которому осуществ-ляется через интерфейс IXMLDOMDocument посредством COM-техно-логии.

Основные свойства и методы этого интерфейса приведены в табли-цах 4.1 и 4.2.

Таблица 4.1

Свойство ОписаниеAsync Свойство, идентифицирующее текущий режим

обработкиParseError Возвращает ссылку на объект обработки ошиб-

ки XMLDOMParseErrorValidateOnParse Включение - выключение верификации доку-

ментаurl Возвращает URL документаDocumentElement Содержит ссылку на корневой элемент доку-

мента в виде объекта XMLDOMElement

Таблица 4.2

Метод ОписаниеLoad(url) Загружает XML документSave(objTarget) Сохраняет XML документ в файлеAbort Прерывает процесс загрузки и обра-

ботки документа.CreateAttribute (name) Создает для текущего элемента но-

вый атрибут с указанным именем.CreateNode(Type, name,nameSpaceURI)

Создает узел указанного типа и на-звания

CreateElement(tagName) Создает элемент документа с ука-занным названием.

CreateTextNode(data) Создает текст внутри документаGetElementsByTagName(tagname)

Возвращает ссылку на коллекциюэлементов документа с заданнымименем

NodeFromID(idString) Поиск элемента по идентификатору

Page 59: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

58

Для получения сведений об ошибках, возникших в результате раз-бора XML-документа, используется интерфейс IXMLDOMParseError.Его свойства описаны в таблице 4.3.

Таблица 4.3

Свойство ОписаниеErrorCode Код ошибки, возникшей при последнем разборе доку-

мента. 0 если ошибок не былоReason Причина возникшей ошибкиLine Номер строки, в которой обнаружена ошибкаLinepos Номер позиции символа в строке, где обнаружена

ошибкаUrl Имя файла, в котором обнаружена ошибкаSrcText Ошибочный текст

При нажатии на кнопку «Разбор XML документа» выполняетсяпрограммный код, приведенный в листинге 4.3.

Листинг 4.3

procedure TForm1.ParseButtonClick(Sender: TObject);var Doc:IXMLDOMDocument; Err:IXMLDOMParseError;begin //Создание ссылки на IXMLDOMDocument Doc:=CoDOMDocument.Create; //Отключение разбора документа Doc.async:=false; //Загрузка XML-документа из файла Doc.load(XMLFileEd.Text); //Включение верификации Doc.validateOnParse:=true; //Разбор документа Doc.async:=true; //Получение ссылки на IXMLDOMParseError Err:=Doc.parseError; ResultMemo.Clear; //Занесение результатов разбора в memo поле if Err.errorCode=0 then ResultMemo.Lines.Add('Статус:OK') else ResultMemo.Lines.Add('Статус:ошибка'); ResultMemo.Lines.Add('Причина:'+ Err.reason);

Page 60: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

59

ResultMemo.Lines.Add('Строка:'+inttostr(Err.line)); ResultMemo.Lines.Add ('Столбец:'+inttostr(Err.linepos)); ResultMemo.Lines.Add('Файл:' + Err.url); ResultMemo.Lines.Add('Текст:'+Err.srcText);end;

Теперь можно поэкспериментировать с XML-файлом books.xml.Например, если удалить один из тегов <author>, то получим следующийрезультат (рис. 4.3).

Рис. 4.3

Использование схем данныхСхемы данных (Schemas) являются альтернативным способом соз-

дания правил построения XML-документов. По сравнению с DTD схе-мы обладают более мощными средствами для определения сложныхструктур данных, обеспечивают более понятный способ описания грам-матики языка, способны легко модернизироваться и расширяться. Без-условным достоинством схем является также то, что они позволяютописывать правила для XML-документа средствами самого же XML.

Схема данных в рамках стандарта XDR (XML Data ReducedSchema) для приведенного в листинге 4.1 XML-файла будет выглядетьследующем образом (листинг 4.4).

Page 61: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

60

Листинг 4.4

<?xml version="1.0" encoding="Windows-1251"?><Schema name="book-schema" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes"> <ElementType name="books" model="closed" content="eltOnly"> <AttributeType name="description" dt:type="string" required="yes"/> <attribute type="description"/> <element type="book" minOccurs="1" maxOccurs="*"/> </ElementType> <ElementType name="book" model="closed" content="eltOnly"> <AttributeType name="ident" dt:type="id" required="yes"/> <attribute type="ident"/> <element type="author" minOccurs="1" maxOccurs="1"/> <element type="title" minOccurs="1" maxOccurs="1"/> <element type="pages" minOccurs="0" maxOccurs="1"/> </ElementType> <ElementType name="title" model="closed" content="textOnly" dt:type="string"/> <ElementType name="author" model="closed" content="textOnly" dt:type="string"/> <ElementType name="pages" model="closed" content="textOnly" dt:type="i4"/></Schema>

Тег <ElementType> является зарезервированным и позволяет опи-сать свойства конкретного элемента документа: названия и описанияатрибутов, а также названия и количество вложенных элементов, опи-сания которых вынесены в отдельные блоки <ElementType>.

Зарезервированный тег <element> позволяет описать типы и коли-чество вложенных элементов.

Тег <AttributeType> позволяет описать свойства атрибута элемента.Тег <attribute> позволяет задать атрибуты, которые должны содер-

жаться в элементе.

Page 62: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

61

Рассмотренная схема сохранена под именем books.xdr. Для под-ключения ее к проверяемому XML-файлу нужно переписать корневойтег следующим образом:

<books xmlns="x-schema:books.xdr"description="Русская классическая литература">

Схемы XDR поддерживаются парсером Microsoft, и контроль пра-вильности XML-документа можно провести, например, с помощью соз-данного выше приложения.

Так, если ввести в тег <pages> нечисловое значение, то получимсообщение об ошибке (рис. 4.4).

Рис. 4.4

XDR не является единственным способом контроля содержимогоXML-документа. Существует большое количество самых разных XML-схем, но все они строятся похожим способом. Отличия состоят только вназваниях зарезервированных тегов и в тех возможностях контроля,которые предоставляет та или иная схема [25].

4.2. Использование XML в Web-взаимодействиях

При организации взаимодействий в Web-системах на основе XMLнеобходимо на клиентской и серверной стороне использовать средствадля приема и обработки XML-документов.

Одним из возможных вариантов обработки XML-сообщений насерверной стороне является построение соответствующих CGI/ISAPI-

Page 63: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

62

приложений или COМ-компонент, а при создании Web-клиента можноиспользовать средства, описанные выше в п. 4.1.

Проиллюстрируем основные моменты разработки подобных при-ложений. Создадим в среде Delphi 6 два приложения: клиент и сервер,которые взаимодействуют в рамках единой Web-системы.

Приложение-клиент должно выполнять следующие задачи:1) формирование XML-документа, содержащего запрос к базе дан-

ных (БД);2) передача этого документа серверу;3) получение ответа в виде XML-документа;4) разбор полученного документа и отображение данных, содер-

жащихся в нем.Приложение-сервер реализуем как ISAPI-приложение, которое

должно выполнять такие задачи:1) получение запроса от клиента;2) разбор полученного XML-документа и выделение запроса к БД;3) осуществление запроса к БД;4) формирование XML-документа на основе полученных данных и

передача его клиенту.Подробно схема взаимодействия клиента и сервера представлена

на рис. 4.5.

Рис. 4.5

Запрос и ответ определяются форматом протокола HTTP и имеютследующий вид:

HTTP-заголовок

XML -документ

Page 64: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

63

Определим формат XML-документа, формируемого клиентом.Этот документ состоит из одного корневого тега <Request>, в которомсодержится SQL-запрос к БД. Таким образом, документы, передаваемыеклиентом серверу, будут иметь следующий вид:

<Request> SQL-запрос</Request>

Ответ сервера на такой запрос будет иметь более сложную струк-туру. Корневой тег ответа назовем <Response>. Внутри этого тега со-держится тег <Status>, информирующий о результате выполнения за-проса. У этого тега имеется атрибут ID, значение которого равно “OK”,если запрос к БД выполнен успешно, и “Error” - в противном случае.Также этот тег содержит текстовую строку, поясняющую результат вы-полнения запроса.

В случае успешно выполненного запроса в корневом теге могутсодержаться несколько тегов <Item>, в которых записаны извлеченныеиз БД данные в следующем формате:

<Название_поля_БД>Значение_поля</Название_поля_БД>.Таким образом, в случае неудачи при выполнении запроса к БД от-

вет сервера имеет вид:

<Response> <Status ID=”Error”> Причина_неудачи </Status></Response>

В случае удачно выполненного запроса клиент получит XML-документ такого вида:

<Response><Status ID=”OK”> Запрос выполнен успешно</Status>

<Item> <Название_поля1>Значение_поля1</Название_поля1>

… <Название_поляN>Значение_поляN</Название_поляN> </Item>

… <Item> <Название_поля1>Значение_поля1</Название_поля1>

… <Название_поляN>Значение_поляN</Название_поляN> </Item></Response>

Page 65: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

64

Программная реализация клиента

У клиента имеется одна форма, общий вид которой показан на ри-сунке 4.6.

Рис. 4.6

В верхней части формы находится строка для ввода URL, задающе-го путь к серверу, слева – поле для ввода SQL запроса к БД. Предусмот-рены также поля для отображения ответа сервера: HTTP-заголовка иXML-данных. В нижней части окна данные, полученные от сервера,представляются в виде таблицы.

Клиент должен выполнять четыре задачи, описанные выше. Рас-смотрим более подробно, какими средствами реализуется выполнениеэтих задач.

1) Для формирования XML-документа, содержащего запрос к БД,будем использовать классы, предоставляемые XML-парсером Microsoft.Описание этих классов на языке Object Pascal находится в файлеmsxml.pas.

Для работы с XML-документом используется интерфейсIXMLDOMDocument.

Для создания XML-запроса к БД служит функция CreateXMLRe-quest, которой в качестве параметра передается введенный пользовате-лем SQL-запрос. Полный текст этой функции приведен в листинге 4.5.

Page 66: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

65

Листинг 4.5

function TForm1.CreateXMLRequest(SQLRequest:string): IXMLDOMDocument;begin //Создание нового документа Result:=coDOMDocument.Create; //Отключение проверки на правильность Result.async:=false; //Создание корневого тега Result.documentElement:= Result.createElement('Request'); //Запись SQL запроса в корневой тег Result.documentElement.text:=SQLRequest;end;

2,3) Для посылки HTTP-запроса Web-серверу и получения ответаиспользуем интерфейс IXMLHTTPRequest, также описанный в файлеmsxml.pas. В программе будут использоваться следующие методы исвойства этого интерфейса.

Методы: procedure open(const bstrMethod:

WideString; const bstrUrl: WideString;varAsync: OleVariant; bstrUser: OleVariant;bstrPassword:OleVariant);Задает параметры запроса к Web-серверу:bstrMethod – метод HTTP-запроса (например GET, POST); bstrUrl – URLсервера; varAsync - параметр, задающий режим выполнения запроса(если он равен false, выполнение программы приостанавливается, покане будет получен ответ от сервера; если true – серверу посылается за-прос, и выполнение программы продолжается); bstrUser – имя пользова-теля; bstrPassword – пароль.

procedure send(varBody: OleVariant)Посылает запрос Web-серверу, используя параметры, заданные в методеopen(). В качестве параметра методу передаются данные, которыедолжны быть посланы Web-серверу.

function getAllResponseHeaders: WideString;safecall;Возвращает все HTTP-заголовки ответа сервера.

Page 67: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

66

Свойства: property status: Integer

Содержит код ответа Web-сервера. property statusText: WideString

Содержит текстовую строку, расшифровывающую код ответа Web-сер-вера.

property responseXML: IDispatchСодержит данные, присланные Web-сервером в ответ на запрос в видеXML-документа.

4) В Delphi 6 во вкладке Internet имеется компонент XMLDocument.Он, по сути, представляет собой оболочку для XML-парсера Microsoft,однако работа с ним несколько более удобна, чем непосредственно спарсером. Этот компонент и используется для разбора полученногоXML-документа. Из этого документа извлекаются значения полей БД иотображаются в компоненте типа TStringGrid в виде таблицы.

Все действия производятся клиентом при нажатии кнопки «Отпра-вить запрос». Полностью программный код этого метода приведен влистинге 4.6.

Листинг 4.6

procedure TForm1.btnSendReqClick(Sender: TObject);var Req:IXMLHTTPRequest; i,j:integer; N:IXMLNode; Doc:IXMLDOMDocument;begin //Создание экземпляра класса XMLHTTPRequest Req:=CoXMLHTTPRequest.Create; //Задание параметров HTTP запроса Req.open('POST',EditAdr.Text,false,'',''); // Посылка запроса серверу. При этом // выполнение программы приостанавливается пока не // будет получен ответ. Req.send(CreateXMLRequest(MemoSQL.Text)); //Отображение всех заголовков HTTP ответа MemoHTTP.Text:=Req.getAllResponseHeaders; //Отображение текстового //описания кода ответа сервера Label2.Caption:='Результат выполнения HTTP запроса:'+Req.Statustext; // Если запрос выполнен успешно (код ответа 200),

Page 68: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

67

// то производится разбор полученного // XML-документа if Req.status=200 then begin //Получение ссылки на XML-документ Doc:=Req.ResponseXML as IXMLDOMDocument; //Отображение всего документа полностью MemoXML.Text:=Doc.xml; //Загрузка документа в компонент XMLDocument XMLDoc.LoadFromXml(Doc.xml); //Поиск тега <Status> N:=XMLDoc.DocumentElement.ChildNodes. Nodes['Status']; Label1.Caption:='Результат выполнения SQL запроса:'+N.Text; ResGrid.RowCount:=1; ResGrid.ColCount:=1; //Если SQL запрос выполнен успешно, //то отображение данных в виде таблицы if N.Attributes['ID']='OK' then begin //Проход по всем дочерним //узлам корневого тега for i:=0 to XMLDoc.DocumentElement.ChildNodes.Count-1 do begin N:=XMLDoc.DocumentElement.ChildNodes.Nodes[i]; //Если это тег <Item>, //то отобразить его в таблице if N.NodeName='Item' then begin ResGrid.RowCount:=ResGrid.RowCount+1; for j:=0 to N.ChildNodes.Count-1 do begin if j=ResGrid.ColCount then ResGrid.ColCount:=ResGrid.ColCount+1; ResGrid.Cells[j,0]:= N.ChildNodes.Nodes[j].NodeName; ResGrid.Cells[j,ResGrid.RowCount-1]:= N.ChildNodes[j].Text; end; end; end;

Page 69: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

68

if ResGrid.RowCount>1 then ResGrid.FixedRows:=1; end; end;end;

Результат успешного выполнения SQL-запроса показан на рисун-ке 4.7, неудачного - на рисунке 4.8.

Рис. 4.7

Рис. 4.8

Page 70: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

69

Программная реализация сервераСервер представляет собой ISAPI-приложение, принципы создания

которого обсуждались выше. Опишем те методы и средства, которыеиспользуются для решения задач сервера.

1) В программной реализации сервера используется компонентWebDispatcher для задания действия по обработке запроса клиента. Привызове клиентом приложения сервера с путем /sql этот сервер произво-дит обработку запроса клиента по указанному выше алгоритму. ОтWeb-сервера ISAPI- приложение получает запрос клиента со всей пере-данной информацией. Этот запрос хранится в переменной Request типаTWebRequest.

2) Для извлечения SQL-запроса из полученного XML-документаиспользуется компонент XMLDocument Delphi. SQL-запрос извлекаетсяи заносится в компонент Query, служащий для выполнения SQL-запро-сов к БД. Эта часть программы представлена в листинге 4.7.

Листинг 4.7

//Отключение разбора XML-документа XMLDoc.Active:=false; //Очистка содержимого XML-документа XMLDoc.XML.Clear; //Занесение в компонент XML-документа, полученного // от клиента XMLDoc.XML.Add(Request.Content); //Разбор XML-документа XMLDoc.Active:=true; Query1.Active:=false; //Очистка содержимого компонента Query1 Query1.SQL.Clear; //Занесение в компонент Query1 SQL запроса, //полученного от клиента Query1.SQL.Text:=XMLDoc.DocumentElement.Text;

3) Для осуществления SQL-запроса к БД используется компонентQuery. При этом с целью упрощения программы компонент настроен наработу с БД, которая поставляется вместе с Delphi в качестве примеров.Для этого свойство DatabaseName компонента Query1 установлено рав-ным DBDEMOS. Для выполнения SQL-запроса нужно вызвать методOpen() компонента Query1. При этом будет выполнен запрос, содержа-щийся в свойстве SQL данного компонента.

Page 71: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

70

4) Для формирования XML-документа, содержащего результатывыполнения запроса к БД, используется компонент XMLDocument. Приэтом для простоты данные заносятся в него непосредственно в тексто-вом виде, а не путем вызова соответствующих методов для добавленияновых узлов. Для того, чтобы клиент получил ответ, необходимо свой-ству Content параметра Response присвоить содержимое сформирован-ного XML-документа. Полностью все действия, производимые для ре-шения задач 3) и 4), проиллюстрированы в листинге 4.8.

Листинг 4.8

//Очистка XMLDocument XMLDoc.XML.Clear; //Занесение заголовока XMLDoc.XML.Add('<?xml version="1.0" encoding="Windows-1251"?>');//Открытие корневого тегаXMLDoc.XML.Add('<Response>'); try //Попытка выполнить SQL-запрос Query1.Open; except //Если произошла ошибка on E:Exception do begin //В тег <Status> заносится // сообщение об ошибке XMLDoc.XML.Add('<Status ID="Error">' +E.Message+'</Status>'); //Закрытие корневого тега XMLDoc.XML.Add('</Response>'); //Запись типа содержимого в HTTP- //заголовок ответа Response.ContentType:='text/xml'; //Запись XML-данных в содержимое ответа Response.Content:=XMLDoc.XML.Text; //Выход из процедуры обработки //запроса клиента exit; end; end; //В случае успешного выполнения SQL запроса //в тег <Status> заносится сообщение об //успешном выполнении запроса

Page 72: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

71

XMLDoc.XML.Add('<Status ID="OK"> Запрос выполнен успешно</Status>'); Query1.First; //Проход по всем полученным записям БД while not Query1.Eof do begin //и формирование тегов <Item> XMLDoc.XML.Add('<Item>'); for i:=0 to Query1.FieldCount-1 do begin fname:=Query1.Fields[i].FieldName; //с соответствующим содержанием XMLDoc.XML.Add('<'+fname+'>'+ Query1.Fields[i].AsString+'</'+fname+'>'); end; XMLDoc.XML.Add('</Item>'); Query1.Next; end; //Закрытие корневого тега XMLDoc.XML.Add('</Response>'); //Запись типа содержимого в HTTP-заголовок //ответа Response.ContentType:='text/xml'; //Запись XML-данных в содержимое ответа Response.Content:=XMLDoc.XML.Text;end;

Из приведенного примера хорошо видны преимущества языкаXML при обмене данными. Если бы приложение сервер возвращалоответ в виде HTML-страницы, то данные были бы перемешаны с тега-ми, отвечающими за их отображение. При использовании же языкаXML клиент получает только сами данные, представленные в удобномдля обработки виде. Отображение данных в нужном виде возлагается насамого клиента.

Page 73: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

72

5. ОРГАНИЗАЦИЯ ВЗАИМОДЕЙСТВИЙНА ОСНОВЕ WEB-СЕРВИСОВ

5.1. Организация взаимодействия приложенийи Web-сервисов с использованием средств пакета

MSSOAP Toolkit

Общая схема взаимодействия клиента и Web-сервиса

Поскольку Web-сервисы базируются на общепринятых стандартах,многими фирмами выпущены программные средства, позволяющиебыстро создавать Web-сервисы, а также клиентов к существующимWeb-сервисам, не вникая глубоко в детали протокола SOAP и языкаWSDL.

В данном разделе обсуждаются соответствующие возможности па-кета SOAP Toolkit версии 2.0 производства Microsoft. (этот пакет можнобесплатно скачать с сервера www.microsoft.com) [24].

Объектная модель SOAP Toolkit предоставляет как низкоуровне-вые, так и высокоуровневые интерфейсы (SOAPClient, SOAPServer),скрывающие от программиста внутреннюю организацию клиента иWeb-сервиса: разбор и формирование пакетов, вызов методов и т. п. Спомощью этих интерфейсов можно весьма простым образом использо-вать Web-сервисы в разрабатываемых приложениях. Объект SOAPClientвыступает в роли посредника (proxy), предоставляющего интерфейсWeb-сервиса и позволяющего работать с ним как с обычным COM-объектом (рис. 5.1).

Рис. 5.1

Page 74: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

73

Общая схема взаимодействия клиента и Web-сервиса, созданныхна основе MSSOAP Toolkit, выглядит следующим образом [17].

1. Клиентское приложение создает экземпляр объекта SOAPClient.2. SOAPClient читает файлы описания методов Web-сервиса (на

языках WSDL и Web Services Meta Language, WSML). Эти файлы могутхраниться и на стороне клиента.

3. Клиентское приложение, используя возможности позднего свя-зывания методов объекта SOAPClient, вызывает метод сервиса.SOAPClient формирует пакет запроса (SOAP Envelope) и отправляет егона сервер. Можно применить любой транспортный протокол, но, какправило, используется HTTP.

4. Серверное приложение Listener (это может быть ISAPI-приложение или ASP-страница) принимает пакет, создает объектSOAPServer и передает ему пакет запроса. Помимо этого Listener обра-батывает HTTP-пакеты от клиента, отправляет клиенту пакеты с резуль-татом работы сервиса, обрабатывает ошибки и использует функцио-нальность SOAP-объектов.

5. SOAPServer читает описание Web-сервиса, загружает описание ипакет запроса в деревья XML DOM.

6. SOAPServer вызывает метод СOM-объекта или приложения, реа-лизующего сервис.

7. Результаты выполнения метода или описание ошибки конверти-руются объектом SOAPServer в пакет ответа и отправляются клиенту.

8. Объект SOAPClient проводит разбор принятого пакета и возвра-щает клиентскому приложению результаты работы сервиса или описа-ние возникшей ошибки.

При использовании высокоуровневых интерфейсов SOAPClient,SOAPServer нет необходимости вдаваться в тонкости формата пакета,но при желании можно воспользоваться низкоуровневыми интерфейса-ми или же вообще создать SOAP-пакет "вручную", используя любойязык программирования.

С помощью объектов высокоуровневого API можно передаватьданные только простых типов (int, string, float и т. п.), но спецификацияSOAP 1.1 допускает работу с более сложными типами данных, напри-мер с массивами, структурами, списками и их комбинациями [40]. Дляработы с такими типами используются интерфейсы ISoapTypeMapper иSoapTypeMapperFactory низкоуровневого API.

Page 75: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

74

Принципы создания Web-сервисаСоздадим Web-сервис, который будет уметь переводить темпера-

туру из шкалы Цельсия в шкалу Кельвина и Фаренгейта. Для работысерверного приложения потребуется пакет PWS (Personal Web Server)для Windows 98 или IIS (Internet Information Server) для WindowsNT/2000, а также установленный SOAP Toolkit 2.0.

Требования клиентского приложения – ОС Microsoft Win-dows 98/Me или Windows NT 4.0 /2000, а также установленный SOAPToolkit 2.0.

Для начала в среде Delphi 6 создадим COM-объект, который будетреализовывать вышеуказанные функции по переводу температурнойшкалы. Для этого выберем меню File/New/Other/ActiveX/ActiveX Li-brary. В появившуюся заготовку приложения добавим CОМ-объект(File/New/Other/ActiveX/Automation Object). Зададим имя объекта Tem-perature. В библиотеке типов добавим два метода:

function CelsiusToKelvin(Celsius: Double): Doublefunction CelsiusToFahrenheit(Celsius: Double):Double

Затем нажмем на кнопку Refresh Implementation (в окне библиотекитипов). Delphi автоматически сгенерирует модуль, содержащий реали-зацию указанного СОМ-объекта. Добавим в этот модуль код, реали-зующий указанные функции, и сохраним проект. В результате всех этихманипуляций должен получиться модуль, приведенный в листинге 5.1.

Листинг 5.1

unit ComUn;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses ComObj, ActiveX, TemperaturePr_TLB, StdVcl;

type TTemperature = class(TAutoObject, ITemperature) protected function CelsiusToFahrenheit(Celsius: Double): Double; safecall; function CelsiusToKelvin(Celsius: Double): Double; safecall; { Protected declarations }

Page 76: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

75

end;

implementation

uses ComServ;

function TTemperature.CelsiusToFahrenheit(Celsius:Double): Double;begin

Result:=Celsius*1.8+32;end;

function TTemperature.CelsiusToKelvin(Celsius:Double): Double;begin

Result:=Celsius+273.15;end;

initialization TAutoObjectFactory.Create(ComServer, TTemperature, Class_Temperature, ciMultiInstance, tmApartment);

end.

Теперь скомпилируем полученный проект и сохраним его под име-нем TemperaturePr.dll в некоторой директории. Созданный СОМ-объектнужно зарегистрировать в реестре с помощью утилиты regsvr32.exe.

Рис. 5.2

Page 77: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

76

Далее необходимо создать WSDL-файл, описывающий создавае-мый Web-сервис. Для этого в пакете MSSOAP Toolkit имеется програм-ма WSDL Generator. Запустим ее и укажем путь к dll-файлу и имя созда-ваемого Web-сервиса (рис. 5.2).

Затем надо нажать на кнопку Next и указать те методы, которыебудет предоставлять Web-сервис (рис. 5.3).

По следующему нажатию кнопки Next в открывшемся окне зада-дим следующие параметры:

Listener URI : http://localhost/scripts/Listener Type: ASPXSD Schema Namespace: 2001

Рис. 5.3

Нажимая вновь кнопку Next, в появившемся экране задаем значе-ния соответствующих полей:

Select WSDL file character set: UTF-8Where would you like to store the new files? : C:\Inetpub\scriptsПосле этого WSDL Generator создаст три файла: temperature.wsdl,

temperature.wsml и temperature.asp.

Page 78: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

77

Первый из них содержит описание Web-сервиса на языке WSDL.Он приведен в листинге 5.2.

Листинг 5.2

<?xml version='1.0' encoding='UTF-8' ?> <!-- Generated 10/30/02 by Microsoft SOAP Toolkit

WSDL File Generator, Version 1.02.813.0 --><definitions name ='temperature' targetNamespace = 'http://tempuri.org/wsdl/' xmlns:wsdlns='http://tempuri.org/wsdl/' xmlns:typens='http://tempuri.org/type'

xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:stk='http://schemas.microsoft.com/ soaptoolkit/wsdl-extension' xmlns='http://schemas.xmlsoap.org/wsdl/'> <types> <schema targetNamespace='http://tempuri.org/type' xmlns='http://www.w3.org/2001/XMLSchema' xmlns:SOAP-ENC= 'http://schemas.xmlsoap.org/soap/encoding/' xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' elementFormDefault='qualified'> </schema> </types> <message name='Temperature.CelsiusToKelvin'> <part name='Celsius' type='xsd:double'/> </message> <message name='Temperature.CelsiusToKelvinResponse'> <part name='Result' type='xsd:double'/> </message> <message name='Temperature.CelsiusToFahrenheit'> <part name='Celsius' type='xsd:double'/> </message> <message name='Temperature.CelsiusToFahrenheitResponse'> <part name='Result' type='xsd:double'/>

Page 79: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

78

</message> <portType name='TemperatureSoapPort'> <operation name='CelsiusToKelvin' parameterOrder='Celsius'> <input message= 'wsdlns:Temperature.CelsiusToKelvin' /> <output message= 'wsdlns:Temperature.CelsiusToKelvinResponse' /> </operation> <operation name='CelsiusToFahrenheit' parameterOrder='Celsius'> <input message= 'wsdlns:Temperature.CelsiusToFahrenheit' /> <output message=

'wsdlns:Temperature.CelsiusToFahrenheitResponse' /> </operation> </portType> <binding name='TemperatureSoapBinding'

type='wsdlns:TemperatureSoapPort' > <stk:binding preferredEncoding='UTF-8'/> <soap:binding style='rpc' transport= 'http://schemas.xmlsoap.org/soap/http' /> <operation name='CelsiusToKelvin' > <soap:operation soapAction= 'http://tempuri.org/action/ Temperature.CelsiusToKelvin' /> <input> <soap:body use='encoded' namespace='http://tempuri.org/message/'

encodingStyle= 'http://schemas.xmlsoap.org/soap/encoding/' /> </input> <output> <soap:body use='encoded' namespace='http://tempuri.org/message/'

encodingStyle= 'http://schemas.xmlsoap.org/soap/encoding/' /> </output> </operation> <operation name='CelsiusToFahrenheit' > <soap:operation soapAction='http://tempuri.org /action/Temperature.CelsiusToFahrenheit' />

Page 80: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

79

<input> <soap:body use='encoded' namespace='http://tempuri.org/message/' encodingStyle= 'http://schemas.xmlsoap.org/soap/encoding/' /> </input> <output> <soap:body use='encoded' namespace='http://tempuri.org/message/'

encodingStyle= 'http://schemas.xmlsoap.org/soap/encoding/' /> </output> </operation> </binding> <service name='temperature' > <port name='TemperatureSoapPort' binding='wsdlns:TemperatureSoapBinding' > <soap:address location= 'http://localhost/scripts/temperature.asp' /> </port> </service></definitions>

По сути, этот файл представляет собой схему данных на языкеXML, описывающую сообщения, которыми могут обмениваться клиенти Web-сервис.

Второй файл служит для связи Web-сервиса и COM-объекта, егореализующего. Он приведен в листинге 5.3.

Листинг 5.3

<?xml version='1.0' encoding='UTF-8' ?><!-- Generated 10/30/02 by Microsoft SOAP Toolkit

WSDL File Generator, Version 1.02.813.0 --><servicemapping name='temperature'> <service name='temperature'> <using PROGID='TemperaturePr.Temperature' cachable='0' ID='TemperatureObject' /> <port name='TemperatureSoapPort'> <operation name='CelsiusToKelvin'> <execute uses='TemperatureObject' method='CelsiusToKelvin' dispID='1'>

Page 81: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

80

<parameter callIndex='1' name='Celsius' elementName='Celsius' /> <parameter callIndex='-1' name='retval' elementName='Result' /> </execute> </operation> <operation name='CelsiusToFahrenheit'> <execute uses='TemperatureObject' method='CelsiusToFahrenheit' dispID='2'> <parameter callIndex='1' name='Celsius' elementName='Celsius' /> <parameter callIndex='-1' name='retval' elementName='Result' /> </execute> </operation> </port> </service></servicemapping>

Третий файл с расширением .asp обеспечивает передачу запросаклиентов Web-сервису и возврата ответов. Этот файл содержит сцена-рий на языке VBScript, в котором обрабатываются все ошибки, которыемогут возникнуть при выполнении Web-сервиса.

Для лучшего понимания работы Web-сервисов создадим собствен-ный более простой сценарий, не обрабатывающий ошибки и сохранимего под именем temperature.asp в одном из каталогов PWS, предназна-ченном для хранения исполняемых файлов и сценариев, например, вкаталоге C:\Inetpub\Scripts\ (листинг 5.4).

Листинг 5.4

<%@Language=JScript%><%Response.ContentType="text/xml"%><% var soapserver=

new ActiveXObject("MSSoap.SoapServer");var wsdl=Server.MapPath("temperature.wsdl");var wsml=Server.MapPath("temperature.wsml");soapserver.Init(wsdl,wsml);soapserver.SoapInvoke(Request,Response);

%>

Page 82: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

81

В этом сценарии сначала устанавливается тип содержимого ответа(text/xml). После этого создается экземпляр объекта SoapServer. Затем спомощью функции MapPath() определяется полный путь к WSDL- иWSML-файлам, содержащим описание созданного Web-сервиса. Затемвызывается метод объекта SoapServer.Init(), с помощью которого проис-ходит инициализация объекта SoapServer. В качестве параметров емупередаются пути к файлам, содержащим описание Web-сервиса. Далеепроисходит вызов метода SoapInvoke, который осуществляет вызов за-прошенного клиентом метода и формирует ответ на языке XML. Пер-вый параметр, передаваемый этому методу, – запрос клиента. Во второйпараметр метод записывает ответ сервера.

Создание SOAP-клиента

Создадим в среде Delphi 6 обычное приложение, главная форма ко-торого показана на рисунке 5.4.

Рис. 5.4

Это приложение при нажатии на кнопку «Перевести» будет обра-щаться к Web-сервису, описанному в заданном WSDL-файле, и вызы-вать методы перевода соответствующих шкал. При этом пользовательможет задавать в поле слева температуру по Цельсию. Полностью про-граммный код клиента приведен в листинге 5.5.

Листинг 5.5

unit MainUn;

interface

Page 83: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

82

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

type TForm1 = class(TForm) CalcButton: TButton; Celsius: TLabeledEdit; Kelvin: TLabeledEdit; WSDLPath: TLabeledEdit; Fahrenheit: TLabeledEdit; procedure CalcButtonClick(Sender: TObject); private { Private declarations } public { Public declarations } end;

varForm1: TForm1;

implementation

uses ComObj;

{$R *.dfm}

procedure TForm1.CalcButtonClick(Sender: TObject);

var Client:OleVariant; tCels:double;begin

//Создание экземпляра объекта SoapClientClient:=CreateOleObject('MSSOAP.SoapClient');//Инициализация объекта SoapClientClient.mssoapinit(WSDLPath.Text,'','','');//Получение значения градусов ЦельсияtCels:=strtofloat(Celsius.Text);//Вызов методов Web сервиса//и отображение полученных результатовKelvin.Text:= floattostr(Client.CelsiusToKelvin(tCels));

Fahrenheit.Text:=

Page 84: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

83

floattostr(Client.CelsiusToFahrenheit(tCels));end;

end.

Для работы с полной моделью системы необходимо запуститьWeb-сервер, например, PWS, сконфигурированный соответствующимобразом, и приложение клиента. Если в процессе разработки клиента исервера не было допущено ошибок, то можно увидеть картину, изобра-женную на рисунке 5.5.

Рис. 5.5

Для отладки работы Web-сервисов в пакете MSSOAP Toolkit пре-дусмотрена программа Trace Utility, позволяющая увидеть данные, ко-торыми обмениваются клиент и Web-сервис в процессе взаимодействия.Для этого нужно запустить Trace Utility, выбрать менюFile/New/Formatted Trace и нажать кнопку ОК. Также необходимо отре-дактировать WSDL-файл, приведенный в листинге 5.2. Строку<soap:address location=

'http://localhost/scripts/temperature.asp' />нужно переписать следующим образом:<soap:address location='http://localhost:8080/scripts/temperature.asp' />Попутно заметим, что созданные таким образом клиент и Web-

сервис должны выполняться на одном и том же компьютере. Если нуж-но обеспечить их работу на разных компьютерах, то в WSDL-файле вприведенной выше строке необходимо вместо имени localhost указать

Page 85: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

84

имя компьютера, на котором будет работать Web-сервис. Сделанноезамечание относится и к следующему разделу.

Если теперь запустить клиента и нажать на кнопку «Перевести», тов окне Trace Utility появятся данные, которыми обмениваются Web-сервис и клиент (рис. 5.6).

Рис. 5.6

5.2. Организация взаимодействия клиентови Web-сервисов

с использованием компонентов Delphi

Пакет MSSOAP Toolkit от Microsoft не является единственнымсредством, облегчающим процесс создания Web-сервисов. В частности,создание Web-сервисов поддерживается в среде Delphi, начиная с вер-

Page 86: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

85

сии 6 [11]. Ниже обсуждаются особенности создания и использованияWeb-сервисов и клиентов к ним с помощью этого средства разработки.

Создание Web-сервиса

Создадим Web-сервис, рассмотренный в предыдущем разделе, спомощью компонентов Delphi 6. Для этого нужно выбрать со страницыWeb Services репозитория объектов пиктограмму Soap Server Applicationи выбрать тип Web-приложения, которое планируется создать. В дан-ном случае выберем ISAPI-приложение.

Выбрав тип приложения, получим объект TWebModule, содержа-щий три компонента:

THTTPSoapDispatcher, отвечающий за получение запросов спомощью протокола SOAP;

THTTPSoapPascalInvoker, отвечающий за перевод этих запро-сов в вызовы методов объектов приложения;

TWSDLHTMLPublish, отвечающий за генерацию WSDL-файлов, содержащих описание реализованных в Web-сервисе интерфей-сов, предназначенное для разработчиков клиентских приложений дляданного Web-сервиса.

Теперь можно приступить к созданию интерфейса Web-сервиса.Для этого просто создадим новый модуль и в нем опишем интерфейсITemperature, содержащий методы CelsiusToKelvin и CelsiusToFahrenheit(листинг 5.6).

Листинг 5.6

unit IntfUn;

interface

uses

InvokeRegistry;

type

ITemperature = interface(IInvokable)

['{D304BAA0-ECD5-11D6-959A-0080AD8A8296}']

function CelsiusToKelvin(const Celsius:double):double; stdcall;function CelsiusToFahrenheit(const Celsius:double):double; stdcall;

Page 87: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

86

end;

implementation

initialization

InvRegistry.RegisterInterface (TypeInfo(ITemperature));

end.

Значение GUID для данного интерфейса можно сгенерировать вредакторе кода с помощью комбинации клавиш Ctrl-Shift-G.

И, наконец, следует создать модуль с реализацией интерфейсаITemperature (листинг 5.7).

Листинг 5.7

unit ImplUn;

interface

uses InvokeRegistry, IntfUn;

typeTTemperature=class(TInvokableClass, ITemperature) function CelsiusToKelvin(const Celsius:double):

double; stdcall; function CelsiusToFahrenheit(const Celsius:

double): double; stdcall; end;

implementation

{ TTemperature }

function TTemperature.CelsiusToFahrenheit(const Celsius: double): double;

begin Result:=Celsius*1.8+32;end;

function TTemperature.CelsiusToKelvin(const Celsius: double): double;

Page 88: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

87

begin Result:=Celsius+273.15;end;

initialization

InvRegistry.RegisterInvokableClass(TTemperature);

end.

Сохранив созданный проект под именем DTemperaturePr.dll, скопи-руем полученное приложение в каталог Web-сервера, предназначенныйдля хранения исполняемых файлов.

Если теперь обратиться из Web-браузера к Web-сервису с парамет-ром /wsdl – http://localhost/scripts/DTemperaturePr.dll/wsdl, получим спи-сок реализуемых им интерфейсов. Один из них, ITemperature, созданвыше, другой, IWSDLPublish, реализован в компонентеTWSDLHTMLPublish.

Щелкнув по ссылке, указывающей на интерфейс ITemperature,можно получить WSDL-описание (листинг 5.8) интерфейсаITemperature, которое используется клиентским приложением и котороенеобходимо поместить в доступное для клиента место. В данном случаепросто сохраним это описание в файле под именем DTemperature.wsdl.

Листинг 5.8

<?xml version="1.0"?><definitions xmlns=http://schemas.xmlsoap.org/wsdl/ xmlns:xs="http://www.w3.org/2001/XMLSchema" name="ITemperatureservice" targetNamespace=

"http://www.borland.com/soapServices/"xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap"xmlns:soapenc=

"http://schemas.xmlsoap.org/soap/encoding/"> <message name="CelsiusToKelvinRequest"> <part name="Celsius" type="xs:double"/> </message> <message name="CelsiusToKelvinResponse"> <part name="return" type="xs:double"/> </message>

Page 89: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

88

<message name="CelsiusToFahrenheitRequest"> <part name="Celsius" type="xs:double"/> </message> <message name="CelsiusToFahrenheitResponse"> <part name="return" type="xs:double"/> </message> <portType name="ITemperature"> <operation name="CelsiusToKelvin"> <input message="CelsiusToKelvinRequest"/> <output message="CelsiusToKelvinResponse"/> </operation> <operation name="CelsiusToFahrenheit"> <input message="CelsiusToFahrenheitRequest"/> <output message="CelsiusToFahrenheitResponse"/> </operation> </portType> <binding name="ITemperaturebinding" type="ITemperature"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="CelsiusToKelvin"> <soap:operation soapAction= "urn:IntfUn-ITemperature#CelsiusToKelvin"/> <input> <soap:body use="encoded" encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:IntfUnITemperature"/> </input> <output> <soap:body use="encoded" encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:IntfUnITemperature"/> </output> </operation> <operation name="CelsiusToFahrenheit"> <soap:operation soapAction= "urn:IntfUn-ITemperature#CelsiusToFahrenheit"/> <input> <soap:body use="encoded" encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/"

Page 90: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

89

namespace="urn:IntfUnITemperature"/> </input> <output> <soap:body use="encoded" encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:IntfUnITemperature"/> </output> </operation> </binding> <service name="ITemperatureservice"> <port name="ITemperaturePort" binding="ITemperaturebinding"> <soap:address location= "http://localhost/scripts/ DTemperaturePr.dll/soap/ITemperature"/> </port> </service></definitions>

Использовать данный Web-сервис можно разными способами, на-пример, обратиться к нему с Web-страницы, содержащей код на одномиз скриптовых языков. С другой стороны, это можно сделать из клиент-ского приложения, разработанного, в частности, средствамиDelphi.

Создание SOAP-клиента

При создании клиентского приложения, пользующегося Web-сервисом, следует иметь доступ к WSDL-файлу, описывающему данныйсервис.

Сначала запустим Delphi 6 и создадим проект обычного Windows-приложения. Затем, выбрав из среды разработки пункт меню File | New |Other, откроем репозиторий объектов и выберем в нем на странице WebServices пиктограмму Web Service Importer.

Далее в строке WSDL or XML Schema Location (Filename or URL)диалогового окна Web Services Import следует ввести URL WSDL-файлаc описанием выбранного Web-сервиса:

C:\Inetpub\Scripts\DTemperature.wsdlПосле этого среда разработки обратится по указанному адресу к

этому файлу и на его основе сгенерирует модуль, содержащий интер-фейс для активизации Web-сервиса и доступа к его методам (наследник

Page 91: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

90

интерфейса IInvokable). В результате сгенерированный код имеет сле-дующий вид (листинг 5.9).

Листинг 5.9

Unit WSUn;

interface

uses Types, XSBuiltIns;type

ITemperature = interface(IInvokable) ['{D304BAA1-ECD5-11D6-959A-0080AD8A8296}'] function CelsiusToKelvin(const Celsius: Double): Double; stdcall; function CelsiusToFahrenheit(const Celsius: Double): Double; stdcall; end;

implementation

uses InvokeRegistry;

initializationInvRegistry.RegisterInterface(TypeInfo( ITemperature), 'urn:IntfUn-ITemperature', '');

end.

Далее необходимо предусмотреть в приложении наличие объекта,отвечающего за удаленную активизацию Web-сервиса и, следовательно,хранящего сведения о его местоположении. Для этой цели в палитрекомпонентов на странице Web Services имеется компонент THTTPRIO(RIO означает Remote Invokable Object). Поместим этот компонент наформу и его свойству WSDLLocation присвоим URL WSDL-описанияWeb-сервиса. После этого установим значения свойства Service (этосвойство содержит список интерфейсов, предоставляемых Web-сервисом, причем их имена уже имеются в сгенерированном интер-фейсном модуле) или свойства Port (содержит имя порта, определенно-го в WSDL-файле и устанавливающего местоположение Web-сервиса).Среда разработки снова обратится к WSDL-описанию Web-сервиса,

Page 92: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

91

получив на его основе сведения о местоположении сервиса и его интер-фейсах.

Фрагмент WSDL-файла, содержащий эти сведения, выглядит сле-дующим образом:

<service name="ITemperatureservice"> <port name="ITemperaturePort" binding="ITemperaturebinding"> <soap:address location= "http://localhost/scripts/ DTemperaturePr.dll/soap/ITemperature"/> </port>

Следующим шагом является создание пользовательского интер-фейса клиентского приложения. Он состоит из одной формы, показан-ной на рисунке 5.7. Полностью код клиента приведен в листинге 5.10.

Рис. 5.7

Листинг 5.10

unit MainUn;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ExtCtrls, Rio, SoapHTTPClient;

type

Page 93: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

92

TForm1 = class(TForm) HTTPRIO1: THTTPRIO; Celsius: TLabeledEdit; Kelvin: TLabeledEdit; Fahrenheit: TLabeledEdit; CalcBtn: TButton; procedure CalcBtnClick(Sender: TObject); private { Private declarations } public { Public declarations } end;

var Form1: TForm1;

implementation

uses WSUn;

{$R *.dfm}

procedure TForm1.CalcBtnClick(Sender: TObject);var tCels:double; Temp:ITemperature;begin tCels:=strtofloat(Celsius.Text); Temp:=HTTPRIO1 as ITemperature; Kelvin.Text:= floattostr(Temp.CelsiusToKelvin(tCels)); Fahrenheit.Text:= floattostr(Temp.CelsiusToFahrenheit(tCels));end;

end.

Для отладки процесса взаимодействия клиента с Web-сервисомможно использовать Trace Utility из пакета MSSOAP Toolkit. Выполнивсоответствующие действия по аналогии с п. 5.1, можно увидеть данные,которыми обмениваются клиент и Web-сервис (рис. 5.8).

Page 94: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

93

Рис. 5.8

Таким образом, существующий инструментарий предоставляетдостаточно развитые средства для разработки собственных Web-сервисов и приложений для взаимодействия с ними. ИспользованиеWeb-сервисов и технологии Web-служб закладывает новую парадигмуразработки распределенных прикладных систем для глобальных сетейи, по существу, обозначает переход от Web как средства представленияинформации к Web как среде программирования [21].

Page 95: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

94

ЛИТЕРАТУРА

1. Архангельский А.Я. Delphi 6. Справочное пособие. М., 2001. 1024 с.2. Архангельский А.Я. Программирование в Delphi 6. М., 2001. 1120 с.3. Боркус В. Корпоративные порталы: от интерфейса пользователя к

бизнес-процессам // PC Week / RE. 2002. № 34.4. Браун М.Р., Хоникатт Дж. и др. Использование HTML 4.0.

Специальное издание: Пер. с англ. М.; СПб.; Киев, 2000. 784 с.5. Буч Г. Объектно-ориентированный анализ и проектирование с при-

мерами приложений на С++. М.; СПб., 1998. 560 с.6. Вавилов К., Щербина С. Web-интеграция // Открытые системы.

2001. № 1.7. Гофман В.Э., Хомоненко А.Д. Delphi 6. СПб., 2002. 1152 с.8. Грейвс М. Проектирование баз данных на основе XML.

М., 2002. 640 с.9. Грин Г. Введение в ASP. –

http://www.citforum.ru/internet/asp/asp_intro.shtml.10. Дейтел Х.М., Дейтел П.Дж., Нието Т.Р. Как программировать для

Internet & WWW: Пер.с англ. М., 2002. 1184 с.11. Елманова Н. Delphi 6 и Web-сервисы. – http://www.interface.ru.12. Зайцев О. Создание Web-сервера на Delphi. –

http://z-ol.chat.ru/websrv.htm.13. Закурдаев С. Сетевая архитектура WebNet // Сети. 1998. № 1.14. Календарев А. Использование XML в среде Delphi. –

http://www.edocs.al.ru.15. Канту М., Гуч Т., Лэм Дж. Delphi: Руководство разработчика:

Пер. с англ. Киев, М., 1999. 752 с.16. Качанов А. Использование XML / XSL для публикации в Web. –

http://webmascon.com.17. Колесов В. Организация работы Web-сервисов // Byte Magazine On-

line. – http://www.bytemag.ru.18. Коналлен Дж. Разработка Web-приложений с использованием UML.

М., 2001. 288 с.19. Красюк Д. Основы языка разметки HTML. 2001. –

http://about-html.narod.ru.20. Ложечкин А.В. Интеграция приложений для электронной коммер-

ции с использованием Microsoft BizTalk 2000. Новейшие техноло-гии. М., 2002. 368 с.

21. Ложечкин А.В. Необходимость Web-служб // Открытые системы.2001. № 11.

22. Паттерсон Л., Шарльворс С., Корнелиус Дж. и др. ИспользованиеHTML 4: Пер. с англ. М., 2001. 400 с.

Page 96: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

95

23. Питц-Моултис Н., Кирк Ч. XML: Пер. с англ. СПб., 2001. 736 с.24. Сальников И. MS SOAP и его возможности // Программист.

2002. № 1.25. Сальников И. Схемы XML: контроль качества // Программист.

2001. № 12.26. Семенов Д. MIME. Медиа типы и подтипы. –

http://www.nest.vinnica.ua/~sem/.27. Сокольский М.В. Все об Intranet и Internet. М., 1998. 256 с.28. Тейбор Р. Реализация XML Web-служб на платформе

Microsoft.NET. М., 2002. 448 с.29. Тейксейра С., Пачеко К. Delphi 5. Руководство разработчика. Т.1.

Основные методы и технологии программирования: Пер. с англ. М.,2000. 832 с.

30. Тейксейра С., Пачеко К. Delphi 5. Руководство разработчика. Т.2.Разработка компонентов и программирование баз данных: Пер. сангл. М., 2000. 992 с.

31. Трейвис Б. XML и SOAP: программирование для серверов BizTalk.Новейшие технологии. М., 2001. 496 с.

32. Федоров А. Web нового поколения – Web-сервисы. –http://www.webmascon.com.

33. Храмцов П. Новые технологии информационного сервиса в Internet:Common Gateway Interface – средство расширения возможностейWorld Wide Web – технологии // Учебные материалы конференции«Индустрия программирования – 96». -http://www.citforum.ru/programming/khramtsov/cgi.shtml.

34. Черный А. Описание протокола HTTP. –http://www.angel107.webservis.ru/internet/http.html.

35. Черняк Л. Самообслуживание в информационных системах // От-крытые системы. 2002. № 10.

36. Шапошников И.В. Интернет-программирование. СПб., 2000. 224 с.37. Шапошников И.В. Справочник Web-мастера. XML. СПб.,

2001. 304 с.38. Язык XML: назначение и область применения. – http://www.i2r.ru.39. Network Working Group. Request For Comment: 2068, Hypertext

Transfer Protocol HTTP / 1.1.40. Simple Object Access Protocol (SOAP) 1.1. – http://www.w3c.org.

Page 97: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

96

СОДЕРЖАНИЕ

ПРЕДИСЛОВИЕ................................................................................

1. СТРУКТУРИЗАЦИЯ И ИНТЕГРАЦИЯ СЕРВИС- ОРИЕНТИРОВАННЫХ СИСТЕМ НА ОСНОВЕ WEB-ТЕХНОЛОГИЙ

1.1. Развитие информационных услуг в современных компьютерных системах............…….... 1.2. Информационные сервисы в Internet……………........... 1.3. Web-технология и Web-системы……….......................... 1.4. Расширение функциональных возможностей Web-сервера……………………………... 1.5. Развитие сервис-ориентированной архитектуры и интеграция прикладных систем……….. 1.6. Web-интеграция прикладных систем на основе XML и Web-служб……………………………

2. ОРГАНИЗАЦИЯ ВЗАИМОДЕЙСТВИЙ

НА ОСНОВЕ ПРОТОКОЛА HTTP................................................... 2.1. Простейший Web-клиент...……….................................... 2.2. Принципы организации Web-сервера….……….............. 2.3. Организация взаимодействий в Web-системах через прокси-сервер……………........................................

3. РАСШИРЕНИЯ КАК СРЕДСТВО ПОВЫШЕНИЯ

ФУНКЦИОНАЛЬНОСТИ WEB-СЕРВЕРА….............................…..... 3.1. Общее описание расширений………..………………....... 3.2. Использование интерфейса CGI………………………..... 3.3. Создание CGI-приложений средствами Delphi……….....

3

5

568

10

11

13

181824

34

40404146

Page 98: ОРГАНИЗАЦИЯ WEB-ВЗАИМОДЕЙСТВИЙ В СЕРВИС ...lib.yar.ru/yarcln/edoc/yarsu/pdf/191100.pdf · 2004-11-24 · приложениями в распределенных

97

4. XML КАК СРЕДСТВО ОБМЕНА СТРУКТУРИРОВАННЫМИ ДАННЫМИ В WEB-ВЗАИМОДЕЙСТВИЯХ………………………………

4.1. XML-документ как средство структурирования передаваемых данных………….…... 4.2. Использование XML в Web-взаимодействиях..................

5. ОРГАНИЗАЦИЯ ВЗАИМОДЕЙСТВИЙ

НА ОСНОВЕ WEB-СЕРВИСОВ…………………………………... 5.1. Организация взаимодействия приложений и Web-сервисов с использованием средств пакета MSSOAP Toolkit………………………………………………. 5.2. Организация взаимодействия клиентов и Web-сервисов с использованием компонентов Delphi…………………........

ЛИТЕРАТУРА..................................................................................

53

5361

72

72

84

94