2010-09-29 22 views
3

J'ai un problème avec un appel de savon que j'essaye de faire de PHP. D'abord quelques informations de base: L'appel va à un système qui fait une recherche de personne sur un grand système de CRM. Il nécessite des informations telles que le nom, la ville, la date de naissance, etc.) En cas de succès, il doit renvoyer un ou plusieurs identifiants. L'interface de savon est une pièce standard du système, donc je ne peux pas influencer la disposition de l'appel.PHP a répété des éléments dans un appel de savon

J'ai d'abord commencé par construire la demande de savon dans SoapUI, pour voir si je pouvais le faire fonctionner. J'ai fini avec cette demande de savon, qui travaille:

<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> 

L'étape suivante a consisté à construire la même demande de PHP, pour que j'ai écrit ce morceau de code:

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

Cela échoue cependant . Le problème est assez évident, puisque l'élément "item" est répété plusieurs fois, et en PHP c'est la clé du tableau, seul l'item add_line_twee sera dans le tableau appelé "interfaceFields", car il est écrasé tout le temps.

Malheureusement, je n'arrive pas à comprendre comment faire autrement, donc je ne peux pas obtenir la demande d'être comme dans l'exemple que j'ai créé à partir de SoapUI.

Des idées?

Répondre

6

N'utilisez-vous pas un tableau non associatif? C'est à dire.

'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

Étonnamment, cela a fonctionné! Je pensais que ce ne serait pas parce que je pensais que les éléments nommés 'Item' seraient obligatoires, mais apparemment pas. Merci! – Erikl

0

Merci Patrik, je pense que vous me pointant dans la bonne voie, je changé le code:

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

Mais je pense que je manque le point quelque part, parce que je reçois maintenant une erreur message que la propriété "name" n'est pas dans l'appel.

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

Je reçois aussi le même genre d'erreur lorsque je change seulement la première ligne de l'appel à

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

Il est donc clair, je manque quelque chose. Malheureusement, la documentation pour le SoapParam n'est pas très complète, donc je ne suis pas sûr de ce que je fais mal ici.