我正在使用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);
Run Code Online (Sandbox Code Playgroud)
出于某种原因,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> ...
Run Code Online (Sandbox Code Playgroud)
当XML节点名称应该是变量名时,它是如何变换的?我究竟做错了什么 ??
谢谢
更新:所以我列出了该Web服务的功能,我得到的是:
Some_Service_Response Some_Service(Some_Service $parameters))
Run Code Online (Sandbox Code Playgroud)
我改变了我的电话,现在是:
$SOAP->__call('Some_Service', array('Some_Service', $data));
Run Code Online (Sandbox Code Playgroud)
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> ....
Run Code Online (Sandbox Code Playgroud)
我还是得到的 <param1><item><key>SomeKey</key><value>SomeValue</value> instead of
<Somekey>SomeValue</Somekey>
所以问题是,Web服务不能正常运行还是我的结束?
本SoapClient类使得基于服务的WSDL许多修正,如删除无效的标签.检查WSDL,它可能包含参数的名称param1和param2.
调用SoapClient::__getFunctions()和SoapClient::__getTypes()转储结果可以很好地总结PHP从WSDL中理解的内容.
(OP之后更新了输出的问题SoapClient::__getFunctions()是:
Some_Service_Response Some_Service(Some_Service $parameters))
Run Code Online (Sandbox Code Playgroud)
)
通常,数组键是参数名称,而不是类型.所以我的第一个猜测是:
$SOAP->__call('Some_Service', array('parameters', $data));
Run Code Online (Sandbox Code Playgroud)
问题可能在服务器端.WSDL不兼容性有时需要手动调优WSDL文件,以便PHP发出您想要的相同XML.
但在进行任何黑客攻击之前(如果有机会)请确保在没有PHP的情况下尝试服务,以查看服务对不同XML文件的反应.一个名为SoapUI的好程序可以为你做这个,它会自动生成要测试的XML存根.(我只有使用需要数字签名的Web服务的SoapUI出现问题.)
根据XML测试的结果,您可能需要:
SoapClient类派生并覆盖SoapClient::__doRequest方法,在提交给服务器之前对XML文件进行字符串操作(通过调用__dorequest基类).举个例子,当我使用这个解决方案时,Web服务需要在某些标签上重新发送一些XML属性.如果我是你,我会尝试以对象格式设置 $data 。
$data = array('name' => 'test', 'age' => 20);
Run Code Online (Sandbox Code Playgroud)
例如:
$data = null;
$data->name = "test";
$data->age = 20;
$RESULT = $SOAP->__soapCall('Some_Service', $data);
Run Code Online (Sandbox Code Playgroud)