我正在使用 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 comment和this other forum entry给出了关于如何处理问题的两个不同的想法,但我无法转换这两个想法中的任何一个进入工作解决方案:我似乎不完全理解给出的示例背后的逻辑。
如果有人能指导我,我将不胜感激:其他网络服务上的一些工作代码会受到欢迎,但我主要关注的是真正理解问题和提出的解决方案的逻辑(鱼道,而不是鱼!)。 :)
答案 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。