如何在PHP中使用返回complexTypes的web服务?

时间:2010-01-28 11:23:30

标签: php soap soap-client complextype

我正在使用 PHP 5.2.10 ,我正在尝试使用 standard SOAP extension 复杂数据类型的网络服务>

问题是SoapClient不会填充嵌套到其他对象/对象数组中的对象。我调用getUtente方法时将“my_unique_id”指定为参数的简化示例是:

stdClass Object
(
    [getUtenteReturn] => stdClass Object
        (
            [userName] => my_unique_id
            [fieldOne] => ...
            [fieldTwo] => ...
            [utilizzatore] => stdClass Object
                ( // This is EMPTY instead of containing a series of userName's
                )

        )

)

WDSL描述的相关部分是:

<element name="getUtenteResponse">
  <complexType>
    <sequence>
      <element name="getUtenteReturn" type="tns1:Cliente"/>
    </sequence>
  </complexType>
</element>
...
<complexType name="Utilizzatore">
  <sequence>
    <element name="userName" nillable="true" type="xsd:string"/>
  </sequence>
</complexType>
...
<complexType name="Cliente">
  <complexContent>
    <extension base="tns1:Utilizzatore">
      <sequence> 
        <element name="fieldOne" nillable="true" type="xsd:string"/>
        <element name="fieldTwo" nillable="true" type="xsd:string"/>
        <element name="utilizzatore" nillable="true" type="impl:ArrayOf_tns1_Utilizzatore"/>
      </sequence>
    </extension>
  </complexContent>
</complexType>

我发现我不是唯一遇到此问题的人。特别是我在PHP官方文档中发现this commentthis other forum entry给出了关于如何处理问题的两个不同的想法,但我无法转换这两个想法中的任何一个进入工作解决方案:我似乎不完全理解给出的示例背后的逻辑。

如果有人能指导我,我将不胜感激:其他网络服务上的一些工作代码会受到欢迎,但我主要关注的是真正理解问题和提出的解决方案的逻辑(鱼道,而不是鱼!)。 :)

3 个答案:

答案 0 :(得分:1)

老问题,没有答案。我最近偶然发现了这篇文章,它解释了问题并给出了解决方案:Consuming SOAP complexType webservice with PHP

答案 1 :(得分:0)

这是我的直接想法,抱歉这不是一个正确的答案,只是一些想法...

首先,您是否尝试过查看发送到soap服务器的soap请求(信封)?它看起来应该有效吗?你能看出它出错的地方吗?您是刚刚收到错误消息,还是错误的数据,还是什么都没有?

其次,您是否尝试过使用SoapParam类?

最后,我确定你做得对,但我注意到你正在构建的对象有username和fieldOne以及fieldTwo并排,但你的WSDL显示fieldOne和fieldTwo是Cliente类的一部分(虽然在你的例子中没有出现),而用户名应该在utilizzatore数组中,所以不应该更像:

stdClass Object
(
    [Cliente] => stdClass Object
        (
            [fieldOne] => ...
            [fieldTwo] => ...
            [utilizzatore] => stdClass Object
                ( // This is EMPTY instead of containing a series of userName's
                )

        )

)

SoapClient课程对我来说非常令人沮丧,因此不要将此作为批评,因为我只希望通过提供可能对您有所帮助的想法来更好地理解它。

答案 2 :(得分:0)

Mac,非常感谢您及时的回复。看看我摔倒的东西......我之前没有看过这个。因此,想要分享this