Php SOAP:看起来我们没有XML文档
我正在尝试创建一个web服务,但在创建之前,我试图先获得一个在internet上找到的简单示例,但我一直遇到以下错误: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
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
)
详细地说,SoapClientxmlParseDocument
的内部函数在解析后将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("",'',$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()
帮助我识别无效字符