2010-11-19 19 views
2

A comment sur les états manuel PHP:Pourquoi l'ordre des paramètres SOAP est-il important dans PHP SOAP, et comment le réparer?

Si vous utilisez cette méthode, souvenez-vous que le tableau d'arguments doivent être passé avec l'ordre étant le même ordre que le point de terminaison SOAP attend.

par exemple // serveur attend: Foo (nom de chaîne, int age)

//won't work 
$args = array(32, 'john'); 
$out = $client->__soapCall('Foo', $args); 

//will work 
$args = array('john', 32); 
$out = $client->__soapCall('Foo', $args); 

Je construis un client SOAP qui attribue dynamiquement les valeurs des arguments, ce qui signifie qu'il arrive que les arguments ne sont pas toujours dans le bon ordre. Cela interrompt alors l'appel SOAP réel.

Y a-t-il une solution facile à cela, à moins de vérifier l'ordre des paramètres pour chaque appel?

Répondre

1

Une solution simple existe pour les paramètres nommés:

function checkParams($call, $parameters) { 
    $param_template = array(
     'Foo' => array('name', 'age'), 
     'Bar' => array('email', 'opt_out'), 
    ); 

    //If there's no template, just return the parameters as is 
    if (!array_key_exists($call, $param_template)) { 
     return $parameters; 
    } 
    //Get the Template 
    $template = $param_template[$call]; 
    //Use the parameter names as keys 
    $template = array_combine($template, range(1, count($template))); 
    //Use array_intersect_key to filter the elements 
    return array_intersect_key($parameters, $template); 
} 


$parameters = checkParams('Foo', array(
    'age' => 32, 
    'name' => 'john', 
    'something' => 'else' 
)); 
//$parameters is now array('name' => 'john', 'age' => 32) 
$out = $client->__soapCall('Foo', $parameters); 

commander Non seulement il ne correctement les paramètres, il filtre également les paramètres du tableau.

3

J'ai eu le même problème où j'ai ajouté dynamiquement les paramètres SOAP et je devais les obtenir dans le bon ordre pour que mon appel SOAP fonctionne.

J'ai donc dû écrire quelque chose qui obtiendrait toutes les méthodes SOAP du WSDL, puis déterminer dans quel ordre organiser les arguments de la méthode. Heureusement, PHP facilite l'accès aux fonctions SOAP en utilisant la méthode '$ client -> __ getFunctions()'. Il vous suffit donc de rechercher la méthode de service que vous voulez appeler et qui contiendra les arguments de la méthode. l'ordre correct, puis faites un tableau correspondant à obtenir votre tableau de paramètres de demande dans le même ordre.

Voici le code ...

<?php 

    // Instantiate the soap client 
    $client   = new SoapClient("http://localhost/magento/api/v2_soap?wsdl", array('trace'=>1)); 
    $wsdlFunctions = $client->__getFunctions(); 
    $wsdlFunction = ''; 
    $requestParams = NULL; 
    $serviceMethod = 'catalogProductInfo'; 
    $params   = array('product'=>'ch124-555U', 'sessionId'=>'eeb7e00da7c413ceae069485e319daf5', 'somethingElse'=>'xxx'); 

    // Search for the service method in the wsdl functions 
    foreach ($wsdlFunctions as $func) { 
     if (stripos($func, "{$serviceMethod}(") !== FALSE) { 
      $wsdlFunction = $func; 
      break; 
     } 
    } 

    // Now we need to get the order in which the params should be called 
    foreach ($params as $k=>$v) { 
     $match = strpos($wsdlFunction, "\${$k}"); 
     if ($match !== FALSE) { 
      $requestParams[$k] = $match;  
     } 
    } 

    // Sort the array so that our requestParams are in the correct order 
    if (is_array($requestParams)) { 
     asort($requestParams); 

    } else { 
     // Throw an error, the service method or param names was not found. 
     die('The requested service method or parameter names was not found on the web-service. Please check the method name and parameters.'); 
    } 

    // The $requestParams array now contains the parameter names in the correct order, we just need to add the values now. 
    foreach ($requestParams as $k=>$paramName) { 
     $requestParams[$k] = $params[$k]; 
    } 

    try { 
     $test = $client->__soapCall($serviceMethod, $requestParams);  
     print_r($test); 

    } catch (SoapFault $e) { 
     print_r('Error: ' . $e->getMessage()); 
    }