Файл: Использование SOAP.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 28.06.2023

Просмотров: 65

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Обрабатывая сообщение, SOAP узел берет на себя одну или более ролей, которые влияют на то, как обрабатываются SOAP заголовки[1]. Ролям даются уникальные имена (в форме URI), таким образом, они могут быть идентифицированы во время обработки. SOAP узел, получив сообщение для обработки, сначала должен определить, какие роли он будет выполнять. Для этого он может проверить SOAP сообщение.

Как только он определится с ролями, которые будет выполнять, SOAP узел должен обработать все обязательные заголовки (отмеченные mustUnderstand="1"), направленные на одну из его ролей[14]. Также SOAP узел может выбрать для обработки любой необязательный заголовок (отмеченный mustUnderstand="0"), направленный на одну из его ролей.

SOAP 1.1 определяет только одну роль - http://schemas.xmlsoap.org/soap/actor/next (next для краткости)[4]. Каждый SOAP узел должен принять роль next. Таким образом, когда SOAP сообщение приходит в любой данный SOAP узел, узел должен обработать все обязательные заголовки, нацеленные на роль next, и он может обработать необязательные заголовки, также нацеленные на роль next. Кроме next, SOAP 1.2 определяет еще несколько ролей, приложениям разрешено также определять собственные роли.

SOAP заголовки нацеливаются на конкретные роли с помощью глобального атрибута actor (в SOAP 1.2 этот атрибут назван role). Если этого атрибута нет, заголовок по умолчанию нацеливается на конечного получателя. Следующее SOAP сообщение иллюстрирует, как использовать actor[10]:

<soap:Envelope

xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

<soap:Header>

<wsrp:path xmlns:wsrp="http://schemas.xmlsoap.org/rp"

soap:actor="http://schemas.xmlsoap.org/soap/actor/next"

soap:mustUnderstand="1"

>

...

Поскольку заголовок wsrp:path нацелен на роль next и помечен как обязательный (mustUnderstand="1"), первый SOAP узел, получающий это сообщение, должен обработать его в соответствии со спецификацией блока заголовка, в данном случае WS-Routing. Если SOAP узел разработан так, что не понимает обязательного заголовка, нацеленного на одну из его ролей, он должен сгенерировать SOAP ошибку с кодом состояния soap:MustUnderstand и прервать обработку[9]. Чтобы определить, что вызвало ошибку в прохождении сообщения, элемент SOAP Fault предоставляет дочерний элемент faultactor[8]. Значением атрибута faultactor является URI, который идентифицирует SOAP узел, вызвавший ошибку.

Если SOAP узел успешно обработал заголовок, требуется удалить этот заголовок из сообщения. SOAP узлам разрешено повторно вставлять заголовки, но это изменяет участников контракта – теперь заголовки targets между текущим и следующим узлами. Если SOAP узел оказывается конечным получателем, он также должен обработать и SOAP тело.


2. Анализ использования SOAP

2.1 Построение каталога товаров

Основная цель при создании каталога товаров сводится к программной реализации Web-интерфейса для взаимодействия с базой данных, при котором применяется входная аутентификация[12]. Для реализации этих функций необходимо обеспечить аутентификацию пользователя при входе в систему, как показано в листинге 1:

Листинг 1. PHP-сценарий для входа в систему.

<?php

require_once('book_sc_fns.php');

do_html_header('Администрирование');

display_login_form();

do_html_footer();

?>[10]

Данный сценарий требует подключения ряда функций, перечисленных в листинге 2.

Листинг 2. Подключение необходимых функций.

<?php

include_once('db_fns.php');

include_once('data_valid_fns.php');

include_once('output_fns.php');

include_once('book_fns.php');

include_once('user_auth_fns.php');

include_once('admin_fns.php');

include_once('order_fns.php');

?>[15]

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

Если в сценарий передается массив с данными о книге, то форма переходит в режим редактирования и поля заполняются информацией о редактируемой книге, загруженной из базы, как показано ниже[11]:

<input type='text' name='price'

value="<?php echo $edit?$book['price']:''; ?>">

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

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

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


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

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

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

Кроме платежной системы и других элементов потребуется административный интерфейс для реализации таких возможностей, как добавление, удаление и редактирование информации о книгах и категориях в базе данных.[5] Чаще всего приходится менять цену на товар, так как в магазинах регулярно проводятся специальные акции или сезонные распродажи. Это приводит к необходимости сохранения не только заказа клиента, но и цены, которая должна быть выплачена за выбранный товар. Отражение в записях только элементов заказа и текущей цены каждого элемента может существенно затруднить работу бухгалтерии.[4] Помимо этого, в такой ситуации при возврате или обмене товара клиенту, возможно, будут возвращены лишние денежные средства, если товары были приобретены по акции. Все это необходимо учесть при реализации системы.


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

