Utiliser le Web service SOAP sous Android

Silvera David

Durant ce tutoriel vous allez apprendre à utiliser le web service SOAP sous Android. Vous verrez aussi comment interpréter le résultat d'une requête SOAP. Bonne lecture !
Commentez ♪

- Titre : Utiliser le Web service SOAP sous Android

- Auteur : Silvera David

- Parution : 28 août 2011

- Licence : Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Création d'une classe nommée Tutoriel

- III. Connexion et envoi de requête avec SOAP

- IV. Interprétation du résultat

- V. Conclusion

- VI. Remerciement

I - Introduction

Un web service permet la communication et l'échange de données entre une application et un système. Dans ce tutoriel, nous allons voir comment utiliser le web service SOAP sous Android. SOAP (Simple Object Access Protocol) est un protocole réseau permettant de faire des appels de procédures sur une machine distante à l'aide d'un serveur d'application. Il est bâti sur le XML. Pour plus de facilité, nous allons expliquer ce tutoriel autour d'un exemple.

II - Création d'une classe nommée Tutoriel

Pour notre exemple, nous allons créer une classe simple que nous allons appeler Tutoriel. Cette classe contient quatre valeurs : url (type String), auteur (type String) nbChapitre (type Int), note (type float).
Donc nous avons ceci :

public class Tutoriel
{
String url ;
String auteur ;
int nbChapitre ;
float note ;
}

Nous ne mettons pas les attributs en privé afin de les utiliser directement dans une autre classe.

III - Connexion et envoi de requête avec SOAP

Tout d'abord, téléchargez le fichier ksoap2_android_src.zip, dézippez-le et copiez le dossier org dans votre répertoire src. Actualisez votre projet sous Eclipse (F5) et de nouveaux packages devraient apparaitre.
Ensuite, dans le manifest il faut ajouter la permission d'accès à internet :

<uses-permission android:name="android.permission.INTERNET" />

Maintenant nous pouvons programmer notre classe qui contiendra une fonction permettant de récupérer un objet SoapObject. Celui-ci pourra être interprété par la suite.
Il contiendra le résultat de la requête (valeurs prises dans le fichier WSDL).
Voici la classe détaillée :

import java.io.IOException;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;

public class soapHelper
{
private static final String    SOAP_ACTION    = "getServices";
private static final String    METHOD_NAME    = "getServices";
private static final String    NAMESPACE    = "mon_namespace";
//L'URL suivante ne peut pas être localhost car localhost représente l'émulateur
private static final String    URL    = "http://monurl.com/service";

public static SoapObject soap (String property, String value) throws IOException, XmlPullParserException
{
// Création de la requête SOAP
SoapObject request = new SoapObject (NAMESPACE, METHOD_NAME);
//Ajout de propriété: addProperty(nom de variable, valeur) -> Le nom de la variable vient du fichier WSDL
if (property != null)
request.addProperty(property, value);
//Toutes les données demandées sont mises dans une enveloppe.
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope (
SoapEnvelope.VER11);
//Préparation de la requête
envelope.setOutputSoapObject (request);
HttpTransportSE androidHttpTransport = new HttpTransportSE (URL);
//Ceci est optionnel, on l'utilise pour savoir si nous voulons ou non utiliser
//un paquet "sniffer" pour vérifier le message original (androidHttpTransport.requestDump)
androidHttpTransport.debug = true;
//Envoie de la requête
androidHttpTransport.call (SOAP_ACTION, envelope);
//Obtention du résultat
SoapObject soapResult = (SoapObject) envelope.getResponse ();
return soapResult;
}
}

Notre classe est terminée. Nous pouvons maintenant récupérer notre SoapObject. Pour info, pour éviter de récupérer tout le fichier WSDL, il faut ajouter des propriétés.

IV - Interprétation du résultat

