Utilisation du web service SOAP sous Android

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 Donner une note à l'article (5)

Article lu   fois.

L'auteur

Site personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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 :

 
Sélectionnez

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 :

 
Sélectionnez

<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 :

 
Sélectionnez

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 :

 
Sélectionnez

SoapObject soap = soap (null, null);

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

 
Sélectionnez

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 :

 
Sélectionnez

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 :

 
Sélectionnez

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 :

 
Sélectionnez

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.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2011 developpez 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.