Примеры веб-сервиса
Пример 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..
Создание клиента SOAP:
$client = new SoapClient("http://localhost:8080/ws/services/ServerWebService?wsdl");
Эта строка создает новый экземпляр класса
SoapClient
в PHP, указывая на файл WSDL (язык описания веб-сервисов) дляServerWebService
, размещенного наlocalhost
на порту8080
.Настройка учетных данных и параметров:
$username = "admin";
$password = "admin";
$context = "users.admin";
$variable = "childInfo";Вызов функции веб-сервиса 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.
Создание DOM-документа из XML-строки и загрузка XSLT-преобразования:
$xml = new DomDocument;
$xml->loadXML($childInfoXML);
$xsl = new DomDocument;
$xsl->load('dataTable.xslt');
Создайте два объекта DOMDocument - один для хранения полученных XML-данных, а другой для загрузки таблицы стилей XSLT из файла dataTable.xslt
(см. ниже). Цель этой таблицы стилей - определить, как XML-данные должны быть преобразованы в HTML.
Обработка 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>