Web-сервис на Zend_Soap
13 сентября 2011 PHP 16235 просмотров
Web-сервис — компонент, предоставляющий Internet-клиентам набор функций API или web-методов. Основная задача web-сервисов — обеспечение межпрограммного взаимодействия. В отличие от традиционного web-приложения, у web-сервиса нет пользовательского интерфейса (GUI). Вместо этого у него есть программный интерфейс, то есть web-сервис предоставляет функции (web-методы), которые могут быть вызваны удаленно. Web-сервис не предназначен для обслуживания конечных пользователей. Его задача — предоставление услуг другим приложениям, будь то web-приложения, приложения с графическим пользовательским интерфейсом или консольные приложения.

В этой статье мы напишем простой web-сервис для платежной системы. Наша цель – создать API, которым могли бы пользоваться клиенты не зависимо от платформы. Будем использовать SOAP протокол. Zend_Soap выбран не зря. Это прекрасная библиотека для создания web-сервисов. Она избавляет нас от нужды «ручками» описывать WSDL (язык описания web-сервисов и доступа к ним, основанный на языке XML)

Для начала опишем наш web-сервис.
require 'PaymentSystem.php'; // Подключаем бизнес-модель
class PaymentSystemService
{
    /**
    * @param  int $creditCardNumber
    * @param  float $amount
    * @return int (0|1)
    */  
    public function pay($creditCardNumber, $amount)
    {
        return PaymentSystem::pay($creditCardNumber, $amount);
    }

    /**
    * @param  int $creditCardNumber
    * @return string
    */
    public function getStatus($creditCardNumber)
    {
        return PaymentSystem::getStatus($creditCardNumber);
    }
}
Обязательно нужно указывать типы входных и выходных параметров, для того чтобы Zend_Soap сформировал WSDL. В классе PaymentSystem находятся такие же методы, только статические. В них заложена реализация web-сервиса. В классе PaymentSystemService – только описание.
class PaymentSystem {
    public static function pay($creditCardNumber, $amount)
    {
        try {
            // ...
        } catch (Exception $e) {
            return 0;
        }
        return 1;
    }

    public static function getStatus($creditCardID)
    {
        $status = 'valid'; // Статус определяется бизнес-логикой
        return $status;
    }
}
Сервер, к которому будут обращаться клиенты (server.php файл).
require 'PaymentSystemService.php';
$wsdlURI = 'http://example.com/server.php?WSDL';
if (isset($_GET['WSDL'])) {
    require 'Zend/Soap/AutoDiscover.php';
    $autodiscover = new Zend_Soap_AutoDiscover();
    $autodiscover->setClass('PaymentSystemService');
    $autodiscover->handle();
} else {
    require 'Zend/Soap/Server.php';
    $soap = new Zend_Soap_Server($wsdlURI, array('cache_wsdl' => 0));
    $soap->setClass('PaymentSystemService');
    $soap->handle();
}
По этому адресу можно будет просмотреть WSDL сервера, который сформирует Zend_Soap.
http://example.com/server.php?WSDL
Это код клиента, который знает о нашем сервисе и хочет внедрить наше API к себе в интернет-магазин.
require 'Zend/Soap/Client.php';
$wsdlURI = 'http://example.com/server.php?WSDL';
$client = new Zend_Soap_Client($wsdlURI, array('cache_wsdl' => 0));
$client->pay(4111112222233333, 123.6);
$client->getStatus(4111112222233333);
В роли клиента не обязательно должен выступать PHP. Вы можете сделать клиент на ASP.NET или другой платформе. Пример был написан для ознакомления, а не для реального использования. Надеюсь, моя статья поможет вам написать свой крутой сервис, которым будут пользоваться миллионы.