首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP SoapClient错误的xml

PHP SoapClient错误的xml
EN

Stack Overflow用户
提问于 2013-01-17 00:32:47
回答 2查看 6.4K关注 0票数 6

我正在用php用SOAP和一个php服务进行通信。下面是我的代码:

代码语言:javascript
运行
复制
$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是错误的:

代码语言:javascript
运行
复制
<?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,而它应该是变量名?我做错了什么??

谢谢

更新:我已经列出了该get服务的函数,我得到的结果是:

代码语言:javascript
运行
复制
Some_Service_Response Some_Service(Some_Service $parameters))

我改了我的电话,所以现在是:

代码语言:javascript
运行
复制
$SOAP->__call('Some_Service', array('Some_Service', $data));

而且XML仍然是错误的:

代码语言:javascript
运行
复制
<?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服务不能正常工作,还是在我这一端?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-04 01:31:25

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

代码语言:javascript
运行
复制
$data = array('name' => 'test', 'age' => 20);

为例:

代码语言:javascript
运行
复制
$data = null;
$data->name = "test";
$data->age = 20;

$RESULT = $SOAP->__soapCall('Some_Service', $data);
票数 5
EN

Stack Overflow用户

发布于 2013-01-17 00:36:17

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

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

( OP更新后,SoapClient::__getFunctions()输出的问题是:

代码语言:javascript
运行
复制
Some_Service_Response Some_Service(Some_Service $parameters))

)

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

代码语言:javascript
运行
复制
$SOAP->__call('Some_Service', array('parameters', $data));

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

但是,在进行任何黑客攻击之前(如果有机会),请确保在没有PHP的情况下尝试该服务,以查看该服务对不同文件的反应。一个名为SoapUI的很好的程序可以为您做这件事,它会自动生成要测试的XML存根。(我只对需要数字签名的web服务的SoapUI有问题。)

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

  • 手动调整WSDL
  • Generate XML文件并将其发送到web服务器(最后的手段)
  • 如果XML几乎是正确的,它只需要一个小的微调你也可以从SoapClient类派生并覆盖SoapClient::__doRequest方法在提交到服务器之前对XML文件做字符串操作(通过调用基类的__dorequest )。例如,当web服务需要在某些标记上重新发送一些XML属性时,我使用此解决方案。
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14363147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档