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 :

[VB.NET][WebServices]Retour d'un type complexe


Sujet :

Services Web

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 41
    Par défaut [VB.NET][WebServices]Retour d'un type complexe
    Bonjour,
    Je suis en train de développer un service web dont l'une des méthodes doit me retourner une collections de (clé - valeur). J'ai opté pour un objet NameValueCollection.

    Le problème est que cet object NameValueCollection refuse d'être utilisé en tant que retour d'une methode web pour un problème de sérialisation. Bref, peu importe, je décide alors de créer ma propre classe sérialisable (qui implément IXmlSerialisaable), la voici :

    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
     
    <Serializable> _
    public class Criteres_liste 
        Implements IXmlSerializable
     
        private properties as NameValueCollection
     
        public sub New()
     
        End sub
     
        public sub new(properties as NameValueCollection)
            Me.properties = properties
        End sub
     
        <XmlIgnore> _
        Public Property Prop As NameValueCollection
            Get
                Return Me.properties
            End Get
            Set(ByVal Value As NameValueCollection)
                Me.properties = Value
            End Set
        End Property
     
        Function GetSchema() as System.Xml.Schema.XmlSchema Implements IXmlSerializable.GetSchema
            return nothing
        End Function
     
        sub ReadXml(reader as XmlReader) Implements IXmlSerializable.ReadXml 
            Me.properties = new NameValueCollection()
            While (reader.MoveToNextAttribute())
                Me.properties.Add(reader.Name, reader.Value)
            end while
            reader.Read()  
        end sub
     
        sub WriteXml(writer as XmlWriter) Implements IXmlSerializable.WriteXml
            for each key as string in Me.properties.Keys
                writer.WriteStartElement("crit")
                dim value as string = Me.properties(key)
                writer.WriteAttributeString("id", key)
                writer.WriteValue(value)
                writer.WriteEndElement()
            next
        end sub
     
    End class
    Comme vous l'avez compris, j'encapsule dans une classe sérialisable une NameValueCollection ce qui me permet de contrôler la façon dont-il sera sérialisé. Ici je souhaite que mon NameValueCollection soit sérialisé ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <Criteres_liste>
       <crit id="1">test1</crit>
       <crit id="2">test2</crit>
       <crit id="3">test3</crit>
    </Criteres_liste>
    Maintenant, ma méthode web retourne un objet Criteres_liste et lorsque je teste mon webservice en executant directement le fichier .asmx, je reçois bien le code XML ci-dessus dans mon navigateur.

    En utilisant WebServiceStudio afin de tracer les échanges SOAP d'un web service, je reçois bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?xml version="1.0" encoding="utf-16"?>
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <soap:Body>
        <ListeEquivalenceResponse xmlns="http://www.toto.fr/">
          <ListeEquivalenceResult>
            <crit id="1">test1</crit>
            <crit id="2">test2</crit>
            <crit id="3">test3</crit>
          </ListeEquivalenceResult>
        </ListeEquivalenceResponse>
      </soap:Body>
    </soap:Envelope>
    Tout ceci me plait bien. Je décide donc de m'attaquer au client. Pour celà j'utilise l'exe WDSL.EXE. Celui-ci me génère une classe proxy que je compile en DLL.

    Je l'instancie, j'appelle ma méthode web et là, Ô surprise, le retour de la méthode en question qu'il attend est en fait un DataSet ...
    Et effectivement, lorsque je regarde dans le code généré par le WSDL.EXE je constate bien que le retour de ma métode web est un DataSet.

    Soit, si je caste le résultat en DataSet celui est vide. Je n'arrive pas a récupérer mes résultat (alors qu'il y a bien qque chose dans la réponse).

    Je voudrais savoir si il y a un moyen de faire en sorte que WSDL.EXE génère le bon code (mais en réfléchissant, ce dernier n'a aucune connaissance de ma classe liste_critère) ou bien y a t-il qque chose à faire pour que le dataset de sortie soit bien rempli?

    Un autre moyen plus compliqué serait de passer par un HttpWebRequest est de décortiquer le SOAP à la main afin de récupérer la portion de XML qui m'intéresse. Mais on perd la souplesse offerte par WSDL.EXE

    Ceci me fait me poser les questions suivantes :
    -WDSL.exe ne fonctionne t-il qu'avec des types simples?
    -Si je fais un web service qui me retourne un DataSet, mon client .net arrive bien a le récupérer (car le dataset est un type ".net"), mais qu'en sera t-il pour un client écrit en PhP ou en ColdFusion? Pour une désérialisation adéquat ne faut-il pas que le client ait connaissant de la classe cible? Or en Php ou coldFusion le dataset n'existe pas.

    J'espère avoir été assez clair et pas trop long ^^

    Merci de m'éclairer sur ces points

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Par défaut
    Bonjour,

    J'ai a peut près le même soucis que vous.
    En effet, j'ai crée un webservice en PHP qui me renvoit un type complexe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <wsdl:types>
    		<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:CSP">
    			<complexType name="MyResults">
    				<attribute name="date" type="string"/>
    			</complexType>
    		</schema>
    	</wsdl:types>
    et un client en Visual C++ en utilisant l'import de fichier WSDL..

    Et bien, j'ai l'impression qu'il n'aime pas trop les retours de type complexe...

    As-tu résolu ton probleme ? Si oui, comment ?

  3. #3
    Membre confirmé Avatar de flagadda
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    Par défaut
    Pour faire retourner des structures un peu complexe à mes WebService, je leur fais renvoyer un string au format XML dont la structure respecte un schéma XSD que je réalise en fonction de mes besoins.
    C'est pratique et assez simple à mettre en place.

    Apres, il suffit de diffuser le XSD à tout ce qui veulent utiliser vos WebServices.

  4. #4
    Membre averti
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2005
    Messages : 15
    Par défaut
    J'ai le même problème pour le retour d'un web service, côté client. J'ai une liste d'objet, et avec .net, je n'arrive qu'à récupérer au mieux que le premier élément de cette liste, en modifiant le code généré par wsdl.exe ....

    Je n'ai pas tellement envie de récuperer le flux xml et de me taper le parsing, j'ai 3 webservices différents à utiliser, avec plein de méthodes, ce serait long à faire.

    Qqun a trouvé un solution pour améliorer .Net ?

    Merci

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Par défaut
    Problème en effet résolu, je fais comme "flagada", je ne renvoie que des chaînes de caractères...et avec ça, j'arrive à tout faire..

    En effet, il me suffit de renvoyer un flux XML en chaîne de retour de le "parser" ensuite...

    Exemple :

    Imaginons un WebServices qui doit me renvoyer le nom, le prenom, et la date de naissance d'un individu.
    Je retourne dans mon WebService la chaine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "<?xml version="1.0" encoding="utf-8"?><array><prenom>Jean-Pierre</prenom><nom>PAPIN</nom><datenaiss>07-12-1971</datenaiss></array>"
    Un fois la chaîne récupéré, il ne me reste plus qu'a utiliser un mini-parser pour récréer mon objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class personne
    {
        private :
           String ^ Nom;
           String ^ Prenom;
           String ^ Naissance;
     
     public :
        personne(void);
    }
    Voilà, c'est pas plus compliqué que çà...

  6. #6
    Membre confirmé Avatar de flagadda
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    Par défaut
    Si tu créais un schema XSD de ton XML, en .Net, tu peux instancier ce XSD, et du coup, VisualStudio te fournit un parser et un objet correspondant à ton XML.

Discussions similaires

  1. WebService et retour d'un Object "complexe"
    Par hadler dans le forum Services Web
    Réponses: 1
    Dernier message: 03/04/2010, 12h28
  2. Réponses: 0
    Dernier message: 05/11/2009, 08h56
  3. Réponses: 5
    Dernier message: 17/01/2008, 13h18
  4. Webservice avec AXIS , Eclipse et retour de type complexe
    Par Ashen-Shugar dans le forum Services Web
    Réponses: 2
    Dernier message: 26/12/2007, 21h24
  5. [TomCat/Axis] Webservices et types complexes
    Par NoiBe dans le forum Services Web
    Réponses: 4
    Dernier message: 25/01/2007, 16h22

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