2010-03-29 23 views
10

我想开发一个动态站点在服务器端使用nusoap的业务逻辑(因为我需要wsdls和PHP SOAP扩展无法生成wsdls)以及客户端的PHP SOAP扩展。如何摆脱“未捕获的SoapFault异常:[客户端]看起来像我们没有XML文档...”错误

但是,我甚至无法登录和getRole函数。当我尝试调用客户端,我获得以下消息

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

WSDL并在服务器端存在,而且客户端不会读它(当我把错误的URL的WSDL,我得到一个错误)。

任何人都可以帮忙吗?

回答

19

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

8

我刚刚有一个类似的问题;结果我的服务是echo输出一些调试数据。我删除了所有的echo行,它工作正常。

4

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

在PHP服务器SOAP文件有BOM编码UTF8,造成阿帕奇发回BOM标记(3字节)在xml响应之前。

用utf8编码你的php文件肥皂服务器带出BOM标记。

伊格纳西奥·古铁雷斯Torrero

1

有些时候,一个BOM可以生成创建该类型的问题的一些额外的字符。

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

+2

虽然这在理论上回答这个问题,这将是最好(HTTP ://meta.stackexchange.com/q/8259),您可以编辑答案以包含解决方案的重要部分,并提供供参考的链接。 – 2012-02-10 20:09:10

2

只需使用trim()给你参数。

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

在我而言,当我随“?>”标签后的空白行脚本出现此错误。

删除这些行解决了问题

+0

我的<?php标记之前,通过删除其中一个包含文件中的某些空白来修复了我的问题。必须错误地点击标签,并在某个时刻保存该文件。 – 2017-02-01 08:29:54

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/catch块:

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

以下可能是问题的一些用户。因为我已经通过了它。

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

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

1

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

我发现这个通过添加“跟踪” => 1,“例外” => 1在选择和使用try catch并获得__getLastRequest()__getLastResponse()

+1

请注意,自PHP 7.0.0以来,always_populate_raw_post_data已被删除 – 2016-10-24 13:30:30

相关问题