Добавлен: 28.06.2023
Просмотров: 61
Скачиваний: 2
$mode = 'books';
$page=intval($page); // pages и browseNodes - числа
$browseNode = intval($browseNode);
$search = safeString($search);
if(!isset($_SESSION['cart']))
{
session_register('cart');
$_SESSION['cart'] = array();
}
// эти действия должны быть выполнены до того,
// как будет показан верхний раздел
addToCart($_SESSION['cart'], $ASIN, $mode);
if($action == 'deletefromcart')
deleteFromCart($_SESSION['cart'], $ASIN) ;
if($action == 'emptycart')
$_SESSION['cart'] = array();
// просмотр верхнего раздела
require_once ('topbar.php');
switch ($action)
{
case 'detail' :
showCategories($mode);
showDetail($ASIN, $mode);
break;
case 'addtocart' :
case 'deletefromcart' :
case 'emptycart' :
case 'showcart' :
echo '<hr /><h1>покупательская корзина</h1>';
showCart($_SESSION['cart'], $mode);
break;
case 'image' :
showCategories($mode);
echo '<h1>увеличенное изображение товара</h1>';
showImage($ASIN, $mode);
break;
case 'search' :
showCategories($mode);
echo "<h1>результат поиска '$search'</h1>";
showSearch($search, $page, $mode);
break;
case 'browsenode':
default:
showCategories($mode);
$category = getCategoryName($browseNode);
if(!$category||$category=='Best Selling Books')
{
echo '<h1>бестселлеры</h1>';
}
else
{
echo "<h1>бестселлеры в категории $category</h1>";
}
showBrowseNode($browseNode, $page, $mode) ;
break;
}
require ('bottom.php');
?>
Данные сценарий начинается с создания HTTP-сеанса. При этом покупательская корзина сохраняется в виде переменной HTTP-сеанса. После этого подключаются несколько сценариев, каждый из которых определяет набор переменных и констант, используемых в приложении. В листинге 4 приведен список констант.
Листинг 4. Используемые константы[9]
<?php
// это приложение будет работать по методу REST (XML поверх HTTP) или SOAP
define('METHOD', 'REST');
// константы для создания кэша
define('CACHE', 'cache'); // путь к кэшируемым файлам
define('ASSOCIATEID', 'webservices-20'); // установить ID
define('DEVTAG', 'DHBIBVFDMBJDL'); // установить DEVTAG
if(DEVTAG=='XXXXXXXXXXXXXX')
{
die ('необходимо зарегистрироваться для использования Web-служб Amazon
<a href = "https://associates.amazon.com/exec/panama/associates/
join/developer/application.html/ref=sc_bb_l_0/002">Amazon</a>
');
}
// закрытый список категорий товаров
$categoryList = array(5=>'Computers & Internet', 3510=>'Web Development',
295223=>'PHP', 17=>'Literature and Fiction',
3=>'Business & Investing', 53=>'Non Fiction',
23=>'Romance', 75=>'Science', 21=>'Reference',
6 =>'Food & Wine', 27=>'Travel',
16272=>'Science Fiction'
);
?>
В основном сценарии находится ряд вспомогательных операций и главный цикл обработки событий. Также в примере используются однотипные решения, обеспечивающие некоторую стандартность в подходах к решению поставленных задач.
3. Практическая работа с SOAP в PHP
Главным преимуществом технологии SOAP перед технологией XML-RPC является поддержка типов данных, которые могут определяться пользователем.[10] Эти типы данных могут быть описаны и проверены с помощью XML-схемы. Например, реализация PEAR SOAP обеспечивает автоматическое преобразование пользовательских типов в классы PHP.
Технология SOAP также является идеальным примером того, что простая идея не всегда означает простую реализацию.[11] SOAP сообщение состоит из конверта, содержащего заголовок и тело.[12] Имена всех элементов в SOAP-документе определены, что хотя и повышает надежность, но затрудняет восприятие получившегося XML-документа человеком. На верхнем уровне иерархии находится конверт (envelope), представляющий собой контейнер для SOAP-сообщения. Он располагается в пространстве имен xmlsoap, что, как правило, указывается в его полном имени и последующем объявлении пространства имен.
SOAP неявно использует язык XML-схемы (XML Schema), представляющий собой язык для определения и проверки структур данных на основе XML. Согласно стандарту пространство имен для элементов XML-документа описывается в отдельном файле, содержащим XML-схему и также являющимся XML-документом. В листинге 1 представлен пример реализации SOAP-клиента, предназначенного для работы с Web-службами.
Листинг 1. Вызов Web-службы с помощью SOAP
<?php
require_once 'SOAP/Client.php';
$url = 'http://soap.amazon.com/schemas2/AmazonWebServices.wsdl';
$client = new SOAP_Client($url, true);
class AuthorRequest implements SchemaTypeInfo {
public $author;
public $page;
public $mode;
public $tag;
public $type;
public $devtag;
public $sort;
public $variations;
public $locale;
public static function getTypeName()
{ return 'AuthorRequest';}
public static function getTypeNamespace()
{ return 'http://soap.amazon.com';}
}
// присвоить значения переменным
$authreq = new AuthorRequest;
$authreq->author = 'schlossnagle';
$authreq->mode = 'books';
$authreq->type = 'lite';
$authreq->devtag = 'D3J98F4T2LIT7G';
// создать экземпляр soap-клиента
$client->AuthorSearchRequest($authreq);
$params = array(
'author' => 'schlossnagle',
'page' => 1,
'mode' => 'books',
'tag' => 'webservices-20',
'type' => 'lite',
'dev-tag' => 'D7J91F8T2LIT7Н',
);
// вызов Web-службы
$result = $client->AuthorSearchRequest($authreq)->deserializeBody();
foreach ($result->Details as $detail) {
print "Title: $detail->ProductName, ASIN: $detail->Asin\n";
}
Протокол SOAP дополняется языком WSDL (Web Service Definition Language - язык определения Web-служб)[13]. Технология WSDL также представляет собой язык, основанный на XML, и используется для описания функциональности и способов взаимодействия с Web-службами. Язык WSDL также интенсивно использует пространства имен.
В PEAR, официальном хранилище пакетов для PHP, можно найти расширение для SOAP[14]. SOAP-расширение для PHP зависит от других пакетов, поэтому потребуется установить и используемые им пакеты.
Следует отметить, что для практической реализации Web-службы к классу, реализующему Web-службу (класс SOAP_SERVER), обычно требуется добавить код для установки значений параметров и реализацию бизнес-логики[15].
В листинге 2 рассматривается фрагмент функции browseNodeSearch, использующей протокол SOAP для вызова Web-службы компании Amazon.
Листинг 2. Фрагмент функции browseNodeSearch для работы с SOAP
function browseNodeSearch($browseNode, $page, $mode)
{
if(METHOD=='SOAP')
{
// инициализация soap-клиента
$soapclient = new soapclient(
'http://soap.amazon.com/schemas2/AmazonWebServices.wsdl',
'wsdl');
$soap_proxy = $soapclient->getProxy();
$parameters['mode']=$mode;
$parameters['page']=$page;
$parameters['type']='heavy';
$parameters['tag']=$this->assocID;
$parameters['devtag']=$this->devTag;
$parameters['sort']='+salesrank';
$parameters['browse_node'] = $browseNode;
// выполнение soap-запроса
$result = $soap_proxy->BrowseNodeSearchRequest($parameters);
// проверка на ошибки, возникшие в ходе выполнения запроса
if(isSOAPError($result))
return false;
// обработка полученных результатов
$this->totalResults = $result['TotalResults'];
foreach($result['Details'] as $product)
{
$this->products[] = new Product($product);
}
// освобождение использованных ресурсов
unset($soapclient);
unset($soap_proxy);
}
else
{
// выполнение запроса по технологи REST
}
return $this->products;
}
В представленном фрагменте кода не используется никаких вспомогательных функций, все выполняется «здесь и сейчас». SOAP-клиент выполняет все необходимые действия самостоятельно. При создании SOAP-клиента, ему передаются два параметра. Первый параметр содержит URL-адрес документа, а второй параметр сообщает клиенту тип этого документа (WSDL). В строке, представленной ниже[10]:
$soap_proxy = $soapclient->getProxy();
создается прокси-класс для вызова Web-службы на основе информации, хранящейся в WSDL-документе. Этот класс будет содержать методы, соответствующие методам Web-службы, после чего с Web-службой можно будет взаимодействовать так, как если бы она была локальным классом PHP. Далее определяется массив параметров, которые будут передаваться в запросе.
Вызвать Web-службу можно, просто используя прокси-класс и передав ему массив параметров, как показано ниже.
$result = $soap_proxy->BrowseNodeSearchRequest($parameters)[9];
При этом данные, хранящиеся в переменной result, представляют собой массив, записи из которого можно преобразовать в объекты типа Product и, в свою очередь, сохранить в массиве products класса AmazonResultSet.
Файлы с кэшированными запросами получают имена, основанные на значениях параметров, присутствующих в запросе. При такой реализации извлечение результирующего набора данных из кэша потребует доли секунды, а для реального выполнения запроса к удаленному Web-сайту потребовалось бы порядка 10-12 секунд.[8]
Кэширование начальной страницы. В этом разделе рассматривается организация кэширования для сайта, применяющего регистрацию пользователей и предоставляющего ряд служб. Представленный исходный код учитывает требования, предъявляющиеся к приложениям подобного рода. Для сложных и масштабных Web-сайтов обычно требуется обеспечить хорошую пропускную способность и одновременно сократить нагрузку на базу данных. Пример кода для реализации кэширования в подобных системах приведен в листинге 3.
Листинг 3. Организация кэширования для нагруженных Web-сайтов
<?php
require 'Project.inc';
try {
$name = $_GET[name];
if(!$name) {
throw new Exception();
}
$project = new Project($name);
}
catch (Exception $e) {
// при возникновении ошибки перенаправлять на этот адрес
header("Location: /index.php");
return;
}
$cache = new Cache::File(Project::get_cachefile($name));
$cache->begin();
?>
<html>
<title><?= $project->name ?></title>
<body>
<!-- шаблон содержания страницы -->
<table>
<tr>
<td>Author:</td><td><?= $project->author ?>
</tr>
<tr>
<td>Summary:</td><td><?= $project->short_description ?>
</tr>
<tr>
<td>Availability:</td><td><a href="<?= $project->file_url ?>">click here</a></td>
</tr>
<tr>
<td><?= $file->long_description ?></td>
</tr>
</table>
</body>
</html>
<?php
$cache->end();
?>
В представленном листинге HTML-страница представляет собой шаблон, в который помещаются подробные данные о проекте. Это позволяет легко обеспечить стандартное отображение для всех страниц Web-сайта, что положительно сказывается на масштабируемости. Имя проекта передается на страницу в виде GET-параметра, а затем используется при генерации содержимого страницы.
Таким образом, были рассмотрены вопросы, относящиеся к реализации SOAP-клиента на основе библиотеки PEAR::SOAP для вызова Web-служб, а также продемонстрированы несколько подходов к организации кэширования информации – как для результатов запросов, полученных от Web-служб, так и для простых HTML-страниц с динамическим содержимым, использующихся в приложениях с высоким уровнем нагрузки.
ЗАКЛЮЧЕНИЕ
В результате проделанной работы решены следующие задачи: рассмотрены теоретические аспекты использования SOAP; проведен анализ использования SOAP; описана практическая работа с SOAP в PHP.
SOAP расшифровывается как Simple Object Access Protocol (Простой Протокол Доступа к Объектам). SOAP в теперешней его форме – это метод удаленного вызова (RPC, Remote procedure Call) по сети.
SOAP – это стандарт, который позволяет описать такой удаленный вызов и вид, в котором будет возвращаться результат. Таким образом нужно разместить функцию в приложении, доступном по сети и получать вызовы в виде SOAP пакетов. После этого валидируются входные данные, запускается функция и возвращается результат в новом SOAP пакете. Весь процесс может работать через HTTP.
Главным преимуществом технологии SOAP перед технологией XML-RPC является поддержка типов данных, которые могут определяться пользователем. Эти типы данных могут быть описаны и проверены с помощью XML-схемы. Например, реализация PEAR SOAP обеспечивает автоматическое преобразование пользовательских типов в классы PHP.
Технология SOAP также является идеальным примером того, что простая идея не всегда означает простую реализацию. SOAP сообщение состоит из конверта, содержащего заголовок и тело. Имена всех элементов в SOAP-документе определены, что хотя и повышает надежность, но затрудняет восприятие получившегося XML-документа человеком. На верхнем уровне иерархии находится конверт (envelope), представляющий собой контейнер для SOAP-сообщения. Он располагается в пространстве имен xmlsoap, что, как правило, указывается в его полном имени и последующем объявлении пространства имен.
SOAP неявно использует язык XML-схемы (XML Schema), представляющий собой язык для определения и проверки структур данных на основе XML. Согласно стандарту пространство имен для элементов XML-документа описывается в отдельном файле, содержащим XML-схему и также являющимся XML-документом.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
- Стандарт SOAP - http://www.w3.org/TR/soap/
- Спецификация XML, http://www.w3.org/TR/xml
- Спецификация WSDL версия 1.1, http://www.w3.org/TR/wsdl
- Спецификация WSDL версия 2.0, http://www.w3.org/TR/wsdl20
- Спецификация UDDI версия 3, http://uddi.org/pubs/uddi_v3.htm
- SOAP Версия 1.2 Часть 0: Учебник для начинающих : http://www.w3.org/2002/07/soaptranslation/russian/part0.html
- Хабибуллин И.Ш. Разработка Web-служб средствами Java. — СПб. : БХВ-Петербург, 2015. — 400 с: ил.
- Технологии и средства консолидации информации: Учебное пособие. Деревянко А.С., Солощук М.Н. - Харьков: НТУ "ХПИ", 2013. - 432c.
- Arulazi Dhesiaseelan, “What's new in WSDL 2.0”, http://www.xml.com/pub/a/ws/2004/05/19/wsdl2.html
- Apache Axis2, http://ws.apache.org/axis2
- S. W. Eran Chinthaka, “Axis2: The Next Generation of Apache Web Services”, http://today.java.net/pub/a/today/2006/09/07/axis2-next-generation-web-services.html
- Ajith Ranabahu, “Inside the Axis2 Code Generator”, http://wso2.org/node/35
- WSDL4R, http://dev.ctor.org/soap4r
- NET Web Service Description Language Tool, http://msdn2.microsoft.com/enus/library/7h3ystb6(VS.80).aspx
- wsdl2js (Java), http://sourceforge.net/projects/wsdl2js