肥皂呼叫中PHP重复元素

问题描述:

我正在尝试从PHP执行肥皂呼叫的问题。肥皂呼叫中PHP重复元素

首先提供一些背景信息:呼叫转到在大型CRM系统上进行人员搜索的系统。它需要诸如姓名,城市,出生日期等信息。)成功时,它应该返回一个或多个ID。肥皂接口是系统的标准部分,所以我不能影响呼叫的布局。

我首先通过在SoapUI中构建肥皂请求开始工作,以查看是否可以使其工作。我结束了这个SOAP请求,这是工作:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:hidl="http://humaninference.com/hidl-mapped"> 
    <soap:Header/> 
    <soap:Body> 
     <hidl:HI__DQComponents__Identify__Searching__Search> 
     <hidl:model>MAGMA::PERSON</hidl:model> 
     <hidl:execution>Match</hidl:execution> 
     <hidl:interfaceFields> 
      <hidl:item> 
       <hidl:Name>master_id</hidl:Name> 
       <hidl:Value>0</hidl:Value> 
      </hidl:item> 
      <hidl:item> 
       <hidl:Name>Name</hidl:Name> 
       <hidl:Value>jansen</hidl:Value> 
      </hidl:item> 
      <hidl:item> 
       <hidl:Name>birthdate</hidl:Name> 
       <hidl:Value></hidl:Value> 
      </hidl:item> 
      <hidl:item> 
       <hidl:Name>add_id</hidl:Name> 
       <hidl:Value></hidl:Value> 
      </hidl:item> 
      <hidl:item> 
       <hidl:Name>street</hidl:Name> 
       <hidl:Value>oudegracht</hidl:Value> 
      </hidl:item> 
      <hidl:item> 
       <hidl:Name>dumstreet</hidl:Name> 
       <hidl:Value></hidl:Value> 
      </hidl:item> 
      <hidl:item> 
       <hidl:Name>housenumber</hidl:Name> 
       <hidl:Value></hidl:Value> 
      </hidl:item> 
      <hidl:item> 
       <hidl:Name>postcode</hidl:Name> 
       <hidl:Value></hidl:Value> 
      </hidl:item> 
     <hidl:item> 
       <hidl:Name>city</hidl:Name> 
       <hidl:Value>Utrecht</hidl:Value> 
      </hidl:item> 
     <hidl:item> 
       <hidl:Name>citydum</hidl:Name> 
       <hidl:Value></hidl:Value> 
      </hidl:item> 
     <hidl:item> 
       <hidl:Name>add_line_twee</hidl:Name> 
       <hidl:Value></hidl:Value> 
      </hidl:item> 
     </hidl:interfaceFields> 
     </hidl:HI__DQComponents__Identify__Searching__Search> 
    </soap:Body> 
</soap:Envelope> 

下一步是建立从PHP相同的请求,为我写了这段代码:

$result = $client->HI__DQComponents__Identify__Searching__Search(array(
    'model' => 'MAGMA::PERSON', 
    'execution' => 'Search', 
    'interfaceFields' => array (
     'item' => array ('Name' => 'master_id',  'Value' => '0'), 
     'item' => array ('Name' => 'Name',   'Value' => 'jansen'), 
     'item' => array ('Name' => 'birthdate',  'Value' => ' '), 
     'item' => array ('Name' => 'add_id',  'Value' => ' '), 
     'item' => array ('Name' => 'street',  'Value' => 'Oudegracht'), 
     'item' => array ('Name' => 'dumstreet',  'Value' => ' '), 
     'item' => array ('Name' => 'housenumber', 'Value' => ' '), 
     'item' => array ('Name' => 'postcode',  'Value' => ' '), 
     'item' => array ('Name' => 'city',   'Value' => 'utrecht'), 
     'item' => array ('Name' => 'citydum',  'Value' => ' '), 
     'item' => array ('Name' => 'add_line_twee', 'Value' => ' '), 
     ) 
    )); 

echo '<PRE>'; 
print_r($result); 
echo '</PRE>'; 

然而,这种失败。这个问题非常明显,因为“item”元素重复了好几次,在PHP中它是数组的关键,只有Item add_line_twee将被放在名为“interfaceFields”的数组中,因为它总是被覆盖。

不幸的是我不知道如何以另一种方式做到这一点,所以我无法得到像我从SoapUI创建的示例中的请求。

任何想法?

你不能使用非关联数组吗?即

'interfaceFields' => array (
    array ('Name' => 'master_id',  'Value' => '0'), 
    array ('Name' => 'Name',   'Value' => 'jansen'), 
    array ('Name' => 'birthdate',  'Value' => ' '), 
    array ('Name' => 'add_id',  'Value' => ' '), 
    array ('Name' => 'street',  'Value' => 'Oudegracht'), 
    array ('Name' => 'dumstreet',  'Value' => ' '), 
    array ('Name' => 'housenumber', 'Value' => ' '), 
    array ('Name' => 'postcode',  'Value' => ' '), 
    array ('Name' => 'city',   'Value' => 'utrecht'), 
    array ('Name' => 'citydum',  'Value' => ' '), 
    array ('Name' => 'add_line_twee', 'Value' => ' '), 
) 
+0

令人惊讶的是,这工作!我认为这不会是因为我认为名为“Item”的元素是强制性的,但显然不是。谢谢! – Erikl 2010-09-30 07:55:03

有你看了SoapParam - 和SoapVar -objects?

感谢帕特里克,我觉得你指着我的方法不对,我现在改代码:

$result = $client->HI__DQComponents__Identify__Searching__Search(
array(
    'model' => 'MAGMA::PERSON', 
    'execution' => 'Search', 
    'interfaceFields' => array (
     new SoapParam(array('Name' => 'master_id',  'Value' => '0')   ,'item'), 
     new SoapParam(array('Name' => 'Name',   'Value' => 'jansen') ,'item'), 
     new SoapParam(array('Name' => 'birthdate',  'Value' => ' ')   ,'item'), 
     new SoapParam(array('Name' => 'add_id',  'Value' => ' ')   ,'item'), 
     new SoapParam(array('Name' => 'street',  'Value' => 'oudegracht'),'item'), 
     new SoapParam(array('Name' => 'dumstreet',  'Value' => ' ')   ,'item'), 
     new SoapParam(array('Name' => 'housenumber', 'Value' => ' ')   ,'item'), 
     new SoapParam(array('Name' => 'postcode',  'Value' => ' ')   ,'item'), 
     new SoapParam(array('Name' => 'city',   'Value' => 'Utrecht') ,'item'), 
     new SoapParam(array('Name' => 'citydum',  'Value' => ' ')   ,'item'), 
     new SoapParam(array('Name' => 'add_line_twee', 'Value' => ' ')   ,'item'), 
     ) 
    )); 

但我觉得我缺少点什么地方,因为我现在得到一个错误消息“名称”属性不在通话中。

Fatal error: Uncaught SoapFault exception: [Sender] SOAP-ERROR: Encoding: object hasn't 'Name' property

我也得到了同样类型的错误时,我只是通话的第一行更改为

new SoapParam('MAGMA::PERSON','model') 

所以很明显,我失去了一些东西。不幸的是,SoapParam的文档不是很广泛,所以我不太确定我在这里做错了什么。