SOAP:看起来我们没有XML文档

时间:2010-11-30 12:51:36

标签: php soap nusoap

我正在尝试创建一个Web服务,但在此之前,我试图找到一个我在互联网上找到的简单示例,但我不断收到以下错误:

Fatal error: Uncaught SoapFault exception: [Client] looks like we got no XML document in C:\Documents and Settings\geoff\My Documents\Websites\jquery\index.php:20 Stack trace: #0 [internal function]: SoapClient->__call('getStockQuote', Array) #1 C:\Documents and Settings\geoff\My Documents\Websites\jquery\index.php(20): SoapClient->getStockQuote(Array) #2 {main} thrown in C:\Documents and Settings\geoff\My Documents\Websites\jquery\index.php on line 20

我正在使用nusoap v1.94

我的网络服务代码如下所示:

function getStockQuote($symbol) {
$price = '1.23';
return $price;
}

require('nusoap.php');

$server = new soap_server();

$server->configureWSDL('stockserver', 'urn:stockquote');

$server->register("getStockQuote",
            array('symbol' => 'xsd:string'),
            array('return' => 'xsd:decimal'),
            'urn:stockquote',
            'urn:stockquote#getStockQuote');

$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA)
                  ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);

我知道一个原因是在服务器脚本中的php标记之前或之后有空格,但事实并非如此。这让我疯了几个小时!任何帮助将不胜感激。

11 个答案:

答案 0 :(得分:6)

字节顺序标记(BOM)与php标记之前的空格具有相同的效果。 Here您找到了一个用于检测和删除BOM的PHP代码段。务必将编辑器配置为不再插入BOM。

答案 1 :(得分:6)

很晚但添加了我的修复以造福他人。当我在Windows上将Apache服务器从2.2更改为2.4并将PHP 5.4.10更改为5.6.18时,我遇到了类似的错误。客户端应用程序使用php 5.6.1。为了解决这个问题,我做了以下几点:

  1. 将SOAP版本参数传递给SoapClient:

    'soap_version'=> SOAP_1_1

  2. 在服务器php.ini配置文件中,我添加了:

    always_populate_raw_post_data = -1

答案 2 :(得分:4)

有点晚了,但是这种错误通常是由服务器端(SOAP sense)问题引起的:

  • print / echo content
  • rik的回答
  • 错误(例如我因为包含的文件名错误而导致此错误,生成包含错误而不是执行脚本...)
  • SOAP服务器中的错误参数
  • 两侧压缩程度不同(如果使用压缩)

此消息只是通知您SOAP客户端未收到格式良好的XML(例如,错误消息而不是XML)。

答案 3 :(得分:3)

如果soap XML响应包含特殊的 Unicode字符,也会出现此错误。 就我而言,它是替换字符(U+FFFD)。

详细说明,SoapClient xmlParseDocument的内部函数在解析后将xmlParserCtxtPtr->wellFormed属性设置为false。它会引发looks like we got no XML document的肥皂错误。

https://github.com/php/php-src/blob/master/ext/soap/php_packet_soap.c#L46

答案 4 :(得分:3)

在php.ini文件中设置always_populate_raw_post_data = -1(删除;),然后重新启动服务器。它对我来说很好。

答案 5 :(得分:2)

当我与正在加载模型的Magento API交互时,我收到此错误,并且在输出导致错误的xml响应之前发出了警告。

要修复它,您只需关闭API函数的警告:error_reporting(0);

答案 6 :(得分:1)

据我所知,SOAP解析器出现无效XML时出错。

就像我一样。

  1. 打开错误显示
  2. 在try-catch和catch调用__getLastResponse
  3. 中执行
  4. 我发现了另一个错误:
  5.   

    警告:simplexml_load_string():实体:第1行:解析器错误:   xmlParseCharRef:

    中的xmlChar值无效
    1. 第一名患者为PHP5.3。一旦在PHP5.4上运行脚本,就会出现更多信息错误 - 我发誓对一个无效的角色,因此,大概是,并且掉了SOAP解析器。
    2. 结果,我获得了以下代码:

      $params = array(...);
      try
      {
          $response = $client->method( $params );
      }
      catch(SoapFault $e)
      {
          $response = $client->__getLastResponse();
          $response = str_replace("&#x1A",'',$response); ///My Invalid Symbol
          $response = str_ireplace(array('SOAP-ENV:','SOAP:'),'',$response);
          $response = simplexml_load_string($response);
      }
      

      如果有人会在评论中说出什么符号,我将不胜感激。

答案 7 :(得分:0)

尝试查看您的服务器日志。如果您使用nginx,请查看/var/log/nginx/error.log。 如果弹出“权限被拒绝”,请更改相关的dir所有者。 希望它能奏效。

答案 8 :(得分:0)

另一种可能的解决方案......

我有同样的问题,我疯了。解决方案很简单。 验证我的服务器..因为它是服务器错误。 我的错误是我把“rcp”而不是“rpc”。

答案 9 :(得分:0)

该帖子很旧,但是我认为它总是有帮助的,因为我很疯狂,不知道为什么会出现此错误。

对我来说解决方案在这里:PHP SOAP client that understands multi-part messages?

我必须扩展SoapClient来管理MTOM编码,以获得干净的XML作为响应。

我希望它可以帮助某人。

答案 10 :(得分:0)

多年后,这是我认为对某些人有用的另一个输入;我的情况是在 SAOP 响应正文中返回了一个单位分隔符,从而使 XML 无效。因此,我需要扩展 SoapClient(来自另一个答案的建议)并从响应中删除 0x1f 字符,例如:

class SoapClientNoBOM extends SoapClient
{
    public function __doRequest($request, $location, $action, $version, $one_way = 0)
    {
        $response = parent::__doRequest($request, $location, $action, $version, $one_way);
        // strip away everything but the xml (including removal of BOM)
        $response = preg_replace('#^.*(<\?xml.*>)[^>]*$#s', '$1', $response);
        // also remove unit separator
        $response = str_replace("\x1f", '', $response);
        return $response;
    }
}

现在使用 SoapClientNoBOM 代替原生 SoapClient 来实例化一个 soap 客户端。