2016-12-10 1 views
0

J'essaye d'obtenir un type complexe d'un serveur php avec une opération pour obtenir un tableau d'animaux (type complexe défini dans le wsdl), ce tableau est défini comme ConjuntAnimals comme un tableau d'objets animaux.L'appel PHP nusoap retourne bool false au lieu du tableau complexType

Mais quand je fais le $result = $client->call('consulta_gossos', $params); je reçois un bool (faux). J'ai débogué et connecté depuis longtemps, et j'ai vu que dans l'opération de savon, juste avant de revenir, sa valeur est un tableau d'animaux (ce qu'il devrait retourner), mais dans le client je ne reçois pas ceci est retourné.

Après avoir réalisé, je pense que peut-être ce sont les définitions complexType que j'ai tort, mais je l'ai comparé avec beaucoup d'exemples et ne devrait pas être ça ...

En outre, (peut-être aide) Je reçois cette erreur connecté:

[10-Dec-2016 12:59:11 America/New_York] PHP Catchable fatal error: Object of class stdClass could not be converted to string in /home/cabox/workspace/lib/nusoap.php on line 6132 [10-Dec-2016 12:59:11 America/New_York] Response not of type text/xml: text/html

Je comprends qu'il attend une réponse xml, donc je l'ai essayé de revenir json_encode($gossos) au lieu de simplement $gossos, mais il enregistre ceci: [10-Dec-2016 13:11:34 America/New_York] XML error parsing SOAP payload on line 2: Invalid document end

Ici ajouter le client et le code serveur:

client:

<?php 

    require_once('./lib/nusoap.php'); 

    $wsdl='http://php-ad-msk1416368101.codeanyapp.com/soapserver.php?wsdl'; 
    ini_set("log_errors", 1); 
    ini_set("error_log", "/tmp/php-error.log"); 

    $client = new nusoap_client($wsdl,'wsdl'); 
    $client->encode_utf8 = false; 
    $client->decode_utf8 = false;   
    $client->soap_defencoding = 'utf-8'; 

    $err = $client->getError(); 
    if ($err) { 
     echo "Constructor error" . $err; 
     exit(); 
    } 

    $edat = $_GET['edat']; 
    $raca = $_GET['raca']; 
    $vacunat = $_GET['vacunes']; 

    echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>'; 
    echo '<h2>Response</h2>'; 
    echo '<pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>'; 

    $result = $client->call('consulta_gossos', array('edat' => $edat, 'raca' => $raca, 'vacunat' => $vacunat)); 

    $err = $client->getError(); 
    error_log($err); 
    error_log(json_encode($result)); 

    echo 'Type: '.gettype($result).', size: '.sizeOf($result); 

?> 

`

<?php 
    require_once('./lib/nusoap.php'); 

    ini_set("log_errors", 1); 
    ini_set("error_log", "/tmp/php-error.log"); 
    error_log("Hello, errors!"); 


    $server = new nusoap_server; 
    $server->soap_defencoding = 'utf-8'; 
    $server->encode_utf8 = false; 
    $server->decode_utf8 = false; 
    $server->configureWSDL('server','urn:server'); 

    $server->wsdl->schemaTargetNamespace = 'urn:server'; 
    $server->wsdl->addComplexType('Animal', 
                  'complexType', 
                  'struct', 
                  'all', 
                  '', 
                  array(
                    'xip' => array('name' => 'xip', 'type' => 'xsd:int'), 
                    'nom' => array('name' => 'nom', 'type' => 'xsd:string'), 
                    'edat' => array('name' => 'edat', 'type' => 'xsd:int'), 
                    'vacunat' => array('name' => 'vacunat', 'type' => 'xsd:string'), 
                    'menjar' => array('name' => 'menjar', 'type' => 'xsd:string'), 
                    'data_entrada' => array('name' => 'data_entrada', 'type' => 'xsd:string'), 
                     ) 
                    ); 

    $server->wsdl->addComplexType('ConjuntAnimals', 
    'complexType', 
    'array', 
    '', 
    'SOAP-ENC:Array', 
    array(), 
    array(
      array('ref'=>'SOAP-ENC:arrayType', 
        'wsdl:arrayType'=>'tns:Animal[]') 
    ), 
    'tns:Animal' 
    ); 
    $server->register('consulta_gossos', 
        array('edat' => 'xsd:string', 
           'raca' => 'xsd:string', 
           'vacunat' => 'xsd:string'), 
        array('return' => 'tns:ConjuntAnimals'), //output 
        'urn:server',        //namespace 
        'urn:server#consulta_gossos',    //SOAP action 
        'rpc', 
        'encoded', 
        'Consultar els gossos que compleixen el filtre');//description 

    function consulta_gossos($edat, $raca, $vacunat) { 
     $servername = 'localhost'; 
     $username = 'root'; 
     $password = 'root'; 
     $dbname = 'bd_refugi'; 

     $vacunes = ($vacunat =='si') ? 1 : 0; 
     $sql_edat = ($edat == 'gran') ? ' edat > 5 ' : ' edat <= 5 '; 

     $connection = new mysqli($servername, $username, $password, $dbname); 
     $sql = 'select * from gossos where '.$sql_edat.' and raca="'.$raca.'" and vacunat='.$vacunes; 
     $res = $connection->query($sql); 

     $gossos = array(); 
     while ($row=$res->fetch_assoc()) { 
       $gos->xip=$row['xip']; 
       $gos->nom=$row['nom']; 
       $gos->edat=$row['edat']; 
       $gos->vacunat=$row['vacunat']; 
       $gos->menjar=$row['menjar']; 
       $gos->data_entrada=$row['data_entrada']; 
       array_push($gossos,$gos); 
     } 
     error_log(json_encode($gossos)); 
     error_log('-----------------------------------------'); 
     return json_encode($gossos); 

    } 

    $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ''; 
    $server->service($HTTP_RAW_POST_DATA); 

    ?> 

`

Désolé pour le indenter, mes yeux saignent trop après la copie -past le code ici. Edit: en laissant de côté les erreurs montrées ci-dessus, la question vise à se concentrer davantage sur pourquoi retourner un tableau "correct", dans le client, je reçois un tableau vide une fois que j'ai éliminé toutes ces erreurs.

+0

Je ne peux pas vous aider avec votre erreur, car je n'ai jamais utilisé de savon ... mais sur le stdClass ... peut-être ce lien peut vous aider à expliquer ce qui cause ce problème? http://stackoverflow.com/questions/3607550/object-of-class-stdclass-could-not-be-converted-to-string –

Répondre

0

Après plusieurs heures de débogage et de test de chaque type individuellement, j'ai finalement réussi à résoudre ce problème.

Je retournais un tableau composé par ce que j'appellerais des structures (désolé je suis nouveau à PHP, je ne sais toujours pas l'argot) construit à partir de ce que je recevais de la requête mysql. La chose est qu'ils auraient dû être des tableaux, donc j'ajouter le code que j'ai changé:

