Как избавиться от исключения 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.

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

Ответ 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]");

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