如何摆脱“Uncaught SoapFault异常:[客户端]看起来我们没有得到XML文档......”错误

时间:2010-03-29 18:50:49

标签: php soap wsdl web-services nusoap

我正在尝试使用服务器端的nusoap为动态站点开发业务逻辑(因为我需要wsdls,PHP SOAP扩展不能生成wsdls),以及客户端的PHP SOAP扩展。

然而,我甚至无法获得登录和getRole功能。当我尝试调用客户端时,我收到以下消息

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

Wsdl确实存在于服务器端,而客户端确实读取它(当我为wsdl输入错误的url时,我收到错误)。

任何人都可以帮忙吗?

11 个答案:

答案 0 :(得分:21)

看起来您的客户端收到一些无效的XML - 无论是WSDL本身还是服务器返回的响应。尝试在trace选项设置为TRUE的情况下调用客户端,并通过__getLastRequest()__getLastResponse()方法检查实际发送/接收的XML。

答案 1 :(得分:8)

我遇到了类似的问题;事实证明我的服务是echo一些调试数据。我删除了所有echo行并且工作正常。

答案 2 :(得分:4)

我有同样的问题,我解决了这个问题:

php中的服务器SOAP文件使用BOM编码utf8,导致apache在xml响应之前发回BOM标记(3个字节)。

使用utf8 WITH OUT BOM标记对您的php文件soap服务器进行编码。

Ignacio Gutierrez Torrero

答案 3 :(得分:2)

有可能在SOAPServer类的末尾有一些尾随空格。有关详细信息,请查看以下blog posthttp://arnekroeger.blogspot.com/2011/02/php-soap-error-looks-like-we-got-no-xml.html

答案 4 :(得分: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"));

答案 5 :(得分:2)

在我的情况下,当我在“?>”之后包含带有空行的脚本时出现此错误标签。

删除这些行解决了问题

答案 6 :(得分:2)

不要忘记使用try / catch块:

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

答案 7 :(得分:1)

有时,BOM会生成一些额外的字符,从而产生此类问题。

要检测是否有任何UTF BOM,请参阅此link

答案 8 :(得分:1)

我有办法解决这个问题。这不是一个很好的解决方案,但它有效......

我如何在我的螳螂服务器上做任何更改,我决定这样做......

首先我要沉默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>"在我的字符串的末尾,因为它不完整。

答案 9 :(得分:1)

我有同样的问题。我的问题通过在php.ini上设置always_populate_raw_post_data-1来解决。

我通过在选项中添加" trace" => 1,"例外" => 1来找到这一点并使用try catch并获取__getLastRequest()__getLastResponse()

答案 10 :(得分:0)

以下可能是某些用户的问题。因为我经历过它。

对于最新的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]");

因为它仅用于调试目的。所以不要担心任何功能问题。