2013-01-16 84 views
6

我正在使用PHP与SOAP在web服务进行通信。这里是我的代码:PHP SoapClient格式错误xml

$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服务不能正常工作,还是在我的最后?

回答

4

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

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

例如:

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

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

已经是这种情况了 – Eric

+0

@Eric问题'$ data'是一个数组,而不是一个对象。 –

+0

哦对不起,对,你是对的:) – Eric

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文件执行字符串操作(通过调用基地的__dorequest类)。举个例子,当我使用这个解决方案时,Web服务需要在某些标签上重新发送一些XML属性。
+0

不,这里是WSDL没有这样的事情.. – Eric

+0

这是我得到:阵列([0] =>结构ibsinfo {弦业务;串方法;字符串许可;字符串处置;字符串用户名;字符串密码;字符串语言;} [1] =>结构适配器{字符串错误;} [2] =>结构Some_Service {Some_Service_ComplexType hr_master;} [3] =>结构Some_Service_ComplexType { WS_Transaction_ID WS_Transaction_ID; Web_Service_Request_Type ... – Eric

+1

请把它放在问题b中(一)它属于那里(二)评论不能有新线,以提高可读性(三)评论有限长度和有趣的部分丢失 – Csq