IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Discussion :

consommer un Array d'un Serveur Web SOAP-PHP


Sujet :

Services Web

  1. #1
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 24
    Par défaut consommer un Array d'un Serveur Web SOAP-PHP
    bonjour à tous,

    après des heures de recherches je craque et j'ose vous importuner avec mon exemple ...

    J'ai un serveur SOAP-wsdl en PHP et un client C#.
    Le soucis c'est que le serveur doit renvoyer un Array mais que du côté C# c'est reconnu en type object[] en valeur nulle.

    Voici les sources:

    Le serveur PHP Soap-wsdl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    <?php
    require_once("./nusoap-0.7.3/lib/nusoap.php");
    $namespace = "http://localhost/SOAP/";
     
    // create a new soap server
    $server = new soap_server();
    // configure our WSDL
    $server->configureWSDL("SimpleService");
    // set our namespace
    $server->wsdl->schemaTargetNamespace = $namespace;
     
     
    //===================================[ ResistorTest method ]=============================================================
    /**
     * ResistorTest method
     * @param string : numprojet + numligne +  n° de circuit +  resistance
     * @return array : numprojet + numligne +  n° du prochain circuit +  validation test (Continue / Error / Ok)
     */
    function ResistorTest($projet, $ligne, $circuit, $resistance) {
     
    	// Valeur maxi de tores (circuits) trouvée dans mysql selon l'affaire et ligne:
    	$numcircuitmax=6;
     
    	// Formate le paramètre $circuit en $numcircuit pour rentrer dans les cas prévus (switch ci-dessous):
    	if ($circuit=='None' || $circuit=='') { // Si circuit pas renseigné, renvoie 0 pour sélectionner le 0+1 = 1er circuit à tester
     
    		$numcircuit='0';
     
    	} else {	// Si circuit bien renseigné
     
    				$numcircuit=intval(substr($circuit,-1,1)); // repère le numéro du circuit (dernier caractère du param. $circuit)
     
    				if ( !is_numeric($numcircuit) ) { $numcircuit='Error'; } // Si le numéro du circuit n'est pas bien indiqué (et que ce n'est pas None)
     
    					else { // Si circuit bien renseigné et dernier caractère numérique
     
    							if ($numcircuit==$numcircuitmax){ $numcircuit='Ok'; } // Si Dernier Circuit à tester on renvoie 'Ok' qui signale l'aboutissement des tests.
    						}
    			}
     
    	// Retours de la fonction selon les numcircuits appelés
    	switch ($numcircuit) {
     
    		case "Error":
    			$atester= array('numprojet'=>$projet,'ligne'=>$ligne,'circuit'=>'none','testresult'=>'Error');
    			//$atester='none';
    			//$atester=serialize($atester);
    			return $atester;
    		break;
     
    		case "Ok":
    			$atester= array('numprojet'=>$projet,'ligne'=>$ligne,'circuit'=>'none','testresult'=>'Ok');
    			//$atester='none';
    			//$atester=serialize($atester);
    			return $atester;
    		break;
     
     
    		default:
    			$prochaincircuit=intval($numcircuit)+1;
    			//$atester=$projet."**".$ligne."**".'select'.$prochaincircuit."**".$prochaincircuit;
    			$atester= array('numprojet'=>$projet,'ligne'=>$ligne,'circuit'=>'select'.$prochaincircuit,'testresult'=>'Continue');
    			//$atester=serialize($atester);
    			return $atester;
    		break;
    	}
     
    }
     
    // register ResistorTest
    $server->register(  
                   // method name:
                    'ResistorTest', 		 
                    // parameter list:
                    array('projet'=>'xsd:string','ligne'=>'xsd:string','circuit'=>'xsd:string','resistance'=>'xsd:float'), 
                    // return value(s):
                    array('return'=>'SOAP-ENC:Array'),
    				//array('return'=>'xsd:string'),
                    // namespace:
                    $namespace,
                    // soapaction: (use default)
                    false,
                    // style: rpc or document
                    'rpc',
                    // use: encoded or literal
                    'encoded',
                    // description: documentation for the method
                    '');				
     
     
     
    // Get our posted data if the service is being consumed
    // otherwise leave this data blank.                
    $POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA']) 
                    ? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
     
    // pass our posted data (or nothing) to the soap service                    
    $server->service($POST_DATA);                
    exit();
    ?>
    Pour information, si j'essaie avec
    array('return'=>'xsd:Array'),
    du côté C# je n'ai qu'un simple String ne contenant que la valeur de ma première colonne de ma table retour.


    Et le client C# (j'ai mis le programme dans une petite Form pour faire joli):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
     
    namespace TestDuWebServicePHP
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
     
                Services.SimpleService svc = new Services.SimpleService();
     
                object[] s = svc.ResistorTest(textBox1.Text, textBox2.Text, "tore1", 2);
     
                string sortie = s[2].ToString();
     
                label2.Text = sortie ;
     
            }
        }
    }
    En mode débeugage j'observe que l'objet "s" est vide, du coup le programme plante à la ligne
    string sortie = s[2].ToString();
    ...

    Avec un client PHP je récupère pourtant bien un Array que je peux afficher avec son contenu ..?!

    Qu'est-ce qui coince avec le C# ? Comment récupérer proprement un tableau issu d'un serveur SOAP-wsdl PHP ?

    Merci pour vos tuyaux car mes recherches googlesques n'ont vraiment rien donné

  2. #2
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 24
    Par défaut
    J'ai trouvé une solution : passer par les "complextype" !
    En fait on défini un type particulier de variable au serveur wsdl en créant alors un tableau comprenant comme valeurs les titres des colonnes de notre tableau final ...(voir les bouts de codes je pense c'est plus clair).



    Voici le bout de code à rajouter / modifier sur le serveur PHP dans mon serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    $server->wsdl->addComplexType(
    	'TypeRetour',
    	'complexType',
    	'struct',
    	'all',
    	'',
    	array(
    			'numprojet' => array('name' => 'numprojet', 'type' => 'xsd:string'),
    			'ligne' => array('name' => 'ligne', 'type' => 'xsd:string'),
    			'circuit' => array('name' => 'circuit', 'type' => 'xsd:string'),
    			'testresultcircuit' => array('name' => 'testresultcircuit', 'type' => 'xsd:string')
    		)
     
    );
    // register ResistorTest
    $server->register(
                    // method name:
                    'ResistorTest', 		 
                    // parameter list:
                    array('projet'=>'xsd:string','ligne'=>'xsd:string','circuit'=>'xsd:string','resistance'=>'xsd:float'), 
                    // return value(s):
                    //array('return'=>'SOAP-ENC:Array'),
    				array('return'=>'tns:TypeRetour'),
    Du coup côté client C# on récupère ainsi les valeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string proj = svc.ResistorTest(textBox1.Text, textBox2.Text, "tore1", 2).numprojet;
                string ligne = svc.ResistorTest(textBox1.Text, textBox2.Text, "tore1", 2).ligne ;
                string circuit = svc.ResistorTest(textBox1.Text, textBox2.Text, "tore1", 2).circuit;
                string testresultcircuit = svc.ResistorTest(textBox1.Text, textBox2.Text, "tore1", 2).testresultcircuit;


    Pour info j'ai trouvé la réponse sur ce forum ... ... bon la problématique n'était pas la même mais les bouts de codes exposés sont très clairs, voici le lien :
    Bridou est un pro !

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Attention... dans ton code C#, tu appelles 4 fois le service avec les mêmes paramètres ! C'est très inefficace, il vaudrait mieux appeler le service une seule fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TypeRetour resultat = svc.ResistorTest(textBox1.Text, textBox2.Text, "tore1", 2);
    string proj = resultat.numprojet;
    string ligne = resultat.ligne ;
    string circuit = resultat.circuit;
    string testresultcircuit = resultat.testresultcircuit;

  4. #4
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 24
    Par défaut
    oui merci tu as tout à fait raison ... je m'en suis rendu compte après en voulant exploiter mes variables retour
    Pour l'instant je m'en fou je suis en local sur le poste et pré-test mais après ^^.

    Donc c'est ok pour ces Array du PHP qui sont finalement pas bien interprétées en C# à typer soi-même en complextype.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Serveur WEB Apache/php sous windows
    Par timousse dans le forum Apache
    Réponses: 1
    Dernier message: 18/12/2014, 23h14
  2. Consommer un service web SOAP avec javascript
    Par iliass001 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/04/2013, 16h02
  3. Probléme: un client java qui consomme une array avec soap
    Par mejdi331 dans le forum Services Web
    Réponses: 1
    Dernier message: 28/01/2009, 16h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo