Рассмотрим пример простого веб-сервиса. У нас есть 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();
?>
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();
?>
Комментариев нет:
Отправить комментарий