PHP SoapClient:如何将复杂类型的参数传递给web服务


PHP SoapClient: How to pass complex-type parameters to a webservice?

我在从PHP应用程序访问soap服务时遇到了传递嵌套数组参数的问题。我找到了一些关于这个问题的帖子,但没有一个能解决我的问题。所以我希望有人能在这里帮助我…

我使用PHP 5.4.22在一个例子上安装windows并试图访问Talentlink API。它的WSDL定义在这里:

https://api3.lumesse-talenthub.com/CareerPortal/SOAP/FoAdvert?WSDL

访问通常工作正常。wse - authentication工作,我可以从服务访问数据。我也可以将参数传递给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>

我的问题是"searchcriteriassorting"参数。我想把它传递给service方法,就像这样:

$this->criteria = $service->getCriteria(array(
    'lovOrders' => '1,2,12,13',
    'langCode' => 'DE',
    'searchCriteriaSorting' => array(
        'customLovsSorting' => 'LABEL'
    )
));

php 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不会处理该参数。

我不明白,为什么不为复杂的类型参数生成命名空间前缀。

我也尝试了不同的方法:

    <
  • array-to-object转换/gh>
  • stdClass结构和soapvar的使用
  • 自动生成wsdl2php-class并使用"classmap"参数

但是,我不能让这些正常工作。

有谁能帮我一下,或者至少把我推向正确的方向吗?

提前感谢!

$client = new SoapClient('https://example.gms/test01/cims/services/1.2/travel.asmx?WSDL',array('soap_version' => SOAP_1_2));
var_dump($client);
// $date=date()
$result= $client->$youre method Or Function(array('perameter1'=>"value1", 'perameter2'=>"value2"));  
print_r($result);        
print_r($client->__getFunctions());