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.