PHP повторял элементы в вызове soap


У меня проблема с вызовом soap, который я пытаюсь выполнить с PHP.

Сначала некоторая справочная информация: Звонок поступает в систему, которая выполняет поиск людей в большой CRM-системе. Для этого требуется такая информация, как имя, город, дата рождения и т.д.) В случае успеха он должен вернуть один или несколько идентификаторов. Интерфейс soap является стандартной частью системы, поэтому я не могу влиять на компоновку вызова.

Сначала я начал с создания запроса soap в 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 он является ключом массива, только элемент add_line_twee будет находиться в массиве под названием "Поля интерфейса", так как он все время перезаписывается.

К сожалению, я не могу выясните, как сделать это по-другому, чтобы я не мог сделать запрос таким, как в примере, который я создал из SoapUI.

Есть идеи?

Author: Erikl, 2010-09-29

3 answers

Не могли бы вы использовать неассоциативный массив? Т.е.

'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' => ' ' ),
)
 6
Author: lonesomeday, 2010-09-29 14:38:29

Вы смотрели на SoapParam- и SoapVar-объекты?

 0
Author: PatrikAkerstrand, 2010-09-29 14:43:29

Спасибо, Патрик, я думаю, ты указываешь мне правильный путь, теперь я изменил код на:

$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'),
        )
    ));

Но я думаю, что где-то упускаю суть, потому что теперь я получаю сообщение об ошибке, что свойство "имя" отсутствует в вызове.

Неустранимая ошибка: Неперехваченный сбой мыла исключение: [Отправитель] SOAP-ОШИБКА: Кодировка: объект не имеет "Имени" свойство

Я также получаю такую же ошибку, когда меняю только первую строку вызова на

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

Итак очевидно, я что-то упускаю. К сожалению, документация для SoapParam не очень обширна, поэтому я не совсем уверен, что я здесь делаю неправильно.

 0
Author: Erikl, 2010-09-30 07:19:47