Как избавиться от исключения Unipot SoapFault: [Клиент] выглядит так, как будто у нас нет XML-документа в... "error
Я пытаюсь разработать бизнес-логику для динамического сайта, используя nusoap на стороне сервера (потому что мне нужны wsdls, а расширение PHP SOAP не может генерировать wsdls) и PHP SOAP extenstion на стороне клиента.
Однако я не могу получить даже логин и функции getRole. Когда я пытаюсь вызвать клиента, я получаю следующее сообщение
Uncaught SoapFault exception: [Client] looks like we got no XML document in [some paths]...
Wsdl существует на стороне сервера, и клиент его читает (когда я помещаю неверный url для wsdl, я получаю сообщение об ошибке).
Может ли кто-нибудь помочь?
Ответы
Ответ 1
Похоже, ваш клиент получает некоторый недопустимый XML - либо сам WSDL, либо ответ, возвращаемый сервером. Попробуйте вызвать клиента с параметром trace
, установленным в TRUE, и проверьте фактический XML-отправленный/полученный через __getLastRequest()
и __getLastResponse()
.
Ответ 2
У меня была аналогичная проблема; моя служба echo
выводит некоторые данные отладки. Я удалил все строки echo
и работал нормально.
Ответ 3
У меня та же проблема, и я решил с этим:
SOAP файл сервера в php имеет кодировку utf8 с BOM, заставляя apache отправлять обратно метку спецификации (3 байта) до ответа xml.
Кодировать ваш soap-сервер php с помощью значка utf8 WITH OUT.
Игнасио Гутьеррес Торреро
Ответ 4
Скорее всего, у вас есть конечные пробелы в конце вашего класса SOAPServer. Для получения дополнительной информации см. Следующий сообщение в блоге: http://arnekroeger.blogspot.com/2011/02/php-soap-error-looks-like-we-got-no-xml.html
Ответ 5
Просто используйте trim() для вас args.
$objectRequette = trim($_POST['Requette']) ;
$client = new SoapClient(null, array(
'location' => 'http://your.php',
'uri'=>'your option',
));
$result = $client->__soapCall('Misyka', array("$objectRequettea"));
Ответ 6
В моем случае эта ошибка появилась, когда я включил script с пустыми строками после метки "? > ".
Удалить эти строки решает проблему
Ответ 7
Не забудьте использовать блок try/catch:
try {
var_dump($client->foo());
} catch (Exception $e) {
echo($client->__getLastResponse());
echo PHP_EOL;
echo($client->__getLastRequest());
}
Ответ 8
Несколько раз спецификация может генерировать дополнительные символы, которые создают этот тип проблемы.
Чтобы определить, есть ли какая-либо спецификация UTF, см. это ссылка.
Ответ 9
У меня такая же проблема. Проблема решена с помощью set always_populate_raw_post_data
до -1
на php.ini.
Я узнаю это, добавив "trace" = > 1, "exceptions" = > 1 в опции и использую try catch
и получим __getLastRequest()
и __getLastResponse()
Ответ 10
У меня есть способ решить эту проблему. Это не очень хорошее решение, но оно работает...
Как я не могу ничего изменить на моем сервере мантитов, я решил сделать это...
Сначала я должен отключить SoapFault:
try {
$client = new SoapClient('http://www.mymantisaddress.com/api/soap/mantisconnect.php?wsdl', array('trace'=> 1, 'exceptions' => 0));
$result = $client->__soapCall($function_name, $args);
} catch (SoapFault $e) {
//$result = array(
// 'erro' => $e->faultstring
//);
}
Во-вторых, я заметил, что в начале моей строки был этот три трейлинг-элемента управления char, поэтому я удалил его:
$str = substr($client->__getLastResponse(), 3) . "pe>";
print $str;
В-третьих, я должен положить "pe > " в конце моей строки, потому что он был неполным.
Ответ 11
Ниже может быть проблема для некоторых пользователей. потому что я прошел через него.
Для последней версии nuSoap ниже будет решена ваша проблема:
НАЙТИ код ниже в nusoap.php
$this->debug("serializing array element: $k, $v of type: $typeDef[arrayType]");
в строке 6132 или что-то вроде этого.
И КОММЕНТАРИЙ IT
// $this->debug("serializing array element: $k, $v of type: $typeDef[arrayType]");
Так как это просто для отладки. поэтому не стоит беспокоиться о каких-либо проблемах с функциональностью.