2010-03-29 3 views
10

Я пытаюсь разработать бизнес-логику для динамического сайта, используя nusoap на стороне сервера (потому что мне нужно wsdls и расширение PHP SOAP не могут генерировать wsdls) и PHP SOAP extenstion на стороне клиента.Как избавиться от исключения «Uncaught SoapFault: [Client] выглядит так, как будто у нас нет документа XML в ...» error

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

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

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

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

ответ

19

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

8

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

4

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

Файл SOAP-сервер в PHP имеет кодирование utf8 с BOM, в результате чего апач отправить обратно Значок спецификации (3 байта) перед ответом xml.

Кодировать ваш soap-сервер php с помощью значка utf8 WITH OUT.

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

1

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

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

+2

Хотя это теоретически может ответить на этот вопрос, было бы предпочтительнее (HTTP : //meta.stackexchange.com/q/8259), чтобы вы могли отредактировать ответ, чтобы включить основные части решения, и предоставить ссылку для справки. –

2

Просто используйте trim() для вас args.

$objectRequette = trim($_POST['Requette']) ; 
$client = new SoapClient(null, array(
    'location' => 'http://your.php', 
    'uri'=>'your option', 
)); 
$result = $client->__soapCall('Misyka', array("$objectRequettea")); 
2

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

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

+0

Mine был исправлен, удалив некоторые пробелы в одном из включенных файлов перед тегом

0

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

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

Сначала я должен молчать 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>» в конце моей строки, потому что он был неполным.

2

Не забудьте использовать попробовать/поймать блок:

try { 
    var_dump($client->foo()); 
} catch (Exception $e) { 
    echo($client->__getLastResponse()); 
    echo PHP_EOL; 
    echo($client->__getLastRequest()); 
} 
0

Ниже может быть проблемой для некоторых пользователей. потому что я прошел через это.

Для последней версии NuSOAP, ниже будет решить вашу проблему:

FIND ниже код в 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]"); 

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

1

У меня такая же проблема.my проблема решена набором always_populate_raw_post_data до -1 на php.ini.

я узнаю это, добавив «след» => 1, «исключения» => 1 по вариантам и использовать try catch и получить __getLastRequest() и __getLastResponse()

+1

Обращаем внимание, что always_populate_raw_post_data было удалено с PHP 7.0.0 –

 Смежные вопросы

  • Нет связанных вопросов^_^