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