[WebService SOAP] Conserver le type de retour

a marqué ce sujet comme résolu.

Bonjour,

Dans le cadre d’un projet, je dois créer un webservice qui prend en argument un identifiant et me retourne l’utilisateur correspondant dans un fichier CSV ou la liste de tous les utilisateurs si aucun identifiant est passé. Ma fonction retourne un ArrayObject d’objet de type User. Je parcours ensuite le retour via un iterator sur mon ArrayObject.

J’ai réussi à développer la fonctionnalité et je tente de la passer en webservice via SOAP. En appelant la fonction directement, aucun problème cela fonctionne comme voulu. En appellant la fonction via un webservice SOAP, j’ai un soucis de conversion de type, tous mes retours sont convertis en StdClass.

Je pourrais bien entendu réaliser la conversion du StdClass vers mes propres objets mais je trouve la solution sale et réaliser la transformation User ->StdClass -> User est dommage.

Voici un exemple de type de retour suite à l’appel SOAP :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
object(stdClass)[4]
  public 'BOGUS' =>
    array (size=5)
      0 =>
        object(stdClass)[5]
          public '_id' => string '1' (length=1)
          public '_name' => string 'Bland' (length=5)
          public '_surname' => string ' Angie' (length=6)
          public '_phone' => string '0611111111' (length=10)
      1 =>
        object(stdClass)[6]
          public '_id' => string '2' (length=1)
          public '_name' => string 'Dole�alov� ' (length=11)
          public '_surname' => string ' Michaela' (length=9)
          public '_phone' => string '0622222222' (length=10)
      2 =>
        object(stdClass)[7]
          public '_id' => string '3' (length=1)
          public '_name' => string 'Williams  ' (length=10)
          public '_surname' => string ' Sherri ' (length=8)
          public '_phone' => string '0633333333' (length=10)
      3 =>
        object(stdClass)[8]
          public '_id' => string '4' (length=1)
          public '_name' => string 'Koutoux�dou' (length=11)
          public '_surname' => string ' Nikol�tta ' (length=11)
          public '_phone' => string '0644444444' (length=10)
      4 =>
        object(stdClass)[9]
          public '_id' => string '6' (length=1)
          public '_name' => string 'Vandesteene ' (length=12)
          public '_surname' => string ' Els' (length=4)
          public '_phone' => string '0655555555' (length=10)

Je joins également le code du webservice :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php
class Server
{  
    protected $_path;

    //TODO : à modifier pour faire appel à un service de gestion de paramétrage
    public function __construct()
    {
        $this->_path = 'usersList.csv';
    }

    public function extractUser($id = 0)
    {
        $user = null;
        $usersList = new ArrayObject();

        //erreur 404 à déclencher
        try {
            $csv = new SplFileObject($this->_path);
        } catch(RuntimeException $e) {
            throw new SoapFault('fileNotFound', 'Le fichier d\'entrée est introuvable');
        }
        $csv->setFlags(SplFileObject::READ_CSV);
        $csv->setCsvControl(';', '"', '"');

        if($id > 0)
        {
            foreach($csv as $line)
            {
                if($line[0] == $id)
                {
                    $user = new User($line[0], $line[1], $line[2], $line[3]);
                    $usersList->append($user);
                    return $usersList;
                }
            }
            throw new SoapFault('userNotFound', 'Aucun adhérent ne correspond à votre demande');
        }
        else
        {
            foreach($csv as $line)
            {
                $user = new User($line[0], $line[1], $line[2], $line[3]);
                $usersList->append($user);
            }
            if($usersList->count() > 0)
                return $usersList;
            else
                throw new SoapFault('emptyFile', 'Aucun adhérent n\'est présent');
        }
    }
}

`

En l’appelant de cette manière cela fonctionne parfaitement :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
//TODO : à sécuriser
if(isset($_GET['id']))
{
    $id = intval($_GET['id']);
    try {
        $usersList = $soapServer->extractUser($id);
    } catch(SoapFault $e) {
        echo $e->getMessage();
        exit();
    }
    $usersList->offsetGet(0)->printer();
}
else
{
    try {
        $usersList = $soapServer->extractUser();
    } catch(SoapFault $e) {
        echo $e->getMessage();
        exit();
    }
    //parcourir usersList
    $iterator = $usersList->getIterator();

// Simple while loop
    echo 'Nombre d\'utilisateurs : ' . $usersList->count() . '<br />';
    while ($iterator->valid())
    {
    echo $iterator->current()->printer() . "<br />";
        $iterator->next();
    }
}

En l’appelant via un webservice SOAP (pas déclaré de WSDL pour le moment par soucis de rapidité et de simplicité de développement), cela réalise la conversion de tous mes objet en StdClass :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
$options = array('location' => 'http://localhost/test/server.php',
                  'uri' => 'http://localhost/test/',
                                    'encoding'=>'ISO-8859-1');
//create an instante of the SOAPClient (the API will be available)
$api = new SoapClient(NULL, $options);

//TODO : à sécuriser
if(isset($_GET['id']))
{
    $id = intval($_GET['id']);
    try {
        //$usersList = $soapServer->extractUser($id);
        $usersList = $api->extractUser($id);
    } catch(SoapFault $e) {
        echo $e->getMessage();
        exit();
    }
    $usersList->offsetGet(0)->printer();
}
else
{
    try {
        //$usersList = $soapServer->extractUser();
        $usersList = $api->extractUser();
    } catch(SoapFault $e) {
        echo $e->getMessage();
        exit();
    }

    var_dump($usersList);

Si quelqu’un a une idée pour conserver le type de retour en sortie d’un webservice, je suis preneur.

Merci d’avance de votre aide,

+0 -0

Bonjour, malheureusement je n’apporte pas de solution car j’ai exactement le même problème. J’ai passé plusieurs heures de recherches sur la documentation en vain. Je dois récupérer des entités qui sont converties en stdClass. Le seul remède simple que j’ai trouvé pour le moment est de passer par get_object_vars pour récupérer le contenu, mais effectivement c’est sale. Je vais continuer à chercher, mais si jamais tu trouves avant moi, je suis preneur. Merci

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte