代码之家  ›  专栏  ›  技术社区  ›  mac

如何使用返回PHP中复杂类型的Web服务?

  •  0
  • mac  · 技术社区  · 16 年前

    我正在使用 PHP5.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>
    

    我发现我不是唯一一个遇到这个问题的人。尤其是我发现 this comment 在PHP官方文档和 this other forum entry 就如何处理这个问题给出两种不同的想法,但我没能改变这两种想法中的任何一种 思想 变成一个 工作方案 :我似乎不完全理解所给出例子背后的逻辑。

    如果有人能指导我这样做,我将不胜感激:欢迎在另一个Web服务上使用一些工作代码,但我主要追求的是真正理解问题和所提议解决方案的逻辑(鱼道,而不是鱼!):)

    3 回复  |  直到 13 年前
        1
  •  1
  •   mac    15 年前

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

        2
  •  0
  •   Anthony    16 年前

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

    首先,您是否尝试查看发送到SOAP服务器的SOAP请求(信封)?它看起来应该工作吗?你能看到哪里出了问题吗?你只是得到了一个错误,一个soapfault,或者错误的数据,或者什么都没有?

    第二,你试过使用 SoapParam 班级?

    最后,我确信您做得对,但是我注意到您正在构建的对象有username和fieldone,fieldtwo并排,但是您的WSDL显示fieldone和fieldtwo是类client的一部分(在您的示例中从未显示),而username应该在utilizzatore数组中,所以它不应该更像:

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

    对于我来说,SoapClient类是非常令人沮丧的,所以不要把这当作批评,因为我只希望通过提供可能对您有所帮助的想法来更好地理解它。

        3
  •  0
  •   mac    14 年前

    麦克,非常感谢你的及时回复。看看我在什么上面摔了一跤……我以前没看过这个。因此想分享 this .

    推荐文章