Ashlst
@Ashlst
Фанат эстетики и красивых решений.

Ошибка SOAP looks like we got no XML document.Как исправить?

Добрый день.
Начал разбираться с 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>

Буду признателен за любые идеи и уделенное время.
  • Вопрос задан
  • 3696 просмотров
Пригласить эксперта
Ответы на вопрос 2
Lukich87
@Lukich87
Дело в путях скорей всего.
Проверил ваш код, указав свои директории - все работает.
p.s. Пример из курса "Специалист".
Ответ написан
Комментировать
X-core
@X-core
начинающий веб разработчик
проходил данный урок...
Так же сталкивался с такой проблемой.
сделал все исправления,про которые автор видео говорил, но он не сказал , что нужно изменить доступ к $_db с private на protected, потому как не видно свойство класса в файле soap-server.php.

Ответ на вопрос: пропишите в файлах сервера и клиента: $server = new SoapServer($_SERVER['HTTP_REFERER']."news.wsdl");
$client = new SoapClient($_SERVER['HTTP_REFERER'] . "soap/news.wsdl");
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы