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 :

 
Sélectionnez

  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 :

 
Sélectionnez

<meteo>
	<temps>beau</temps>
</meteo>
			
 
Sélectionnez

  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.