我正在尝试创建一个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标记之前或之后有空格,但事实并非如此。这让我疯了几个小时!任何帮助将不胜感激。
答案 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。为了解决这个问题,我做了以下几点:
将SOAP版本参数传递给SoapClient:
'soap_version'=> SOAP_1_1
在服务器php.ini配置文件中,我添加了:
always_populate_raw_post_data = -1
答案 2 :(得分:4)
有点晚了,但是这种错误通常是由服务器端(SOAP sense)问题引起的:
此消息只是通知您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时出错。
就像我一样。
警告:simplexml_load_string():实体:第1行:解析器错误: xmlParseCharRef:
中的xmlChar值无效
结果,我获得了以下代码:
$params = array(...);
try
{
$response = $client->method( $params );
}
catch(SoapFault $e)
{
$response = $client->__getLastResponse();
$response = str_replace("",'',$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 客户端。