Примеры веб-сервиса

Пример 1: Доступ к веб-сервису SberMobile Server из php-скрипта

Этот пример показывает, как получить значение переменной контекста SberMobile Server из скрипта PHP при помощи Веб-сервиса.

<?php
// Creating SOAP client for the server running on localhost
$client = new SoapClient("http://localhost:8080/ws/services/ServerWebService?wsdl");

$username = "admin";
$password = "admin";
$context = "users.admin";
$variable = "childInfo";

try {
// Calling getXML Web Service function and decoding its output by URL decoder
$childInfoXML = urldecode($client->getXML($username, $password, $context, $variable));
} catch(SoapFault $fault) {
echo "Error occurred while calling remote function: " . $fault->faultcode . " (" . $fault->faultstring . ")";
exit();
}

if (is_soap_fault($childInfoXML)) {
echo "Error occurred while calling remote function: " . $fault->faultcode . " (" . $fault->faultstring . ")";
exit();
}

// Creating DOM document from XML
$xml = new DomDocument;
$xml->loadXML($childInfoXML);

// Loading XSLT transformation
$xsl = new DomDocument;
$xsl->load('dataTable.xslt');

// Creating XSLT processor
$proc = new xsltprocessor;
$proc->importStyleSheet($xsl);

// Processing out XML document and and showing the output
echo $proc->transformToXML($xml);
?>

Этот сценарий взаимодействует с веб-службой SOAP и преобразует возвращаемые XML-данные в таблицу HTML с помощью XSLT..

  1. Создание клиента SOAP:

    $client = new SoapClient("http://localhost:8080/ws/services/ServerWebService?wsdl");

    Эта строка создает новый экземпляр класса SoapClient в PHP, указывая на файл WSDL (язык описания веб-сервисов) для ServerWebService, размещенного на localhost на порту 8080.

  2. Настройка учетных данных и параметров:

    $username = "admin";
    $password = "admin";
    $context = "users.admin";
    $variable = "childInfo";
  3. Вызов функции веб-сервиса getXML:

    try {
       // Calling getXML Web Service function and decoding its output by URL decoder
       $childInfoXML = urldecode($client->getXML($username, $password, $context, $variable));
    } catch(SoapFault $fault) {
       echo "Error occurred while calling remote function: " . ...
    }

    if (is_soap_fault($childInfoXML)) {
       echo "Error occurred while calling remote function: " . ...
    }

    Выполните вызов метода getXML веб-сервиса с учетными данными (admin, admin) и параметрами (users.admin, childInfo). Если во время этого процесса произойдет ошибка (например, сбой аутентификации или проблемы с сетью), она будет поймана как SoapFault, и будет выведено сообщение об ошибке.

    Возвращенная XML-строка затем декодируется в URL, поскольку она была закодирована в соответствии с RFC 1738 для безопасной передачи по SOAP.

  4. Создание DOM-документа из XML-строки и загрузка XSLT-преобразования:

    $xml = new DomDocument;
    $xml->loadXML($childInfoXML);
    $xsl = new DomDocument;
    $xsl->load('dataTable.xslt');

Создайте два объекта DOMDocument - один для хранения полученных XML-данных, а другой для загрузки таблицы стилей XSLT из файла dataTable.xslt (см. ниже). Цель этой таблицы стилей - определить, как XML-данные должны быть преобразованы в HTML.

  1. Обработка XSLT и вывод HTML-таблицы:

$proc = new xsltprocessor;
$proc->importStyleSheet($xsl);
echo $proc->transformToXML($xml);

Создается экземпляр xsltprocessor, который импортирует загруженную таблицу стилей XSL. Затем он преобразует загруженный ранее XML-документ, используя определение таблицы стилей, и выводит результирующий HTML.

Применяя эти преобразования с помощью $proc->transformToXML(), мы превращаем нашу необработанную информацию в виде таблицы Data Table в удобный для пользователя табличный формат, готовый к просмотру в любом веб-браузере.

