I. Préambule▲
L'appel de Services Web SOAP peut s'avérer très utile au sein d'une application Android. Ici nous allons voir comment appeler un Service Web permettant de connaître la météo du jour. Avant cela, une petite mise au point est nécessaire.
Tout d'abord, qu'est-ce qu'un Service Web?
Un Service Web est une fonctionnalité exécutable à distance pouvant être développée dans divers langages comme Java, .NET... Ces services peuvent être appelés à partir d'un langage différent de celui du service. Par exemple, il est possible d'appeler un service codé en Java au sein d'un code en PHP. Les fonctionnalités de ces Web_Services peuvent être des interactions avec une base de données, fournir des informations au programme appelant le service. Un Service Web SOAP nécessite une WSDL contrairement à des services REST.
Qu'est-ce qu'une WSDL?
Le WSDL est une description fondée sur le XML qui indique comment utiliser le service.
Le WSDL sert à décrire :
- le protocole de communication (SOAP RPC ou SOAP orienté message) ;
- le format de messages requis pour communiquer avec ce service ;
- la définition des méthodes qu'il est possible d'appeler ;
- la localisation du service.
Une description WSDL est un document XML qui commence par la balise "definitions" et qui contient les balises suivantes :
- "binding" : définit le protocole à utiliser pour invoquer le service web ;
- "port" : spécifie l'emplacement actuel du service ;
- "service" : décrit un ensemble de points finals du réseau.
Des outils sont-ils nécessaires?
Pour appeler un Service Web SOAP, une bibliothèque est nécessaire vu qu'il n'existe pas un tel outil dans le SDK d'Android. Il s'agit de la bibliothèque kSoap2 disponible à l'adresse suivante :
kSoap2kSoap2.
Elle permettra également de parser la réponse du service.
II. Appel d'un service▲
Nous allons supposer qu'une WSDL (Web Services Description Language, ou langage de description de services) est disponible à l'adresse http://mon-exemple-web-services/wsdl?WSDL, celle-ci proposant la méthode getMeteo(String ville). Voyons comment appeler ce service :
public
class
AppelService {
private
static
final
String NAMESPACE =
"http://mon-site-web.fr"
;
private
static
final
String URL =
"http://mon-exemple-web-services/wsdl.WSDL"
;
private
static
final
String SOAP_ACTION =
"getMeteo"
;
private
static
final
String METHOD_NAME =
"getMeteo"
;
private
String getMeteo
(
String ville) {
try
{
SoapObject request =
new
SoapObject
(
NAMESPACE, METHOD_NAME);
request.addProperty
(
"ville"
, ville);
SoapSerializationEnvelope envelope =
new
SoapSerializationEnvelope
(
SoapEnvelope.VER11);
envelope.setOutputSoapObject
(
request);
AndroidHttpTransport androidHttpTransport =
new
AndroidHttpTransport
(
URL);
androidHttpTransport.call
(
SOAP_ACTION, envelope);
}
catch
(
Exception e) {
Log.e
(
"getMeteo"
, ""
, e);
}
}
}
Rien de spécial à retenir dans ce code à part qu'il utilise intégralement la bibliothèque. Afin de pouvoir l'utiliser, il vous faudra juste remplacer les constantes par vos URL et noms de méthodes, adaptées à votre WSDL et si nécessaire ajouter des paramètres à votre requête.
Voilà, nous savons donc maintenant comment appeler un Service Web
III. Parser une réponse SOAP▲
Il est fort intéressant de savoir appeler un Service Web, encore faut-il savoir comment parser la réponse. Ici, nous voulons donc parser la réponse SOAP se présentant de la manière suivante :
<meteo>
<temps>
beau</temps>
</meteo>
public
class
AppelService {
private
static
final
String NAMESPACE =
"http://mon-site-web.fr"
;
private
static
final
String URL =
"http://mon-exemple-web-services/wsdl.WSDL"
;
private
static
final
String SOAP_ACTION =
"getMeteo"
;
private
static
final
String METHOD_NAME =
"getMeteo"
;
private
String getMeteo
(
String ville) {
String meteo =
null
;
try
{
SoapObject request =
new
SoapObject
(
NAMESPACE, METHOD_NAME);
request.addProperty
(
"ville"
, ville);
SoapSerializationEnvelope envelope =
new
SoapSerializationEnvelope
(
SoapEnvelope.VER11);
envelope.setOutputSoapObject
(
request);
AndroidHttpTransport androidHttpTransport =
new
AndroidHttpTransport
(
URL);
androidHttpTransport.call
(
SOAP_ACTION, envelope);
SoapObject objetSOAP =
(
SoapObject)envelope.getResponse
(
);
meteo =
this
.parserObjet
(
objetSOAP);
}
catch
(
Exception e) {
Log.e
(
"getMeteo"
, ""
, e);
}
}
private
String parserObjet
(
SoapObject objet) {
SoapObject meteoObjet =
(
SoapObject)positionSoap.getProperty
(
"meteo"
);
String meteo =
meteoObjet.getProperty
(
"temps"
).toString
(
);
return
meteo;
}
}
Un simple appel à la méthode getProperty permet de récupérer un autre objet SoapObject ou directement la valeur d'une propriété.
IV. Conclusion▲
Vous avez pu voir qu'il est très simple de faire appel à des Services Web SOAP et de parser les résultats. Ici, il s'agit d'un exemple simple mais même si vous faites face à un plus compliqué, vous ne serez pas perdu ! Dans un prochain article, nous verrons comment appeler des Services REST.
V. Remerciements▲
Merci à Keulkeul, ClaudeLELOUP et jacques_jean pour leur relecture et leurs remarques.