目前我正在开发内部soap服务来控制一些内部流程。这通常不是那么难。但是,我尝试使用soapClient类映射功能来映射对象,而不是使用通常为非复杂类型返回的stdClasses。
考虑到wsdl和来源在代码中占用了大量空间这一事实,我将链接到相关文档而不是在这个问题上发送垃圾邮件。
首先,我使用Zend_Soap_Server和Zend_Soap_Server_Autodiscover进行Soap服务和wsdl生成。
肥皂服务器代码: https://www.dropbox.com/s/eji7l50g42m2ixl/SoapServer.txt
?wsdl请求的WSDL结果: https://www.dropbox.com/s/vyxbjz7wogd8suy/wsdl.txt
soap服务发布服务类。此类包含从soap服务获取数据的方法。此方法称为getPackages。
getPackages方法构成soap服务: https://www.dropbox.com/s/p5ddxpraju7ru6x/method_from_serviceclass.txt
getPackages方法返回一个DataObject,后者又返回包含对其他数据对象的引用。这两个对象作为客户端存在于两个服务器上,两端完全相同。
主要数据对象: https://www.dropbox.com/s/qt51pw3rpq7c2ba/dataobject.txt
当连接到这个服务并调用getPackages方法时,我得到了预期的响应:一个包含vps和共享属性的stdClass。
不幸的是,在添加类映射时,结果仍然完全相同..包含vps和共享属性的stdClass。预期的结果是包含vps和共享属性的Soho_Soap_DataObject_Packages对象。
这是使用过的SoapClient代码: https://www.dropbox.com/s/ulnni84p8dawv97/SoapClient.txt
当我通过Soap调用getPackages方法时,我得到以下内容:
$SoapClient = \Soho_Soap_Client::getInstance();
$packages = $SoapClient->getPackages();
print_r($packages);
输出:
stdClass Object
(
[shared] => Array
(
[0] => stdClass Object
(
[id] =>
[title] =>
[pricePerPeriod] =>
[price] =>
[minRegistrationMonths] =>
[properties] =>
[options] => Array
(
)
)
)
[vps] =>
)
但是,如果我查看响应类型,我会得到以下内容:
print_r( $SoapClient->__getTypes() );
输出:
Array
(
[0] => Soho_Soap_DataObject_Package_Shared ArrayOfSoho_Soap_DataObject_Package_Shared[]
[1] => struct stdClass {
}
[2] => Soho_Soap_DataObject_Package_Shared_Option ArrayOfSoho_Soap_DataObject_Package_Shared_Option[]
[3] => struct Soho_Soap_DataObject_Package_Shared_Option {
string title;
string value;
}
[4] => struct Soho_Soap_DataObject_Package_Shared {
int id;
string title;
int pricePerPeriod;
int price;
int minRegistrationMonths;
stdClass properties;
ArrayOfSoho_Soap_DataObject_Package_Shared_Option options;
}
[5] => Soho_Soap_DataObject_Package_Vps ArrayOfSoho_Soap_DataObject_Package_Vps[]
[6] => Soho_Soap_DataObject_Package_Vps_Option ArrayOfSoho_Soap_DataObject_Package_Vps_Option[]
[7] => struct Soho_Soap_DataObject_Package_Vps_Option {
string title;
string value;
}
[8] => struct Soho_Soap_DataObject_Package_Vps {
int id;
string title;
int pricePerPeriod;
int price;
int minRegistrationMonths;
stdClass properties;
ArrayOfSoho_Soap_DataObject_Package_Vps_Option options;
}
[9] => struct Soho_Soap_DataObject_Packages {
ArrayOfSoho_Soap_DataObject_Package_Shared shared;
ArrayOfSoho_Soap_DataObject_Package_Vps vps;
}
)
谷歌对我的帮助不大,因为类图表文档化并不是一件好事,所以我希望堆栈社区可以解决我的问题。
盯着同样的问题2天让我感到绝望。
不久之前,我以同样的方式使用SoapClient与vmware vsphere API进行通信,该API运行良好,所以我认为问题与WDSL有关,但目前我迷失了。
我感谢每个人花时间提前查看我的问题。我会在要求时提供额外的信息。
答案 0 :(得分:9)
查看代码时有一件事情跳出来,那就是zend_soap_server
实例应该使用它自己的WSDL,如下所示:
$SoapServer = new Zend_Soap_Server($urltowsdl, array('classmap' => $classmap));