Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WebServers.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
141.31 Кб
Скачать

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

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

В делфи выбираем: File / New / Other / SOAP Server Application

Тип веб-приложения выбираем в виде исполняемого файла (CGI Stand-alone executable).

Получаем объект TWebModule, содержащий три компонента:

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

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

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

Для создания описания интерфейса веб-сервиса создадим новый модуль и в нем опишем интерфейс IMult, содержащий единственный метод multiply.

Создаем модуль с реализацией метода Multiply (умножение двух чисел).

Сохранив и скомпилировав проект, скопируем полученное приложение в каталог Web-сервера, предназначенный для хранения исполняемых файлов (z://home/localhost/cgi-bin).

Если теперь обратиться из браузера к веб-сервису с параметром /wsdl, получим список реализуемых им интерфейсов. Один из них, IMult, создан нами, другой, IWSDLPublish, реализован в компоненте TWSDLHTMLPublish.

Щелкнув по ссылке, указывающей на интерфейс IMult, можно получить WSDL-описание нашего интерфейса IMult. Cохраним его в файле с расширением .wsdl или .xml в папке localhost/www/my_service. Теперь чтобы обратиться к этому файлу в браузере пишем localhost/my_service/<имя>.wsdl

12. Создание приложений-клиентов средствами Delphi. Структура проекта. Основные компоненты приложения.

Создать новый проект в среде Delphi; добавляем объект WSDL Importer из категории WebServices; в открывшемся окне в поле Location of WSDL File or URL вставить адрес сервиса и нажать Finish. На форме размещаем кнопку, два поля ввода и компонент THTTPRIO, который нужен для связи с конкретным сервисом. В его свойстве WSDLLocation укажем данную строку:

http://MyWebServices.ru/cgi-bin/Proj ectl.ехе/wsdl

/IMulValues

В полях Port и Service выбрать значения из выпадающего списка. В раскрывающемся списке Service выберем единственное значение IMulValuesService, в свойстве Port выберем пункт IMulValuesPort. Записываем обработчик нажатия на кнопку.

procedure TForml.ButtonlClick(Sender: TObject);

var

MulValues: IMulValues;

begin

MulValues := HTTPRIOl as IMulValues;

ShowMessage( IntToStr(

MulValues.MulValues(StrToInt(Editl.Text), StrToInt (Edit2 .Text) ) ) )';

end;

К этому модулю надо добавить ссылку на модуль InvMul с описанием интерфейса IMulValues. При нажатии на кнопку произойдет обращение к нашему SOAP-серверу и в окне-сообщении выведется результат умножения двух чисел.

  1. Создание rpc-сервиса и приложения-клиента с использованием языка программирования php. Использование php для разбора xml-документов.

Для создания приложений-клиентов и приложений-сервисов на языке PHP используется специальная библиотека скриптов. Основой обоих приложений является файл xmlrpc.php.

Для серверной части описание функций содержится в файле api.php

Клиентская часть содержит код для вызова удаленных функций сервиса (RPC).

Клиентский код запроса имеет следующий вид:

//формируем запрос, по какому адресу, вызываем функцию с данными параметрами

list ($s, $response) = XMLRPC_request

($site,

$location,

'getSum',

array(XMLRPC_prepare($query_info), '')

);

В переменную $responce записывается ответ.

Переменная $location содержит путь к серверной части.

getSum - имя функции.

array(XMLRPC_prepare($query_info),'') - массив $query_info содержит значения входных параметров

Для сервера:

Краткое описание того, что происходит в server.php:

1. Подключаемся к MySQL и предоставляем скрипту доступ к БД.

2. Подключаем kd_xmlrpc.php: теперь мы можем использовать функции Кейта.

3. Подключаем web_service_api.php, где определяются XML-RPC-методы.

4. Для того чтобы забрать содержимое $GLOBALS['HTTP_RAW_POST_DATA'], где хранится запрос от XML-RPC-клиента, и переконвертировать параметры XML в PHP-переменные используем функцию XMLRPC_parse().

5. Определим, какой метод вызывается функцией XMLRPC_getMethodName(). Мы хотим, чтобы наш XML-RPC-сервер мог выполнять больше чем одну задачу (здесь задача=метод=функция) и как раз здесь-то мы и определяем, какой из методов будет обрабатывать текущий запрос (например, "news.getNewsList" или "news.viewNewsItem").

6. Проверим, какие параметры передавал клиент в своём запросе (например, id новости).

7. Проверяем, существует ли метод (а это описано в web_service_api.php), и если всё в порядке, то этот метод (он же PHP-функция) и выполняется. Если метод не найден, передаём управление в метод по умолчанию "method_not_found".

Специфические XML-RPC-функции, задействованные в этом скрипте:

1. XMLRPC_parse(): эта функция получает XML-данные и преобразует их в переменные PHP - то есть XML из запроса преобразован в удобоваримую для PHP форму. На данном этапе нет ничего, взятого непосредственно из спецификации стандарта XML-RPC: любые полученные XML-данные преобразуются в переменные PHP.

2. XMLRPC_getMethodName(): определяет, какой метод нужно задействовать, то есть мы узнаём, какую PHP-функцию вызывать.

3. XMLRPC_getParams(): получает XML-RPC-параметры и преобразует их в переменные PHP.

Краткое описание того, что происходит в web_service_api.php:

1. Сначала мы создали PHP-массив $xmlrpc_methods, где хранится список всех доступных XML-RPC-методов и соответствующих им функций PHP.

2. Функция mysql_datetime_to_timestamp() по сути не является XML-RPC-методом; эта функция нужна для конвертирования MySQL-поля "дата-время" в формат, с которым сможет работать PHP.

3. Затем определяем функцию news_getNewsList() для отправки запросов к таблице "kd_xmlrpc_news". Функция может принимать в качестве аргумента массив $query_info, с параметрами, которые может послать XML-RPC-клиент. Эти параметры могут повлиять на запрос к БД, изменяя опции "ORDER BY" и "LIMIT".

4. Функция news_viewNewsItem() используется для того, чтобы выдернуть из БД одну новость и принимает в аргумент только одну переменную/параметр: $news_id, содержащий id новости в БД.

5. Последняя функция XMLRPC_method_not_found() - это функция по умолчанию, которая генерит ответ в том случае, когда клиент запрашивает несуществующий XML-RPC-метод.

Специфические XML-RPC-функции, задействованные в этом скрипте:

1. XMLRPC_convert_timestamp_to_iso8601(): XML-RPC использует особенный формат обозначения даты и времени. Данная функция просто берёт timestamp в PHP и преобразует его в формат, применяемый в XML-RPC.

2. XMLRPC_prepare(): эта функция берёт набор переменных PHP и преобразует их в параметры

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

3. XMLRPC_response(): данная функция используется для отправки ответа клиенту. Функция принимает два аргумента: XML-RPC-данные (сгенерённые функцией XMLRPC_prepare()),. и факультативно имя XML-RPC-сервера или user agent, например, KD_XMLRPC_USERAGENT - здесь можно поставить всё что угодно.

4. XMLRPC_error(): генерирует ответ XML-RPC-сервера с применением специальных тэгов с сообщением об ошибке, которые определены в спецификации стандарта.

Для клиента:

Что происходит в скрипте "kd_xmlrpc.php"?

Здесь PHP-код - это простое ветвление if/else: то есть если мы решим просмотреть одну конкретную новость и используем переменную $_GET['news_id'], то скрипт покажет эту новость. В противном случае будет показан список всех новостей.

Для просмотра списка новостей мы используем метод news.getNewsList. Заметьте, что $query_info['limit'] выставлен на 10 (то есть нам нужно максимум 10 новостей), а $query_info['order'] - на значение "author" (то есть сортировка новостей по имени автора). Эти две переменные станут параметрами, которые отправит XML-RPC-клиент в своём запросе.

При просмотре одной новости целиком, в параметр мы преобразуем $_GET['news_id']; по этому параметру сервер сможет определить, какую новость мы желаем получить.

Специфические XML-RPC-функции, задействованные в этом скрипте:

1. XMLRPC_prepare(): раньше мы использовали её в сервере, и здесь также конвертируем переменные PHP в XML-RPC-параметры. Именно здесь мы фиксируем данные, которые понадобятся серверу для работы запрашиваемого метода.

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

А) $site - доменное имя сервера

Б) $location - путь к скрипту сервера от web-корня

В) $methodName - имя запрашиваемого XML-RPC-метода

Г) $params - любые необходимые для работы метода переменные

Д) $user_agent - необязательный аргумент, и здесь может быть всё, что вам заблагорассудится (например, HarryFsXMLRPCClient).

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

3. XMLRPC_convert_iso8601_to_timestamp: нашей функцией convert_date() мы преобразуем дату и время из формата XML-RPC в нечто более приглядное, а timestamp от PHP используем в качестве перевалочного пункта.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]