【发布时间】:2014-07-05 00:23:27
【问题描述】:
我在从 PHP 应用程序访问 SOAP 服务时传递嵌套数组参数时遇到问题。 我发现了几个关于这个问题的线程,但没有一个能解决我的问题。 所以我希望有人可以在这里帮助我......
我在 xampp 上使用 PHP 5.4.22 进行 Windows 安装并尝试访问 Talentlink API。它的 WSDL 在这里定义:
https://api3.lumesse-talenthub.com/CareerPortal/SOAP/FoAdvert?WSDL
访问通常可以正常工作。 WSSE 身份验证有效,我可以从服务访问数据。 我也可以将参数传递给 Soap-Methods,只要它们是平面结构并定义为基本类型或简单类型:
$this->criteria = $service->getCriteria(array(
'lovOrders' => '1,2,12,13',
'langCode' => 'DE'
));
到目前为止一切顺利。
当我尝试将复杂类型的参数作为数组传递时,我的问题出现了。 我正在尝试访问具有以下定义的 getCriteria 函数:
<xs:complexType name="getCriteria">
<xs:sequence>
<xs:element form="qualified" minOccurs="0" name="langCode" type="tns:langCode"/>
<xs:element minOccurs="0" ref="tns:searchCriteriaSorting"/>
<xs:element form="qualified" minOccurs="0" name="lovOrders" type="xs:string"/>
</xs:sequence>
</xs:complexType>
[...]
<xs:complexType name="searchCriteriaSorting">
<xs:sequence>
<xs:element minOccurs="0" name="categoryListsSorting" type="tns:criteriaSortType"/>
<xs:element minOccurs="0" name="customLovsSorting" type="tns:criteriaSortType"/>
<xs:element minOccurs="0" name="standardLovsSorting" type="tns:criteriaSortType"/>
</xs:sequence>
</xs:complexType>
[...]
<xs:simpleType name="criteriaSortType">
<xs:restriction base="xs:string">
<xs:enumeration value="LABEL"/>
<xs:enumeration value="ORDER"/>
</xs:restriction>
</xs:simpleType>
我的问题是“searchCriteriaSorting”-参数。 我正在尝试将它传递给这样的服务方法:
$this->criteria = $service->getCriteria(array(
'lovOrders' => '1,2,12,13',
'langCode' => 'DE',
'searchCriteriaSorting' => array(
'customLovsSorting' => 'LABEL'
)
));
PHPs SoapClient 生成以下 SOAP-Request:
<SOAP-ENV:Body>
<ns1:getCriteria>
<ns1:langCode>DE</ns1:langCode>
<searchCriteriaSorting>
<customLovsSorting>LABEL</customLovsSorting>
</searchCriteriaSorting>
<ns1:lovOrders>1,2,12,13</ns1:lovOrders>
</ns1:getCriteria>
</SOAP-ENV:Body>
如你所见,"langCode"和"lovOrders"参数是带有命名空间前缀生成的,而" searchCriteriaSorting" 参数生成没有它。但是没有命名空间前缀,Soap-API 不会处理参数。
我想不通,为什么没有为复杂类型参数生成命名空间前缀。
我也尝试了不同的方法:
- 数组到对象的转换
- stdClass 结构和 SoapVars 的使用
- 自动生成 wsdl2php-classgeneration 并使用“classmap”参数
但是,我无法让其中任何一个正常工作。
任何人都可以在这里帮助我或至少将我推向正确的方向吗?
提前致谢!
【问题讨论】:
-
你解决了这个问题吗?我也有同样的问题。我尝试了整个互联网。似乎很少有人使用 SOAP 和 PHP。
-
嗨@KasunRajapaksha。事实上,我确实解决了这个问题。我现在无法访问代码,但我很快就会在这里发布一个工作示例。
-
嗨@Turbulenz。欣赏。请尽可能输入代码。
标签: php soap multidimensional-array namespaces complextype