Добрый день.
Начал разбираться с SOAP,набросал простенький сервис новостей и клиент под него и получил ошибку.
Что есть:
- сервис новостей,находится в папке news (все это крутится на OpenServre`e)
- soap-server,находится в папке news/soap
- wsdl файл news.wsdl,находится в папке news/soap
- soap-client,находится в папке localhost
Что я делаю:
Запускаю OpenServer,перехожу на localhost - вылетает "Операция Client вернула ошибку: looks like we got no XML document".
Проверил кодировки и BOM-символы,все в порядке.
Исходники:
- soap-server.php
<?php
require "../class/NewsDB.class.php";
class NewsService extends NewsDB{
/* Метод возвращает новость по её идентификатору */
function getNewsById($id){
try{
$sql = "SELECT id, title,
(SELECT name FROM category WHERE category.id=msgs.category) as category, description, source, datetime
FROM msgs
WHERE id = $id";
$result = $this->_db->query($sql);
if (!is_object($result))
throw new Exception($this->_db->lastErrorMsg());
return base64_encode(serialize($this->sqlToArray($result)));
}catch(Exception $e){
throw new SoapFault('getNewsById', $e->getMessage());
}
}
/* Метод считает количество всех новостей */
function getNewsCount(){
try{
$sql = "SELECT count(*) FROM msgs";
$result = $this->_db->querySingle($sql);
if (!$result)
throw new Exception($this->_db->lastErrorMsg());
return $result;
}catch(Exception $e){
throw new SoapFault('getNewsCount', $e->getMessage());
}
}
/* Метод считает количество новостей в указанной категории */
function getNewsCountByCat($cat_id){
try{
$sql = "SELECT count(*) FROM msgs WHERE category=$cat_id";
$result = $this->_db->querySingle($sql);
if (!$result)
throw new Exception($this->_db->lastErrorMsg());
return $result;
}catch(Exception $e){
throw new SoapFault('getNewsCountByCat', $e->getMessage());
}
}
}
// Отключение кеширования wsdl-документа
ini_set("soap.wsdl_cache_enabled", "0");
// Создание SOAP-сервера
$server = new SoapServer("http://news/soap/news.wsdl");
// Регистрация класса
$server->setClass("NewsService");
// Запуск сервера
$server->handle();
-soap-client.php
<?php
$client = new SoapClient("http://news/soap/news.wsdl");
try{
// Сколько новостей всего?
$result = $client->getNewsCount();
echo "<p>Всего новостей: $result</p>";
// Сколько новостей в категории Политика?
$result = $client->getNewsCountByCat(1);
echo "<p>Всего новостей в категории Политика:$result</p>";
// Покажем конкретную новость
$result = $client->getNewsById(5);
$news = unserialize(base64_decode($result));
var_dump($news);
}catch(SoapFault $e){
echo 'Операция '.$e->faultcode.' вернула ошибку: '.$e->getMessage();
}
-news.wsdl
<?xml version ='1.0' encoding ='UTF-8' ?>
<definitions name='News'
targetNamespace='http://news'
xmlns:tns=' http://news'
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='getNewsByIdRequest'>
<part name='id' type='xsd:integer'/>
</message>
<message name='getNewsByIdResponse'>
<part name='item' type='xsd:base64Binary'/>
</message>
<message name='getNewsCountResponse'>
<part name='count' type='xsd:integer'/>
</message>
<message name='getNewsCountByCatRequest'>
<part name='cat_id' type='xsd:integer'/>
</message>
<message name='getNewsCountByCatResponse'>
<part name='count' type='xsd:integer'/>
</message>
<portType name='NewsPortType'>
<operation name='getNewsById'>
<input message='tns:getNewsByIdRequest'/>
<output message='tns:getNewsByIdResponse'/>
</operation>
<operation name='getNewsCount'>
<output message='tns:getNewsCountResponse'/>
</operation>
<operation name='getNewsCountByCat'>
<input message='tns:getNewsCountByCatRequest'/>
<output message='tns:getNewsCountByCatResponse'/>
</operation>
</portType>
<binding name='NewsBinding' type='tns:NewsPortType'>
<soap:binding style='rpc' transport='http://schemas.xmlsoap.org/soap/http'/>
<operation name='getNewsById' />
<operation name='getNewsCount' />
<operation name='getNewsCountByCat' />
</binding>
<service name='NewsService'>
<port name='NewsPort' binding='NewsBinding'>
<soap:address location='http://news/soap/soap-server.php'/>
</port>
</service>
</definitions>
Буду признателен за любые идеи и уделенное время.