14

我正在尝试创建一个 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 标记之前或之后有空格,但事实并非如此。它已经让我发疯了好几个小时!任何帮助将非常感激。

4

11 回答 11

7

字节顺序标记 (BOM) 与 php 标记之前的空格具有相同的效果。 在这里,您可以找到一个 PHP 片段来检测和删除 BOM。请务必将您的编辑器配置为不再插入 BOM。

于 2010-11-30T15:49:48.290 回答
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

于 2016-02-16T10:35:20.550 回答
4

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

  • 打印/回显内容
  • 里克的回答也是
  • 错误(例如,由于包含中的文件名错误,我目前遇到此错误,生成包含错误而不是执行脚本...)
  • SOAP 服务器中的错误参数
  • 两侧的压缩级别不同(如果使用压缩)

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

于 2012-09-07T13:24:21.087 回答
4

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

于 2017-01-10T13:09:40.687 回答
3

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

具体来说,SoapClient 的内部函数xmlParseDocumentxmlParserCtxtPtr->wellFormed属性设置为false解析后。它会引发肥皂故障looks like we got no XML document

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

于 2015-10-13T16:22:34.903 回答
2

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

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

于 2012-05-21T05:32:35.730 回答
1

据我了解,当 XML 无效时 SOAP 解析器的错误。

就像我一样。

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

警告:simplexml_load_string():实体:第 1 行:解析器错误:xmlParseCharRef:无效的 xmlChar 值 26

  1. 第一个病人是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);
}

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

于 2016-07-21T08:29:46.780 回答
0

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

于 2014-05-14T08:25:49.230 回答
0

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

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

于 2015-03-23T17:16:54.267 回答
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 来实例化一个肥皂客户端。

于 2021-02-02T21:51:42.613 回答
0

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

我的解决方案在这里:理解多部分消息的 PHP SOAP 客户端?.

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

我希望它可以帮助某人。

于 2020-06-01T08:39:13.707 回答