2010-09-29 90 views
3

我正在嘗試從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創建的示例中的請求。

任何想法?

回答

6

你不能使用非關聯數組嗎?即

'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

0

感謝帕特里克,我覺得你指着我的方法不對,我現在改代碼:

$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的文檔不是很廣泛,所以我不太確定我在這裏做錯了什麼。