суббота, 7 апреля 2018 г.

PHP. Пример веб-сервиса. SOAP

Рассмотрим пример простого веб-сервиса. У нас есть 3 файла: sever.php (серверная часть),  client.php (обращение клиента к серверу) и stock.wsdl

server.php
<?php
// Описание функции Web-сервиса
// На полках a, b, c, d, e храниться определенное кол-во товара.
  function getStock($id) {
    $stock = [
"a" => 100,
"b" => 200,
"c" => 300,
"d" => 400,
"e" => 500
    ];
    if (isset($stock[$id])) {
      $quantity = $stock[$id];
      return $quantity;
    } else {
//return 0;
throw new SoapFault("Server", "Несуществующий id товара");
    }
  }

/* // Тестируем перед тем, как отдать клиенту в виде ответа.
echo getStock("b");
echo getStock("z");
exit; */

// Отключение кэширования WSDL-документа
ini_set("soap.wsdl_cache_enabled", "0"); // отключаем для тестирования, т.к файлы очень хорошо кешируются
// Создание SOAP-сервер
$server = new SoapServer("http://specialist.loc/soap/stock.wsdl");
// Добавить класс к серверу
$server->addFunction("getStock"); // эта функция будет видна клиенту
// Запуск сервера
$server->handle();
?>

client.php
<?php
try {
  // Создание SOAP-клиента
  $client = new SoapClient("http://specialist.loc/soap/stock.wsdl");

  // Посылка SOAP-запроса c получением результат
  $result = $client->getStock("z");
  echo "Текущий запас на складе: ", $result;
} catch (SoapFault $exception) {
  echo $exception->getMessage();
}
?>

stock.wsdl
<?xml version ='1.0' encoding ='UTF-8' ?>
<definitions name='Stock'
targetNamespace='http://localhost/soap'
xmlns:tns=' http://localhost/soap '
xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/'
xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'
xmlns='http://schemas.xmlsoap.org/wsdl/'>

<message name='getStockRequest'>
<part name='shelf_name' type='xsd:string'/>
</message>
<message name='getStockResponse'>
<part name='Result' type='xsd:integer'/>
</message>

<portType name='StockPortType'>
<operation name='getStock'>
<input message='tns:getStockRequest'/>
<output message='tns:getStockResponse'/>
</operation>
</portType>

<binding name='StockBinding' type='tns:StockPortType'>
<soap:binding style='rpc' transport='http://schemas.xmlsoap.org/soap/http'/>
<operation name='getStock' />
</binding>

<service name='StockService'>
<port name='StockPort' binding='StockBinding'>
<soap:address location='http://specialist.loc/soap/server.php'/>
</port>
</service>
</definitions>

А что если мы хотим использовать ООП и создать класс.
Нам нужно переписать совсем немного.
server.php

<?php
class StockService {
// Описание функции Web-сервиса
// На полках a, b, c, d, e храниться определенное кол-во товара.
  function getStock($id) {
    $stock = [
"a" => 100,
"b" => 200,
"c" => 300,
"d" => 400,
"e" => 500
    ];
    if (isset($stock[$id])) {
      $quantity = $stock[$id];
      return $quantity;
    } else {
//return 0;
throw new SoapFault("Server", "Несуществующий id товара");
    }
  }
}
/* // Тестируем перед тем, как отдать клиенту в виде ответа. 
echo getStock("b");
echo getStock("z");
exit; */
 
// Отключение кэширования WSDL-документа
ini_set("soap.wsdl_cache_enabled", "0"); // отключаем для тестирования, т.к файлы очень хорошо кешируются
// Создание SOAP-сервер
$server = new SoapServer("http://specialist.loc/soap/stock.wsdl");
// Добавить класс к серверу
//$server->addFunction("getStock"); // эта функция будет видна клиенту
$server->setClass("StockService"); // заменяем только эту строку
// Запуск сервера
$server->handle();
?>

Комментариев нет:

Отправить комментарий

Materialize-css. Футер

Сделаем футер и прижмем к низу страницы. Документация: https://materializecss.com/footer.html