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

Android Discussion :

[KSOAP] Traitement de la réponse d'un webservice


Sujet :

Android

  1. #1
    Membre averti Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Points : 312
    Points
    312
    Par défaut [KSOAP] Traitement de la réponse d'un webservice
    Bonjour,

    Je débute avec l'utilisation de la librairie KSOAP et j'ai quelques soucis dans le traitement de la réponse de mon webservice.

    Lorsque j'appelle mon WS via l'outil SoapUI, il me renvoie le XML suivant :

    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
     
    <?xml version='1.0' encoding='utf-8'?>
    <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>
            <Reponse xmlns="POSTEPDA">
                <Statut>1</Statut>
                <MessErr />
                <Lignes>
                    <Ligne>
                        <id>1</id>
    		    <libelle>Lib1</libelle>
                    </Ligne>
                    <Ligne>
                        <id>2</id>
    		    <libelle>Lib2</libelle>
                    </Ligne>
                    <Ligne>
                        <id>3</id>
    		    <libelle>Lib3</libelle>
                    </Ligne>
                </Lignes>
            </Reponse>
        </soap:Body>
    </soap:Envelope>
    Je m'attends donc à recevoir ce type de réponse en faisant appel à la méthode envelope.getResponse() de KSOAP;

    Sauf que je reçois une chaine imbuvable qui ressemble vaguement à du JSON :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Reponse{Statut=1; MessErr=anyType{}; Lignes=anyType{Ligne=anyType{id=1; libelle=Lib1; }; Ligne=anyType{id=2; libelle=Lib2; }; Ligne=anyType{id=2; libelle=Lib2; }; }; }
    Ce genre de chaines m'oblige à effectuer un parsing manuel qui me semble bien laborieux...

    N'y a t-il pas moyen de mapper directement la réponse du WebService en beans Java, ou de récupérer un "vrai" JSON qui serait :

    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
     
    {
      "Reponse": {
        "Statut": "1",
        "Lignes": {
          "Ligne": [
            {
              "id": "1",
              "libelle": "Lib1"
            },
            {
              "id": "2",
              "libelle": "Lib2"
            },
            {
              "id": "2",
              "libelle": "Lib2"
            }
          ]
        }
      }
    }
    Ou n'ai-je simplement pas bien compris l'utilisation de cette librairie ?

    Merci d'avance de votre aide
    "Wash me away Clean your body of me Erase all the memories They'll only bring us pain And I've seen All i'll ever need"

  2. #2
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Points : 1 493
    Points
    1 493
    Par défaut
    Bonjour
    Citation Envoyé par danyboy85 Voir le message
    N'y a t-il pas moyen de mapper directement la réponse du WebService en beans Java, ou de récupérer un "vrai" JSON qui serait :
    Il y a bien sûr un moyen de mapper directement la réponse et cela passe par plusieurs étapes. Tu dois savoir que, une fois tu passes de la manipulation de types primitifs à la manipulation des objets via le service web, la conception change. D'après le résultat renvoyé par ton service web, j'ai comme l'impression que tu manipules une liste d'objets. C'est ça?



    Christian Djo,
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

  3. #3
    Membre averti Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Points : 312
    Points
    312
    Par défaut
    Oui, il s'agit d'un service web dont le résultat que je dois manipuler est composé de la façon suivante :

    - Un code erreur (balise <statut>)
    - Un message correspondant (balise <MessErr>)
    - Puis une liste d'objets (balises <Lignes>)
    "Wash me away Clean your body of me Erase all the memories They'll only bring us pain And I've seen All i'll ever need"

  4. #4
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Points : 1 493
    Points
    1 493
    Par défaut
    Citation Envoyé par danyboy85 Voir le message
    - Puis une liste d'objets (balises <Lignes>)
    Dans ce cas, KSOAP préconise l'implémentation de l'interface KvmSerializable pour mapper le résultat non primitif (Objet ou liste d'objets) comme dans ton cas. Tu auras besoin d'une classe qui représente une Line et qui implémente KvmSerializable avant tout. Voici une illustration :
    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
     
    /**
     * Représente L'objet Line. L'interface KvmSerializable doit être implémentée pour gérer la serialization.
     */
    public class Line implements KvmSerializable
    {
        public long id;
        public String libelle;
     
        public Line(){}
     
     
        public Line(int _id, String _libelle) {
            id = _id;
            libelle= _libelle;
        }
     
     
        public Object getProperty(int arg0) {
     
            switch(arg0)
            {
            case 0:
                return id;
            case 1:
                return libelle;
            }
     
            return null;
        }
     
        public int getPropertyCount() {
            return 2;
        }
     
        public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info) {
            switch(index)
            {
            case 0:
                info.type = PropertyInfo.INTEGER_CLASS;
                info.name = "id";
                break;
            case 1:
                info.type = PropertyInfo.STRING_CLASS;
                info.name = "libelle";
                break;
            default:break;
            }
        }
     
        public void setProperty(int index, Object value) {
            switch(index)
            {
            case 0:
                id = Integer.parseInt(value.toString());
                break;
            case 1:
                libelle = value.toString();
                break;
            default:
                break;
            }
        }
    }

    A noter que toutes les méthodes de cette classe étant membres de l'interface KvmSerializable, elles sont utilisées dicter à KSOAP la manière dont elle doit mapper, lire et écrire les propriétés des objets.

    Il te reste maintenant à parcourir le résultat de ta requête pour récupérer des objets :

    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
     
    /**
         * 
         * @param reponseSOAP - la réponse de la reqête
         * @return retourne un tableau des Lines extraites de la réponse Soap
         */
        public static Line[] RetrieveFromSoap(SoapObject reponseSOAP)
        {
            Line[] lines = new Line[soap.getPropertyCount()];
            for (int i = 0; i < lines.length; i++) {
                SoapObject pii = (SoapObject)soap.getProperty(i);
                Line uneLine = LineCategory();
                uneLine.id= Integer.parseInt(pii.getProperty(0).toString());
                uneLine.libelle = pii.getProperty(1).toString();
     
                lines[i] = uneLine;
            }
            return lines;
        }
    Bonne pratique


    Christian Djo,
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

  5. #5
    Membre averti Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Points : 312
    Points
    312
    Par défaut
    Merci beaucoup d'avoir pris le temps de répondre et de m'indiquer tous ces exemples de code !

    Malheureusement je ne vois pas l'intérêt puisqu'il faut de toute façon parcourir le résultat de la requête pour récupérer les objets, ce que je fais déjà de la manière suivante, et ça fonctionne très bien :

    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
     
    public static MonObjetDeRetour RetrieveFromSoap(final Vector<Object>  reponseSOAP) {
     
    	final MonObjetDeRetour monObjetDeRetour = new MonObjetDeRetour();
     
    	final SoapPrimitive wsStatut = (SoapPrimitive) reponseSOAP.get(0);
    	final SoapObject wsMessage = (SoapObject) reponseSOAP.get(1);
    	final SoapObject wsLignes = (SoapObject) reponseSOAP.get(2);
     
    	monObjetDeRetour.setStatut(wsStatut.toString());
    	monObjetDeRetour.setMessage(wsMessage.toString());
     
    	for (int i=0; i<wsLignes.getPropertyCount(); i++) {
    		final SoapObject wsligne = (SoapObject)wsLignes.getProperty(i);
    		final Ligne ligne = new Ligne();
    		ligne.setId(wsligne.getProperty("id").toString());
    		ligne.setLibelle(wsligne.getProperty("libelle").toString());
    		monObjetDeRetour.getLignes().add(ligne);
    	}
     
    	return retourGetListeAppro;
     
    }

    Non moi je m'attendais à ce que KSoap permette de mapper LUI-MEME la réponse, en lui passant en paramètre la réponse du WS et le type de classe, un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonObjetDeRetour monObjetDeRetour  = Bidule.map(reponseSOAP, MonObjetDeRetour.class)
    Mais je m'aperçois que je vais devoir parcourir moi-même les réponses de mes 25 Web Services, qui sont autrement plus complexes que l'exemple simplifié que j'ai donné.

    Ta méthode offre tout de même un avantage non négligeable par rapport à la mienne, je reprend ta phrase : "A noter que toutes les méthodes de cette classe étant membres de l'interface KvmSerializable, elles sont utilisées dicter à KSOAP la manière dont elle doit mapper, lire et écrire les propriétés des objets."
    "Wash me away Clean your body of me Erase all the memories They'll only bring us pain And I've seen All i'll ever need"

  6. #6
    Membre averti Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Points : 312
    Points
    312
    Par défaut
    Je considère le sujet comme résolu : il n'est pas possible de mapper directement une réponse de WS Ksoap dans des beans Java. Il faut parcourir toute la réponse.
    "Wash me away Clean your body of me Erase all the memories They'll only bring us pain And I've seen All i'll ever need"

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

Discussions similaires

  1. Struts dojo tags : traitement de la réponse JSON
    Par Flam dans le forum Struts 2
    Réponses: 1
    Dernier message: 29/05/2011, 02h03
  2. GSOAP - réponse vide du webservice
    Par carkiasis dans le forum XML/XSL et SOAP
    Réponses: 0
    Dernier message: 24/02/2011, 10h05
  3. JFrame vide jusqu'à obtention d'une réponse d'un WebService ?
    Par genamiga dans le forum EDT/SwingWorker
    Réponses: 6
    Dernier message: 19/05/2009, 01h02
  4. Filtre de la réponse d'un webservice
    Par Apo94 dans le forum Services Web
    Réponses: 1
    Dernier message: 02/04/2008, 09h25
  5. [ASP.NET][JS]Réponse d'un webservice
    Par Le-Cortex dans le forum Services Web
    Réponses: 5
    Dernier message: 28/08/2007, 14h13

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