php - 使用 php 的 SoapClient 时类映射选项不起作用

标签 php zend-framework soap wsdl soap-client

目前我正在开发一个内部 soap 服务来控制一些内部流程。这通常并不难做到。然而,我正在尝试使用 soapClient 类映射功能来映射对象,而不是使用通常为非复杂类型返回的 stdClasses。

考虑到 wsdl 和源在代码方面占用了大量空间,我将链接到相关文档而不是在这个问题中发送垃圾邮件。

首先,我将 Zend_Soap_Server 和 Zend_Soap_Server_Autodiscover 用于我的 Soap 服务和 wsdl 生成。

Soap 服务器代码: 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;
    }
    )        

Google 对我帮助不大,因为类映射文档不是很好,无法开始,所以我希望堆栈社区能够解决我的问题。

盯着同一个问题 2 天让我感到绝望。

不久前,我以相同的方式使用 SoapClient 与运行良好的 vmware vsphere API 进行通信,因此我确实认为问题与 WDSL 有关,但目前我迷路了。

我感谢所有花时间提前查看我的问题的人。我当然会在需要时提供更多信息。

最佳答案

查看代码时会跳出一件事,那就是 zend_soap_server 实例应该使用它自己的 WSDL,如下所示:

$SoapServer = new Zend_Soap_Server($urltowsdl, array('classmap' => $classmap));

关于php - 使用 php 的 SoapClient 时类映射选项不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13266890/

相关文章:

php - 将 URL 参数注入(inject) Zend_Navigation 菜单

python - 泡沫抛出错误 'type not found' 使用 SOAP 服务

java - Spring Boot 中的 SOAP 客户端 stub 类问题

php - 无法使用 Codeigniter 上传 base64 编码的图像

php - 在 Php/Mysql 中处理时间

zend-framework - 无法在 WAMP 上运行 zend 框架 MVC 应用程序

php - 如何更新关系表?

java - MTOM - 根内容类型始终为文本/xml

c# - 如何在不到 6 小时的执行时间内测试 500 万亿个组合

php - SQS 是缓慢的发布请求