В этом документе описывается, как получить и установить NuSOAP, а затем приведены несколько примеров, иллюстрирующих функции NuSOAP. Это не полное введение в NuSOAP, но мы надеемся, что некоторые разработчики PHP смогут получить хорошее введение.
NuSOAP — это набор классов PHP, которые позволяют разработчикам создавать и использовать веб-сервисы SOAP. Он не требует установки каких-либо расширений PHP. Он был разработан 3 декабря 2004 г., текущая версия — NuSOAP (0.6.7). Поддерживая спецификацию SOAP 1.1, он может создавать и использовать WSDL 1.1, а также поддерживает службы rpc/encoded и document/literal. Однако важно отметить, что NuSOAP не обеспечивает полную реализацию, такую как .NET и Apache Axis.
Привет, мир
Я начну с примера «Hello, World» и напишу базовый код клиента и сервера NuSOAP.
Начнем сначала с серверной части, потому что без серверной части нет смысла иметь клиентскую часть. Мы собираемся написать метод SOAP с именем Hello, который принимает один параметр и возвращает строку, и мы надеемся, что комментарии в коде дадут полезные инструкции.
<?php
// Извлекаем код NuSOAP
require_once('nusoap.php');
// Создаем экземпляр сервера
$server = новый мыльный_сервер;
// Регистрируем метод для раскрытия
$server->register('привет');
// Определить метод как функцию PHP
функция привет($имя) {
вернуть 'Привет,' $name;
}
// Используйте запрос, чтобы (попытаться) вызвать службу
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) $HTTP_RAW_POST_DATA: '';
$сервер->сервис ($HTTP_RAW_POST_DATA);
?>
Ниже приведен код клиента. Следует отметить несколько важных моментов: Во-первых, при создании экземпляра Soapclient вам необходимо указать URL-адрес службы в качестве параметра. В этом примере доступ к helloworld.php осуществляется по адресу http://. localhost/phphack . Конечно, сервисы, которые вы хотите использовать, размещаются по разным URL-адресам; во-вторых, при вызове сервиса первым параметром является имя сервиса, которое должно соответствовать допустимому имени метода (некоторые серверы чувствительны к регистру). В этом примере он должен соответствовать методу, уже зарегистрированному в helloworld.php. Наконец, второй параметр — это массив, который будет передан методу службы SOAP в качестве параметра. Поскольку метод hello в helloworld.php имеет только один параметр, массив содержит только один элемент.
<?php
// Извлекаем код NuSOAP
require_once('nusoap.php');
// Создаем экземпляр клиента
$client = новый мыльный клиент('http://localhost/phphack/helloworld.php');
// Вызов метода SOAP
$result = $client->call('привет', массив('имя' => 'Скотт'));
// Отображение результата
print_r ($ результат);
?>
Отладка
При программировании вам необходимо проводить отладку всякий раз, когда что-то идет не так. NuSOAP предоставляет набор инструментов, которые помогут вам в этом. Информация, которую необходимо проверить при отладке NuSOAP, — это отправляемая информация запроса и возвращаемая соответствующая информация. Клиентский класс NuSOAP позволяет просматривать эту информацию через два его члена. Например, вот модифицированная версия helloworldclient.php, показывающая запрос и ответ. В следующем разделе я рассмотрю информацию о запросах и ответах, отображаемую в клиентском коде.
<?php
// Извлекаем код NuSOAP
require_once('nusoap.php');
// Создаем экземпляр клиента
$client = новый мыльный клиент('http://localhost/phphack/helloworld.php');
// Вызов метода SOAP
$result = $client->call('привет', массив('имя' => 'Скотт'));
// Отображение результата
print_r ($ результат);
// Отображение запроса и ответа
echo '<h2>Запрос</h2>';
echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) '</pre>';
echo '<h2>Ответ</h2>';
echo '<pre>' . htmlspecialchars($client->response, ENT_QUOTES) '</pre>';
?>
NuSOAP также предоставляет метод просмотра отладочной информации через журналы с использованием своих классов. Добавление следующего кода приведет к отображению подробной отладочной информации. К сожалению, описание вывода необходимо оставить читателю.
// Отображение отладочных сообщений
echo '<h2>Отладка</h2>';
echo '<pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) '</pre>';
Интересно, что эта отладочная информация находится в формате XML в конце соответствующего формата SOAP. отображается, чтобы его можно было просмотреть в клиенте. Отладка на стороне сервера выглядит следующим образом:
<?php
// Извлекаем код NuSOAP
require_once('nusoap.php');
// Включаем отладку *перед* созданием экземпляра сервера
$ отладка = 1;
// Создаем экземпляр сервера
$server = новый мыльный_сервер;
// Регистрируем метод для раскрытия
$server->register('привет');
// Определить метод как функцию PHP
функция привет($имя) {
вернуть 'Привет,' $name;
}
// Используйте запрос, чтобы (попытаться) вызвать службу
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) $HTTP_RAW_POST_DATA: '';
$сервер->сервис ($HTTP_RAW_POST_DATA);
?>
Третий метод отладки на самом деле не является отладкой, это хорошая практика программирования. В приведенном выше примере не выполняется проверка ошибок при вызове SOAP. Более надежный клиент будет выглядеть так:
<?php.
// Извлекаем код NuSOAP
require_once('nusoap.php');
// Создаем экземпляр клиента
$client = новый мыльный клиент('http://localhost/phphack/helloworld.php');
// Проверяем наличие ошибки
$err = $client->getError();
если ($ ошибка) {
// Отображение ошибки
echo '<p><b>Ошибка конструктора: ' . $err '</b></p>';
// На этом этапе вы знаете, что следующий вызов завершится неудачей
}
// Вызов метода SOAP
$result = $client->call('привет', массив('имя' => 'Скотт'));
// Проверяем наличие ошибки
если ($ клиент-> ошибка) {
echo '<p><b>Ошибка: ';
print_r ($ результат);
эхо '</b></p>';
} еще {
// Проверяем наличие ошибок
$err = $client->getError();
если ($ ошибка) {
// Отображение ошибки
echo '<p><b>Ошибка: ' . $err '</b></p>';
} еще {
// Отображение результата
print_r ($ результат);
}
}
?>
Чтобы протестировать код, нужно вызвать ошибку, например, изменить имя вызываемого метода hello на Goodbye.
Запрос и ответ
В приведенном выше примере я показал, как легко отображать информацию о запросах и ответах SOAP. Вот информация о запросе для hello2client.php:
POST /phphack/helloworld2.php HTTP/1.0
Хост: локальныйхост
Пользовательский агент: NuSOAP/0.6.8 (1.81)
Тип контента: текст/xml кодировка = ISO-8859-1;
SOAPAction: ""
Длина содержимого: 538
<?xml version="1.0"coding="ISO-8859-1"?>
<SOAP-ENV:Конверт
SOAP-ENV:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding/ "
xmlns:SOAP-ENV=" http://schemas.xmlsoap.org/soap/envelope/ "
xmlns:xsd=" http://www.w3.org/2001/XMLSchema "
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance "
xmlns:SOAP-ENC=" http://schemas.xmlsoap.org/soap/encoding/ "
xmlns:si=" http://soapinterop.org/xsd ">
<SOAP-ENV:Тело>
<ns1:привет xmlns:ns1=" http://testuri.org ">
<name xsi:type="xsd:string">Скотт</name>
</ns1:привет>
</SOAP-ENV:Тело>
</SOAP-ENV:Конверт>
В заголовках HTTP вы увидите, что SOAPAction — это пустая строка, которая является его значением по умолчанию. Ваш метод службы может установить значение SOAPAction, а ваш клиентский код может вызвать метод, указав SOAPAction в качестве параметра.
В полезных данных XML вы можете видеть, что NuSOAP использует известную кодировку ISO-8859-1 как Latin-1. Чтобы указать другую кодировку, вы можете установить атрибут Soap_defencoding в клиентском экземпляре Soapclient. Разумеется, программист несет ответственность за кодирование данных параметров с использованием указанной кодировки. К счастью, PHP предоставляет множество функций для кодирования и декодирования наиболее распространенных данных кодирования в SOAP, таких как UTF-8.
Еще следует отметить, что элемент указывает вызываемый метод. Элемент с именем hello размещается под именем домена http://tempuri.org . Рекомендуется указывать настоящее имя домена, а также оно очень распространено для многих служб. . Это необходимо. Здесь показан будущий документ:
Служба SOAP отвечает следующим образом:
HTTP/1.1 200 OK
Сервер: Microsoft-IIS/5.0
Дата: среда, 3 ноября 2004 г., 21:32:34 по Гринвичу.
X-Powered-By: ASP.NET
X-Powered: PHP/4.3.4
Сервер: Сервер NuSOAP v0.6.8
X-SOAP-сервер: NuSOAP/0.6.8 (1.81)
Тип контента: текст/xml кодировка = ISO-8859-1;
Длина содержимого: 556
<?xml version="1.0"coding="ISO-8859-1"?>
<SOAP-ENV:Конверт
SOAP-ENV:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding/ "
xmlns:SOAP-ENV=" http://schemas.xmlsoap.org/soap/envelope/ "
xmlns:xsd=" http://www.w3.org/2001/XMLSchema "
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance "
xmlns:SOAP-ENC=" http://schemas.xmlsoap.org/soap/encoding/ "
xmlns:si=" http://soapinterop.org/xsd ">
<SOAP-ENV:Тело>
<ns1:helloResponse xmlns:ns1=" http://tempuri.org ">
<return xsi:type="xsd:string">Привет, Скотт</return>
</приветответ>
</SOAP-ENV:Тело>
</SOAP-ENV:Конверт>