Что такое web служба - Создание Web-служб

Что такое web служба - Создание Web-служб

Индекс материала
Что такое web служба
Описание с помощью WSDL
Создание Web-служб
Все страницы

Создание Web-служб

Прежде чем разрабатывать Web-службу, необходимо иметь ее WSDL-описание. Однако создание WSDL-описания с нуля это полный атас. Поэтому лучше всего взять за основу описание существующей Web-службы, которая делает то же самое (или, по крайней мере, методы которой имеют похожие сигнатуры).

В самом конце WSDL описания (приведённого на предыдущей странице) находится URL-адрес Web-службы:
<soap:address location="http://localhost/php/guid-server.php" /> - Замените этот URL на адрес вашей службы. После того как описание создано, можно приступать к написанию самой службы.

Итак, создаваемая нами Web-служба будет возвращать GUID (Globally Unique Identifier — глобально уникальный идентификатор) с префиксом, передаваемым службе в качестве параметра. Как известно, в РНР для этой цели существует функция uniqid(), В действительности наша Web-служба является оболочкой для uniqid(). Функция getGuid () выглядит следующим образом:


  function getGuid($prefix)
  {
    return uniqid($prefix);
  }

Осталось сделать всего три шага - или строки кода:
  1. Создать SOAP-сервер, указав WSDL-описание.

  2. Добавить к серверу функцию getGuid ().

  3. Поручить серверу обработку всего остального.

Внимание!

Во время разработки приложения, на этапе тестирования, всегда запрещайте кэширование WSDL-документов, иначе устаревшие WSDL-описания могут привести к возникновению непредсказуемых ошибок.

Запретить кэширование можно также и в конкретном PHP-сценарии с помощью функции ini_set():


  ini_set('soap.wsdl_cache_enabled',  'Off');

Листинг ниже содержит завершенный ход этого примера, включая запрет на кэширование WSDL.


ini_set('soap.wsdl_cache_enabled',  'Off');

function getGuid(Sprefix)
{
	return uniqidtSprefix);
}

$soap = new SoapServer('guid.wsdl');

$soap->addFunction('getGuid');

$soap->handle();

Использование Web-служб

Сама по себе служба не покажет в Web-браузере ничего полезного. Если просто набрать её адрес то как показано в листинге ниже, мы получим сообщение об ошибке. Причина очевидна: мы вызвали Web-службу, но не передали ей SOAP-запрос, поэтому она справедливо жалуется на "неправильный запрос" (Bad Request):

  <?xml version="1.0" encodings "UTF-8" ?>
  <SOAP-ENV:Envelope xmlns:SOAP-ENV="ltttp://schemas.xmlsoap.org/soaр/envelope/ ">

      <SOAP-ENV:Body>

          <SOAP-ENV:Fault>
              <faultcode>SOAP-ENV:Server</faultcode>
              <faultstring>Bad Request. Can't find HTTP_RAW_POST_DATA</faultstring>
          </SOAP-ENV:Fault>

      </SOAP-ENV:Body>

  </SOAP-ENV:Envelope>

Чтобы использовать эту службу (и получить желанный GUID) нам потребуется клиент. Для решения этой задачи расширение SOAP для РНР 5 предлагает простой способ доступа к Web-службе при условии доступности ее WSDL-oписания. Конструктор класса SoapClient принимает в качестве аргумента имя файла с WSDL-описаниеми создает прокси-объект. Поведение этого локального объекта точно такое же, как и удаленной службы.

Преимущество такого подхода заключается в том, что вы можете работать со службой как с локальным объектом, не заботясь о таких вещах, как открытие соединения, создание и синтаксический разбор SOАР-документа и тому подобное. По существу запрос к Web-службе сводится к двум строкам кода. В листинге ниже добавлена еще одна строка, запрещающая WSDL-кэширование.


  ini_set('soap.wsdl_cache_enabled', 'Off');
  $soap = new SoapClient('guid.wsdl');
  echo $soap->getGuid('PHP_');

Результатом будет строка: PHP_411f663ce6ce5

Однако этот класс содержит намного больше возможностей. Одной из них является обработка ошибок. Например, может потребоваться, чтобы передаваемый префикс имел непустое значение и не был пустой строкой или строкой, содержащей лишь пробельные символы. Если эти условия не соблюдены, должно возвращаться сообщение об ошибке. Для этих целей воспользуемся встроенным объектом SoapFault, предназначенным для обработки ошибок SOAP. В листинге шиже показан обновленный сервер нашей Web-службы, на этот раз возвращающей еще и сообщение об ошибке.


  ini_set('soap.wsdl_cache_enabled', 'off');
  
  function getGuid($prefix)
  {
    //Если не указан префикс...
    if(!isset($prefix) || trim($prefix) == '')
    { 
      //SOAP-сервер возвращает сообщение об ошибке:
      throw new SoapFault('Server',  'He указан префикс.');
    }
    else
    {
      return uniqid($prefix);
    }
  }
  
  $soap = new SoapServer{'guid.wsdl') ;
  $soap->addFunction('getGuid');
  $soap->handle();

Пример ниже содержит обновленный код клиента, который теперь с помощью конструкции try...catch проверяет возвращаемый ответ на наличие ошибок.

SOAP-клиент с обработкой ошибок:


ini_set('soap.wsdl_cache_enabled', 'Off');

$soap = new SoapClient('guid.wsdl');

try
{
	echo $soap->getGuid('PHP_');
}
catch(SoapFault $e)
{
	echo $e->faultstring;
}

Если заменить вызов getGuid ('РНР_') на getGuid( ), то SOAP-сервер вернет сообщение об ошибке: "He указан префикс."

Итак мы узнали, как работать с Web-службами с помощью расширения SOAP для РНР 5. Хотя базовые технологии, такие как SOAP и WSDL. являются сами по себе довольно сложными, пользоваться ими в РНР довольно просто. За исключением подготовки WSDL-описаний, вся остальная работа сводится к написанию нескольких строк PHP-кода.

Для получения дополнительной информации обратитесь к описанию упоминаемых в этой статье стандартов:




Добавить комментарий


Защитный код
Обновить



Кто на сайте
Сейчас 135 гостей онлайн