Пример 2: Вызов функции контекста

Это пример показывает, как создавать новую учетную запись пользователя SberMobile Serverа путем вызова функции регистрации из корневого контекста. Создание клиента SOAP и проверка ошибок опущены в этом примере.

$params[0]="phpuser"; // Username (value for record 0, field 0 of function input Data Table)
$params[1]="test"; // Password (value for record 0, field 1)
$params[2]="test"; // Repeat Password (value for record 0, field 2)
urldecode($client->callByStringArray("admin", "admin", "", "register", $params)); // Calling function via Web Service

Правила таблицы стилей

Содержимое dataTable.xslt определяет, как каждый элемент исходной таблицы данных, закодированный в XML, должен быть представлен в формате HTML:

  • Он устанавливает <xsl:template>, который соответствует элементам <table> в XML.

  • Он использует <xsl:param> в шаблонах для извлечения значений на основе имен полей.

  • В зависимости от типа поля применяются особые правила форматирования - например, булевые поля отображаются зеленым/красным шрифтом для значений true/false соответственно.

Содержимое файла dataTable.xslt

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" indent="yes" />
<xsl:template match="table">
<table border="1">
<tr bgcolor="silver">
<xsl:for-each select="format/fields/field">
<td>
<xsl:choose>
<xsl:when test="@description">
<xsl:value-of select="@description" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@name" />
</xsl:otherwise>
</xsl:choose>
</td>
</xsl:for-each>
</tr>
<xsl:for-each select="records/record">
<xsl:call-template name="printRecord">
<xsl:with-param name="rec" select="self::*" />
<xsl:with-param name="fields"
select="parent::*/parent::table/format/fields" />
</xsl:call-template>
</xsl:for-each>
</table>
</xsl:template>
<xsl:template name="printRecord">
<xsl:param name="rec" select="0" />
<xsl:param name="fields" select="0" />
<tr>
<xsl:for-each select="$fields/child::field">
<xsl:choose>
<xsl:when test="$rec/value[@name=current()/@name]">
<xsl:call-template name="exposeFieldValue">
<xsl:with-param name="valueNode"
select="$rec/value[@name=current()/@name]" />
<xsl:with-param name="fieldNode" select="self::*" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="exposeFieldValue">
<xsl:with-param name="valueNode" select="child::defaultValue" />
<xsl:with-param name="fieldNode" select="self::*" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</tr>
</xsl:template>
<xsl:template name="exposeFieldValue">
<xsl:param name="valueNode" select="0" />
<xsl:param name="fieldNode" select="0" />
<td>
<xsl:choose>
<xsl:when test="$fieldNode/child::selectionValues">
<xsl:choose>
<xsl:when
test="$fieldNode/selectionValues/option[text()=string($valueNode)]">
<xsl:value-of
select="$fieldNode/selectionValues/option[text()=string($valueNode)]/@description" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$valueNode" />
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="$fieldNode/@type='B'">
<xsl:choose>
<xsl:when test="$valueNode/text()='1'">
<xsl:element name="font">
<xsl:attribute name="color">green</xsl:attribute>
<xsl:text>true</xsl:text>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="font">
<xsl:attribute name="color">red</xsl:attribute>
<xsl:text>false</xsl:text>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test="$fieldNode/@type='T'">
<xsl:apply-templates select="$valueNode/child::*" />
</xsl:when>
<xsl:when test="$fieldNode/@type='A'">
<xsl:apply-templates select="$valueNode/child::data/@name" />
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="not($valueNode) or not($valueNode/text())">
<xsl:choose>
<xsl:when
test="$fieldNode/@nullable and $fieldNode/@nullable='true'">
<font color="blue">Null</font>
</xsl:when>
<xsl:otherwise>
<br />
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$valueNode" />
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</td>
</xsl:template>
</xsl:stylesheet>