PHP SoapClient格式错误的xml

时间:2013-01-16 16:32:47

标签: php soap

我正在使用php与SOAP中的web服务进行通信。这是我的代码:

$data = array('name' => 'test', 'age' => 20);
$WDSL = 'http://xxx.xxxxx.xxx/wdsl.ibs?wsdl';
$SOAP = new SoapClient($WDSL, array('trace' => true));
$RESULT = $SOAP->__soapCall('Some_Service', $data);

由于某种原因,XML是错误的:

<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:Some_Crap"><SOAP-ENV:Body><ns1:Some_Service/><param1>test</param1><param2>20</param2> ...

当XML节点名称应该是变量名时,为什么它是paramX?我做错了什么?

由于

更新: 所以我列出了该Web服务的功能,我得到的是:

Some_Service_Response Some_Service(Some_Service $parameters))

我改变了我的电话,现在是:

$SOAP->__call('Some_Service', array('Some_Service', $data));

XML仍然是错误的:

<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="
http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="urn:iwaysoftware:ibse:jul2003:HR_Master"><SOAP-ENV:Body><ns1:Some_Service/>
<param1><item><key>SomeKey</key><value>SomeValue</value> ....

我仍然得到<param1><item><key>SomeKey</key><value>SomeValue</value> instead of <Somekey>SomeValue</Somekey>

所以问题是,Web服务是否工作不正常还是我的结束?

2 个答案:

答案 0 :(得分:7)

SoapClient类基于服务的WSDL进行许多更正,例如删除无效标签。检查WSDL,它可能包含参数名称param1param2

调用SoapClient::__getFunctions()SoapClient::__getTypes()并转储结果可以很好地总结PHP从WSDL中理解的内容。


(在OP更新了SoapClient::__getFunctions()的输出之后的问题:

Some_Service_Response Some_Service(Some_Service $parameters))

通常数组键是参数名称,而不是类型。所以我的第一个猜测是:

$SOAP->__call('Some_Service', array('parameters', $data));

问题可能出在服务器端。 WSDL不兼容性有时需要手动调优WSDL文件,以便PHP发出您想要的相同XML。

但在进行任何黑客攻击之前(如果有机会)请务必尝试不使用PHP的服务,以查看服务对不同XML文件的反应。一个名为SoapUI的好程序可以为您执行此操作,它会自动生成要测试的XML存根。 (我只使用需要数字签名的Web服务来解决SoapUI问题。)

根据XML测试的结果,您可能需要:

  • 手动调整WSDL
  • 手动生成XML文件并将其发送到Web服务器(最后的手段)
  • 如果XML几乎是正确的,它只需要一个小的微调,您也可以从SoapClient类派生并覆盖SoapClient::__doRequest方法对XML文件进行字符串操作,然后再提交给server(通过调用基类的__dorequest)。举个例子,当我使用这个解决方案时,Web服务需要在某些标签上重新发送一些XML属性。

答案 1 :(得分:4)

如果我是你,我会尝试以对象格式设置$ data。

$data = array('name' => 'test', 'age' => 20);

例如:

$data = null;
$data->name = "test";
$data->age = 20;

$RESULT = $SOAP->__soapCall('Some_Service', $data);