Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用在PHP中返回complexTypes的Web服务?_Php_Soap_Soap Client_Complextype - Fatal编程技术网

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

如何使用在PHP中返回complexTypes的Web服务?,php,soap,soap-client,complextype,Php,Soap,Soap Client,Complextype,我使用的是PHP5.2.10,我试图使用一个返回复杂数据类型的Web服务 问题是SoapClient不填充嵌套到其他对象/对象数组中的对象。调用getutete方法时,将“my_unique_id”指定为参数,得到的一个简化示例如下: stdClass Object ( [getUtenteReturn] => stdClass Object ( [userName] => my_unique_id [field

我使用的是PHP5.2.10,我试图使用一个返回复杂数据类型的Web服务

问题是SoapClient不填充嵌套到其他对象/对象数组中的对象。调用getutete方法时,将“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官方文档中找到了,并就如何解决这个问题给出了两种不同的想法,但我无法将这两种想法中的任何一种转化为有效的解决方案:我似乎没有完全理解给出的示例背后的逻辑


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

以下是我的想法,抱歉这不是一个正确的答案,只是一些想法

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

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

最后,我确信你做得对,但我注意到你正在构建的对象有username和fieldOne以及fieldTwo并排,但是你的WSDL显示fieldOne和fieldTwo是类Cliente的一部分(在你的示例中从未出现),而username应该在utilizztore数组中,那么,它不应该更像:

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

        )

)

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

Mac,非常感谢您的及时回复。看我跌倒在什么东西上。。我之前没有看这个。因此我想与大家分享。

老问题,没有答案。我最近无意中发现了这篇文章,它解释了问题并给出了解决方案:。

@Anthony-没有必要为这不是一个“正确的答案”而道歉。。。我真的很感谢你花时间调查此事。正如您在我对anusha的评论中所读到的,我们最终选择修改Web服务而不是客户端。但是,我仍然想了解/解决这个问题,因此问题仍然悬而未决。:)至于您提出的要点,请参阅下一条评论。@Anthony-1)SOAP WS可以很好地用于java客户端,PHP不会抛出错误,但不会填充utilizzatore对象。我的印象是,如果WS不返回任何数据,utilizzatore为NULL,而如果XML中有一些数据,utilizzatore为空对象。2) SoapParam:在已经做出修改WS的决定之后,我非常匆忙地尝试了(没有成功)。如果您认为这是一种方法,我很高兴以更冷静的态度再次尝试:除了PHP.net上非常简洁的文档之外,您还有其他指针吗?3) 我的错。我在我的问题的WSDL部分添加了相关的部分。我很高兴我已经对WS和SOAP有了足够的了解,能够抓住它!您没有提到Soap响应和请求实际上是什么。我敢打赌,这将比变量设置更能说明问题。使用
\uuu getLastRequest
\uu getLastResponse
查看发送和接收的XML。在其中一个的末尾添加头以查看其中一个的HTTP头。请求将向您显示PHP变量是如何作为XML传输的。我打赌你会马上发现这个问题,即使解决办法仍然很神秘。