Использование SOAP в PHP без WSDL

19 февраля 2014
Документация по SoapServer: https://www.php.net/manual/ru/class.soapserver.php
Документация по SoapClient: https://www.php.net/manual/ru/class.soapclient.php

PHP позволяет работать с SOAP в режиме «без WSDL» (non-WSDL). Для этого в конструкторе объектов SoapServer и SoapClient первым аргументом нужно передать значение null (в режиме WSDL в этом параметре передают адрес WSDL-файла).

Далее во втором аргументе (настройки SOAP) нужно завести новый параметр uri и указать в нём пространство имён сервера. А для SoapClient помимо uri нужно завести ещё параметр location и указать там адрес SOAP-сервера, который будет принимать запросы.

Пример кода сервера:
<?
//Класс обрабатывает запросы из SOAP-сервиса "Мой калькулятор"
include_once('my_calculator_class.php')

//Создаём объект SOAP-сервера
$soap_server = new SoapServer(null, array(
	'uri' => 'http://test-site.ru/my_calculator_no_wsdl/', //указываем пространство имён нашего сервера
	'soap_version' => SOAP_1_1,	//Версия протокола SOAP
	'encoding' => 'utf-8', 		//Кодировка, к которой должно приводиться содержимое запросов
));

//Привязываем к серверу класс, который будет обрабатывать запросы
$soap_server->setClass('my_calculator_class');

//Запуск обработки запросов
$soap_server->handle();
?>

Пример кода клиента:
<?
//Настройки SOAP
$soap_settings = array(
	'uri' => 'http://test-site.ru/my_calculator_no_wsdl/', //пространство имён SOAP-сервера
	'location' => 'http://test-site.ru/my_calculator_no_wsdl/server.php', //адрес SOAP-сервера для отправки запроса
	'soap_version' => SOAP_1_1,
	'encoding' => 'utf-8',
	'trace' => true, //включение отслеживания конвертов (будут доступны методы __getLastRequest и __getLastResponse)
);

//Клиент
$soap_client = new SoapClient(null, $soap_settings);

//Отправка запроса к SOAP-серверу
$params = array(
	'a' => 100,
	'b' => 5,
	'action' => '/',
);
$r = $soap_client->__soapCall('math_action', array($params));
?>

Архив с примерами файлов сервера и клиента:
my_calculator_no_wsdl.zip (2 Кб)