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

标签 php soap multidimensional-array namespaces complextype

我在从 PHP 应用程序访问 SOAP 服务时无法传递嵌套数组参数。
我发现了几个关于这个问题的线程,但没有一个解决了我的问题。
所以我希望有人可以帮助我在这里...

我在 xampp 上使用 PHP 5.4.22 进行 Windows 安装并尝试访问 Talentlink API。它的 WSDL 在此处定义:

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

访问通常工作正常。 WSSE-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>

我的问题是“searchCriteriaSorting”-参数。
我试图将它传递给服务方法,如下所示:
$this->criteria = $service->getCriteria(array(
    'lovOrders' => '1,2,12,13',
    'langCode' => 'DE',
    'searchCriteriaSorting' => array(
        'customLovsSorting' => 'LABEL'
    )
));

PHPs SoapClient 生成以下 SOAP 请求:
<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>

如您所见,参数 "语言代码" "lovOrders"生成 带命名空间前缀 , 而 “搜索条件排序”参数生成没有 它。但是如果没有命名空间前缀,Soap-API 不会处理该参数。

我不知道为什么没有为复杂类型参数生成命名空间前缀。

我也尝试了不同的方法:
  • 数组到对象的转换
  • stdClass 结构和 SoapVars 的使用
  • 自动化 wsdl2php-classgeneration 并使用“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());  
    

    关于PHP SoapClient : How to pass complex-type parameters to a webservice?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23697137/

    相关文章:

    php - 使表单数据从多选表单保留在 PHP 页面上

    java - 如何判断Web服务是REST还是SOAP?

    php - 修改PHP/SOAP代码,在所有请求中添加HTTP Header

    Python:迭代具有不同维数的列表,有通用的方法吗?

    python - 如何强制 scipy.optimize.fmin_l_bfgs_b 使用 'dtype=float32'

    php - 无法使用客户端证书(未找到 key 或密码短语错误?)

    javascript - 为什么我无法在 WordPress 上编辑页面的 html?

    c++ - 函数调用后计算多维数组元素

    php - 如何使用 HTTPS 获取网站内容

    iphone - 如何将 -lxml2 添加到链接器标志?