Как избавиться от ошибки «Uncaught SoapFault: [Клиент] выглядит так, как будто мы не получили XML-документ в ...» - PullRequest
10 голосов
/ 29 марта 2010

Я пытаюсь разработать бизнес-логику для динамического сайта, используя nusoap на стороне сервера (потому что мне нужны wsdls, а расширение PHP SOAP не может генерировать wsdls) и расширение PHP SOAP на стороне клиента.

Однако я не могу правильно настроить функции входа и getRole. Когда я пытаюсь вызвать клиента, я получаю следующее сообщение

Uncaught SoapFault exception: [Client] looks like we got no XML document in [some paths]...

Wsdl существует на стороне сервера, и клиент его читает (когда я неправильно указываю URL для wsdl, я получаю сообщение об ошибке).

Может кто-нибудь помочь ??

Ответы [ 11 ]

21 голосов
/ 31 марта 2010

Похоже, ваш клиент получает недопустимый XML-код - либо сам WSDL, либо ответ, возвращаемый сервером. Попробуйте вызвать клиента с параметром trace, установленным в значение ИСТИНА, и проверить фактический XML, отправленный / полученный с помощью методов __getLastRequest() и __getLastResponse().

8 голосов
/ 19 июля 2010

У меня просто была похожая проблема; Оказывается, мой сервис echo извлекает некоторые отладочные данные. Я удалил все строки echo и все заработало.

4 голосов
/ 28 июля 2011

У меня та же проблема, и я решил с этим:

Серверный файл SOAP в php имеет кодировку utf8 с BOM, в результате чего apache отправляет обратно метку BOM (3 байта) до ответа xml.

Кодируйте ваш php файл мыльным сервером с меткой utf8 WITH OUT BOM.

Игнасио Гутьеррес Торреро

2 голосов
/ 02 июля 2015

Не забудьте использовать блок try / catch:

try {
    var_dump($client->foo());
} catch (Exception $e) {
    echo($client->__getLastResponse());
    echo PHP_EOL;
    echo($client->__getLastRequest());
}
2 голосов
/ 05 июля 2013

В моем случае эта ошибка появилась, когда я включил скрипт с пустыми строками после метки "?>".

Удаление этих строк решает проблему

2 голосов
/ 26 сентября 2012

Просто используйте trim () для ваших аргументов.

$objectRequette = trim($_POST['Requette']) ;
$client = new SoapClient(null, array(
    'location' => 'http://your.php',
    'uri'=>'your option',
));
$result = $client->__soapCall('Misyka', array("$objectRequettea"));
2 голосов
/ 04 мая 2011

Скорее всего, у вас есть пробел в конце вашего класса SOAPServer. Пожалуйста, взгляните на следующее сообщение в блоге для получения дополнительной информации: http://arnekroeger.blogspot.com/2011/02/php-soap-error-looks-like-we-got-no-xml.html

1 голос
/ 07 октября 2016

У меня такая же проблема. Моя проблема решена путем установки always_populate_raw_post_data в -1 на php.ini.

Я выясняю это, добавляя «trace» => 1, «exception» => 1 в опциях и использую try catch и получаю __getLastRequest() и __getLastResponse()

1 голос
/ 28 марта 2014

У меня есть способ решить эту проблему. Это не очень хорошее решение, но оно работает ...

Как я не могу внести никаких изменений в свой сервер богомола, я решил сделать это ...

Сначала я должен заставить замолчать 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
    //);
}

Во-вторых, я заметил, что в начале моей строки были три концевых контрольных символа, поэтому я удалил их:

$str = substr($client->__getLastResponse(), 3) . "pe>";
print $str;

В-третьих, я должен поставить "pe>" в конце моей строки, потому что она была неполной.

1 голос
/ 10 февраля 2012

Иногда BOM может генерировать дополнительные символы, которые создают проблемы такого типа.

Чтобы определить, есть ли какая-либо спецификация UTF, смотрите эту ссылку .

...