Avant (ne fonctionne pas):

$res = $connection->query($sql); 

    $gossos = array(); 
    while ($row=$res->fetch_assoc()) { 
      $gos->xip=$row['xip']; 
      $gos->nom=$row['nom']; 
      $gos->edat=$row['edat']; 
      $gos->vacunat=$row['vacunat']; 
      $gos->menjar=$row['menjar']; 
      $gos->data_entrada=$row['data_entrada']; 
      array_push($gossos,$gos); 
    } 
    return json_encode($gossos); 

Après (travail):

$res = $connection->query($sql); 
    $gossos = array(); 
    while ($row=$res->fetch_assoc()) { 
     $gos = array('xip' => intval($row['xip']), 
           'nom' => $row['nom'], 
           'edat' => intval($row['edat']), 
           'vacunat' => $row['vacunat'], 
           'menjar' => $row['menjar'], 
           'data_entrada' => $row['data_entrada'], 
           'sexe' => $row['sexe'], 
           'raca' => $row['raca'] 
           ); 
     array_push($gossos,$row); 
    } 
    return $gossos; 

I aussi retournait le codage json (je ne sais vraiment pas pourquoi, je suppose pour essayer des choses ...), maintenant je peux retourner le tableau sans avoir les erreurs que j'ai eues.

Modifier: Oh! Et commente la ligne 6132 dans nusoap.php, sans le faire, aurait toujours des erreurs!