Как избавиться от "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() методы.


у меня просто была аналогичная проблема; оказывается, моя служба была echoing некоторые отладочные данные. Я удалил все 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]");

Так как это только для отладки. поэтому не беспокойтесь о каких-либо проблемах с функциональностью.