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

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

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

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

Добавлен: 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-документом.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  1. Стандарт SOAP - http://www.w3.org/TR/soap/
  2. Спецификация XML, http://www.w3.org/TR/xml
  3. Спецификация WSDL версия 1.1, http://www.w3.org/TR/wsdl
  4. Спецификация WSDL версия 2.0, http://www.w3.org/TR/wsdl20
  5. Спецификация UDDI версия 3, http://uddi.org/pubs/uddi_v3.htm
  6. SOAP Версия 1.2 Часть 0: Учебник для начинающих : http://www.w3.org/2002/07/soaptranslation/russian/part0.html
  7. Хабибуллин И.Ш. Разработка Web-служб средствами Java. — СПб. : БХВ-Петербург, 2015. — 400 с: ил.
  8. Технологии и средства консолидации информации: Учебное пособие. Деревянко А.С., Солощук М.Н. - Харьков: НТУ "ХПИ", 2013. - 432c.
  9. Arulazi Dhesiaseelan, “What's new in WSDL 2.0”, http://www.xml.com/pub/a/ws/2004/05/19/wsdl2.html
  10. Apache Axis2, http://ws.apache.org/axis2
  11. 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
  12. Ajith Ranabahu, “Inside the Axis2 Code Generator”, http://wso2.org/node/35
  13. WSDL4R, http://dev.ctor.org/soap4r
  14. NET Web Service Description Language Tool, http://msdn2.microsoft.com/enus/library/7h3ystb6(VS.80).aspx
  15. wsdl2js (Java), http://sourceforge.net/projects/wsdl2js