2.2 Построение online-каталога товаров

Административный интерфейс позволяет входить в систему и добавлять новые книги и категории.[3] При этом самый простой способ реализовать возможность редактирования и удаления книг и категорий состоит в том, чтобы предоставить администратору отдельную версию сайта, отличную от той, которая доступна пользователю.[1] В этом случае администратор будет иметь возможность просматривать категории и книги, но вместо доступа к покупательской корзине он будет переходить к определенной книге или категории, а затем редактировать или удалять ее.

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

В листинге 1 приведен PHP-сценарий для титульной страницы каталога товаров[2].

Листинг 1. PHP-сценарий online-каталога

<?php

require ('book_sc_fns.php');

// для использования покупательской корзины необходимо запустить HTTP-сеанс

session_start();

do_html_header('Рады видеть Вас в магазине Книголюб!');

echo '<p>Пожалуйста, выберите категорию:</p>';

// извлечь категории из базы данных

$cat_array = get_categories();

// отобразить категории в виде ссылок на соответствующие страницы

display_categories($cat_array);

// если пользователь вошел в систему как администратор, вывести

// ссылки для добавления, удаления и редактирования категорий


if(isset($_SESSION['admin_user']))

{

display_button('admin.php', 'admin-menu', 'Меню администрирования');

}

do_html_footer();

?>

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

Листинг 2. PHP-функции для отображения колонтитулов[7]

<?php

function do_html_header($title = '')

{

// вывод HTML-заголовка

// объявление переменных HTTP-сеанса

if(!$_SESSION['items']) $_SESSION['items'] = '0';

if(!$_SESSION['total_price']) $_SESSION['total_price'] = '0.00';

?>

<html>

<head>

<title><?php echo $title; ?></title>

</head>

<body>

<table width='100%' border=0 cellspacing = 0 bgcolor='#cccccc'>

<tr>

<td rowspan = 2>

<a href = 'index.php'>

<img src='images/Book-O-Rama.gif' alt='Магазин КНИГОЛЮБ' border=0

align='left' valign='bottom' height = 55 width = 325></a>

</td>

<td align = 'right' valign = 'bottom'>

<?php if(isset($_SESSION['admin_user']))

echo '&nbsp;';

else

echo 'Всего книг = '.$_SESSION['items'];

?>

</td>

<td align = 'right' rowspan = 2 width = 135>

<?php if(isset($_SESSION['admin_user']))

display_button('logout.php', 'log-out', 'Выход');

else

display_button('show_cart.php', 'view-cart', 'Показать корзину');

?>

</tr>

<tr>

<td align = right valign = top>

<?php if(isset($_SESSION['admin_user']))

echo '&nbsp;';

else

echo 'Общая сумма = $'.number_format($_SESSION['total_price'],2);

?>

</td>

</tr>

</table>

<?php

if($title)

do_html_heading($title);

}

function do_html_footer()

{

// вывод завершающих HTML-дескрипторов

?>

</body>

</html>

<?php

// дальше идут остальные функции, входящие в библиотеку

}

В листинге 3 рассматривается PHP-сценарий, реализующий самые важные элементы бизнес-процесса.

Листинг 3. Основной PHP-сценарий[8]

<?php

// использование переменной HTTP-сеанса в качестве корзины пользователя

session_start();

require_once('constants.php');

require_once('Product.php');

require_once('AmazonResultSet.php');

require_once('utilityfunctions.php');

require_once('bookdisplayfunctions.php');

require_once('cartfunctions.php');

require_once('categoryfunctions.php');

// массив с названиями входных параметров.

// они пройдут валидацию и будут трансформированы в глобальные переменные.

$external = array('action', 'ASIN', 'mode', 'browseNode', 'page', 'search');

// входные параметры могут быть получены через методы GET или POST.

foreach ($external as $e)

{

if(@$_REQUEST[$e])

$$e = $_REQUEST[$e];

else

$$e = '';

$$e = trim($$e);

}

// значения по умолчанию для глобальных переменных.

if($mode=='')

$mode = 'books'; // товар по умолчанию - книги

if($browseNode=='')

$browseNode = 53; // категория по умолчанию - 53 (бестселлеры)

if($page=='')

$page = 1; // страница по умолчанию - 1

// валидация входных параметров

if(!eregi('^[A-Z0-9]+$', $ASIN)) // ASIN - последовательность символов и цифр

$ASIN ='';

if(!eregi('^[a-z]+$', $mode)) // mode - последовательность символов