Simple Object Access Protocol (SOAP)

SOAP - данный протокол обмена данными относится к подмножеству протоколов основанных на так называемой парадигме RPC (Remote Procedure Call, удалённый вызов процедур) антиподом которой является REST (Representational State Transfer, передача репрезентативного состояния). Подход RPC позволяет использовать небольшое количество сетевых ресурсов с большим количеством методов. При подходе REST количество методов и сложность протокола строго ограничены, из-за чего количество отдельных ресурсов может быть большим. Т.е., на сайте в случае RPC подхода будет всегда один вход (ссылка) на сервис и какую процедуру вызывать для обработки поступающих данных мы передаем вместе с данными, в то время как при REST подходе на нашем сайте есть много входов (ссылок), каждая из которых принимает и обрабатывает только определенные данные.

SOAP – протокол используемый для реализации удаленного вызова процедур и в качестве транспорта он использует XML, так же он может использоваться поверх любого протокола прикладного уровня, а не только в паре с HTTP.

В качестве транспорта используется XML, а пакеты, которые курсируют между клиентом и сервером называются SOAP-конвертами. Если рассматривать обобщенную структуру конверта, то он вам покажется очень знакомым, т.к. напоминает структуру HTML-страницы. В нем есть основной раздел – Envelop, который включает разделы Header и Body, либо Fault. В Body передаются данные и он является обязательным разделом конверта, в то время как Header является опциональным. В Header может передаваться авторизация, либо какие-либо иные данные, которые на прямую не относятся к входным данным процедур веб-сервиса. Про Fault особо рассказывать нечего, кроме того, что он приходит в клиент с сервера в случае возникновения каких-либо ошибок.

Web сервис SOAP определяется использованием Web Service Desciption Language (WSDL) документа. Он в свою очередь является еще одним XML документом, который описывает, какие функции доступны этим сервисом, также какие специальные типы данных для него требуются.

WSDL предназначен для того, чтобы наши клиенты могли нормально общаться с сервером. Для этого в файле с расширением *.wsdl описывается следующая информация:

  • Какие пространства имен использовались
  • Какие схемы данных использовались
  • Какие типы сообщений веб-сервис ждет от клиентов
  • Какие данные принадлежат каким процедурам веб-сервиса
  • Какие процедуры содержит веб-сервис
  • Каким образом клиент должен вызывать процедуры веб-сервиса
  • На какой адрес должны отправляться вызовы клиента

Доступ к SOAP-Based Web Сервисам

SoapClient

Класс SoapClient - решение для создания SOAP клиента. Все что нужно, это предоставить доступ к WSDL файлу, и он автоматически создаст PHP дружелюбный интерфейс:

try {
  $client = new SoapClient(
    'http://api.example.org/search.wsdl'
  );
  $results = $client->doSearch(
    $key, $query, 0, 10, FALSE, '',  FALSE, ', ', ''
  );

  foreach ($results->resultElements as $result) {
     echo '<a href="' . htmlentities($result->URL) . '">';
     echo htmlentities($result->title, ENT_COMPAT, 'UTF-8');
     echo '</a><br/>';
  }
} catch (SoapFault $e) {
  echo $e->getMessage();
}

Здесь создается новый SOAP клиент с использованием WSDL файла на удаленном сервере. SoapClient использует WSDL файл для создания объекта, спроектированного на методах, определенных для данного сервиса. Поэтому $client теперь обладает методом doSearch(). Скрипт вызывает метод doSearch() и обрабатыват полученные результаты. Если SoapClient обнаружит какую-либо ошибку, будет выброшено исключение.

SoapClient может быть использован в режиме с WSDL либо в режиме без WSDL. При использовании без WSDL для вызова функций soap сделует использовать метод SoapClient::__callSoap.

SoapServer

Класс SoapServer представляет собой сервер для протоколов SOAP 1.1 и SOAP 1.2. Он может быть использован с или без WSDL-описания сервиса:

//Создаем новый SOAP-сервер
$server = new SoapServer("http://{$_SERVER['HTTP_HOST']}/smsservice.wsdl.php");
//Регистрируем класс обработчик
$server->setClass("SoapSmsGateWay");
//Запускаем сервер
$server->handle();

В первой строке мы создаем новый экземпляр объекта SoapServer и передаем ему в конструктор адрес нашего WSDL-описания веб-сервиса. Теперь мы знаем, что он будет располагаться в корне хостинга в файле smsservice.wsdl.php. Во второй строке мы сообщаем SOAP-серверу какой класс необходимо дергать для того, чтобы обработать поступивший с клиента конверт и вернуть конверт с ответом. В третьей строке мы запускаем сервер.

Для обработки soap запросов можно использовать:

  • SoapServer::addFunction (функцию)
  • SoapServer::setClass (класс)
  • SoapServer::setObject (объект)

Ошибки

is_soap_fault($result)

  • Проверяет произошла ли ошибка при вызове SOAP.
  • Эта функция полезна для проверки на наличие ошибки при вызове SOAP, но тогда, когда не используются исключения. Для того, чтобы ее использовать, создайте объект SoapClient с опцией exceptions, установленной в значение ноль или FALSE.

use_soap_error_handler

  • Указывает, нужно ли использовать обработчик ошибок SOAP.
  • Эта функция определяет, могут ли использоваться обработчики ошибок SOAP в SOAP-сервере. Функция возвращает предыдущее значение. Если установлено в TRUE, то подробности ошибок в приложении с классом SoapServer будут отправлены клиенту в виде сообщения об SOAP ошибке. Если установлено в FALSE, то используется стандартный обработчик ошибок PHP. По умолчанию используется стандартный обработчик ошибок PHP.