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

Php SOAP:看起来我们没有XML文档,php,soap,nusoap,Php,Soap,Nusoap,我正在尝试创建一个web服务,但在创建之前,我试图先获得一个在internet上找到的简单示例,但我一直遇到以下错误: 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 f

我正在尝试创建一个web服务,但在创建之前,我试图先获得一个在internet上找到的简单示例,但我一直遇到以下错误:

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

我的web服务代码如下所示:

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标记前后都有空格,但事实并非如此。几个小时来它一直让我发疯!任何帮助都将不胜感激。

字节顺序标记(BOM)与php标记前的空格具有相同的效果。
您可以找到一个PHP代码段来检测和删除BOM表。请确保将编辑器配置为不再插入BOM表。

我在与加载模型的Magento API交互时收到此错误,它在输出导致错误的xml响应之前抛出警告


要修复此问题,只需关闭API函数上的警告:
error\u reporting(0)

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

  • 打印/回显内容
  • 里克的回答也是
  • 错误(例如,由于在include中写入错误的文件名,导致我当前出现此错误,生成include错误而不是执行脚本…)
  • SOAP服务器中的错误参数
  • 两侧的压缩级别不同(如果使用压缩)

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

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

另一个可能的解决方案

我也有同样的问题,我快疯了。解决办法很简单。 正在验证我的服务器。。因为这是一个服务器错误。
我的错误是我将“rcp”改为“rpc”。

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

详细地说,SoapClient
xmlParseDocument
的内部函数在解析后将
xmlparserctptr->wellFormed
属性设置为
false
。它对
抛出了soap错误,看起来我们没有XML文档


很晚了,但添加我的修复程序是为了让其他人受益。在windows上,我将Apache服务器从2.2更改为2.4,将PHP5.4.10更改为5.6.18时,也遇到了类似的错误。客户端应用程序使用PHP5.6.1。为解决此问题,我已执行以下操作:

  • 已将SOAP版本参数传递给SOAP客户端:

    “soap\U版本”=>soap\U 1\U 1

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

    始终\u填充\u原始\u发布\u数据=-1


  • 据我所知,SOAP解析器在出现无效XML时的错误

    就像我一样

  • 打开错误显示
  • 在try catch和catch调用\uu getLastResponse中执行
  • 我发现另一个错误:
  • 警告:simplexml_load_string():实体:第1行:解析器错误: xmlParseCharRef:中的xmlChar值26无效

  • 第一个病人是PHP5.3。一旦在PHP5.4上运行脚本,就会出现更多的信息性错误——我发誓是一个无效字符,大概是因为这个字符,我就爱上了SOAP解析器
  • 因此,我获得了以下代码:

    $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);
    }
    

    如果有人在评论中告诉我什么是符号,我将不胜感激。

    在php.ini文件中设置
    始终填充
    (通过删除
    ),然后重新启动服务器。这对我来说很好。

    这篇文章很老,但我认为它总是很有用的,因为我发疯了,不明白为什么会出现这个错误

    我的解决方案就在这里:

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


    我希望它能帮助一些人。

    多年后,我认为这是另一个对一些人有用的输入;我的案例是在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
    {
    公共函数\u doRequest($request、$location、$action、$version、$one\u way=0)
    {
    $response=parent::u doRequest($request、$location、$action、$version、$one\u way);
    //除去xml以外的所有内容(包括删除BOM)
    $response=preg_replace(“#^.*”[^>]*$#s',“$1',$response);
    //同时拆下单元分离器
    $response=str_replace(“\x1f”,”$response);
    返回$response;
    }
    }
    

    现在使用SoapClientNoBOM而不是本机SoapClient来实例化soap客户端。

    API函数位于何处?您正在调用的任何API函数,如果是您自己的自定义API函数,请将其放在其中。如果不是您自己的,您将需要调试以找到哪一个。这可能是?
    \u getLastResponse()
    帮助我识别无效字符