Наш тестовый веб-сервис будет решать одну задачу: на любой входной запрос, состоящего из даты в формате - день.месяц.год - он должен возвращать дату в виде timestamp. Создадим для этого процедуру - test(). Итак, для разворачивания soap - сервиса необходимо убедиться в том, что в настройках разрешено использование soap - сервера и клиента
Далее выделяете необходимую директорию для последующих служебных файлов. В моем примере в корне хоста test.ru была выделена директория - /web_service, куда разместил следующие файлы:
.htaccess - поддержка веб - сервиса;
index.php - реализация движка веб - сервиса (класс соединения и вызываемые процедуры);
web_service.wsdl - описание нашего тестового веб - сервиса и доступа к нему;
test.php - для демонстрации работы веб - сервиса.
Ниже приведено их содержимое, думаю по ним не составит труда разобраться.
.htaccess
# Enables or disables WSDL caching feature.
php_flag soap.wsdl_cache_enabled 0
# Sets the directory name where SOAP extension will put cache files.
php_value soap.wsdl_cache_dir "/tmp"
# (time to live) Sets the number of second while cached file will be used
# instead of original one.
php_value soap.wsdl_cache_ttl 0
AddDefaultCharset utf8
index.php
<?php
ini_set('soap.wsdl_cache_enabled', 'Off');
class Connection
{
/*
Возвращает заданную дату в виде timestamp.
Формат даты - dd.mm.yyyy
*/
function test($dt) {
if (!empty($dt)) {
$dt = explode('.', $dt);
$time_stamp = mktime(0, 0, 0, $dt[1], $dt[0], $dt[2]);
return $time_stamp;
}
else {
return false;
}
}
}
try
{
$server = new SoapServer('http://192.168.126.128/web_service/web_service.wsdl?'.rand());
$server->setClass("Connection");
$server->handle();
}
catch (ExceptionFileNotFound $e)
{
echo 'Error message: ' . $e->getMessage();
}
?>
web_service.wsdl
<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema" name="webserviceService" targetNamespace="http://tempuri.org/" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/">
<message name="test_input">
<part name="dt" type="xs:string"/>
</message>
<message name="test_output">
<part name="request" type="xs:string"/>
</message>
<message name="null_response"/>
<portType name="Connection">
<operation name="test">
<input message="tns:test_input"/>
<output message="tns:test_output"/>
</operation>
</portType>
<binding name="bind_connect" type="tns:Connection">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="test">
<soap:operation soapAction="urn:web-service#test" style="rpc"/>
<input message="tns:test_input">
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:web-service"/>
</input>
<output message="tns:test_output">
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:web-service"/>
</output>
</operation>
</binding>
<service name="webserviceService">
<port name="webservicePort" binding="tns:bind_connect">
<soap:address location="http://192.168.126.128/web_service/index.php"/>
</port>
</service>
</definitions>
test.php
<?php
header('Content-type: text/html; charset=utf-8');
@set_time_limit(300);
try {
$client = new SoapClient("http://192.168.126.128/web_service/web_service.wsdl?".rand(),
array('trace' => 1, 'exceptions' => 1));
echo 'test('.date("d.m.Y", time()).') = '.$client->test(strval(date("d.m.Y", time())));
}
catch (SoapFault $e) {
echo "<pre>".print_r($e, true)."</pre>";
echo "<br/><br/>Error Caught";
}
?>
Стоит отметить, что при инстанцировании soap-сервера и клиентов, а также в файле описания веб-сервиса, был использован ip-адрес веб-сервера, также можно использовать и непосредственное имя хоста (test.ru).
После завершения всех работ, пробуем протестировать наш веб-сервис. На запрос
http://test.ru/web_service/test.php
мы получаем ожидаемый ответ
test(27.03.2014) = 1395903600
Что говорит о работоспособности сервиса. Всем успеха. Исходники можно скачать по следующей ссылке - download