Pour cela nous allons ajouter une fonction qui va parser le résultat. Pour comprendre comment elle va fonctionner, il faut analyser comment s'affiche le résultat.
Pour récupérer un résultat il suffit d'exécuter les lignes de code suivantes :

SoapObject soap = soap (null, null);

Ceci nous renvoie une chaine de caractères ressemblant à ceci :

anyType{tTutoriel=anyType{sUrl=http://dsilvera.developpez.com; sAuteur=dsilvera; iNbChapitre=3; fNote=4.5 };
tTutoriel=anyType{sUrl=http://dsilvera.developpez.com; sAuteur=dsilvera; iNbChapitre=2; fNote=2.5 };
tTutoriel=anyType{sUrl=http://dsilvera.developpez.com; sAuteur=dsilvera; iNbChapitre=1; fNote=3.5 };
tTutoriel=anyType{sUrl=http://dsilvera.developpez.com; sAuteur=dsilvera; iNbChapitre=5; fNote=5 };

Vu comme ceci, il est difficile de comprendre la structure du résultat. Ciblons notre analyse sur un seul élément :

tTutoriel=anyType{sUrl=http://dsilvera.developpez.com; sAuteur=dsilvera; iNbChapitre=3; fNote=4.5

Que remarque-t-on ?
Avant chaque égal, nous retrouvons le nom d'un attribut de la classe précédé de la première lettre de son type. Par exemple, sUrl est l'attribut nommé « url » de type « s » (String).
Donc notre parseur ressemblera à ceci :

public static void parseSoapObject (String input, Object output)
throws NumberFormatException, IllegalArgumentException,
IllegalAccessException, InstantiationException
{

Class theClass = output.getClass ();
Field[] fields = theClass.getDeclaredFields ();

for (int i = 0; i < fields.length; i++)
{
Type type = fields[i].getType ();
fields[i].setAccessible (true);

// Détection d'un String
if (fields[i].getType ().equals (String.class))
{
// "s" représente le mot String. Ceci permet de déterminer le type d'un paramètre
String tag = "s" + fields[i].getName () + "=";

if (input.contains (tag))
{
String strValue = input.substring (input.indexOf (tag)
+ tag.length (),
input.indexOf (";", input.indexOf (tag)));
if (strValue.length () != 0)
{
fields[i].set (output, strValue);
}
}
}

// détection d'un int ou d'un Integer
if (type.equals (Integer.TYPE) || type.equals (Integer.class))
{
// "i" comme int ou Integer
String tag = "i" + fields[i].getName () + "=";

if (input.contains (tag))
{
String strValue = input.substring (input.indexOf (tag)
+ tag.length (),
input.indexOf (";", input.indexOf (tag)));
if (strValue.length () != 0)
{
fields[i].setInt (output, Integer.valueOf (strValue));
}
}
}

// détection d'un float ou d'un Float
if (type.equals (Float.TYPE) || type.equals (Float.class))
{
// f comme float ou Float
String tag = "f" + fields[i].getName () + "=";

if (input.contains (tag))
{
String strValue = input.substring (input.indexOf (tag)
+ tag.length (),
input.indexOf (";", input.indexOf (tag)));
if (strValue.length () != 0)
{
fields[i].setFloat (output, Float.valueOf (strValue));
}
}
}
}

}

Attention, comme vous l'avez vu, cette fonction ne parse que les int (ou Integer), float (ou Float) et String. À vous d'implémenter le reste si nécessaire.

Notre fonction est terminée. Il vous suffit de remplir votre objet Tutoriel comme ceci :

Tutoriel tuto = new Tutoriel () ;
SoapObject soap = soap ("iTopN", "4"); // Récupérer les quatre premiers éléments
parseBusinessObject (soap.getProperty (0).toString (), tuto);

V - Conclusion

J'espère que ce tutoriel vous aura aidé. Vous savez dès à présent utiliser SOAP via Android.

VI - Remerciement

Je remercie ClaudeLELOUP pour la correction orthographique.