J2ME : Web Services avec KSOAP2
Par PlaceOweb le vendredi, juillet 11 2008, 00:04 - JAVA - Lien permanent
Si vous souhaitez communiquer par WS depuis votre mobile, la lib KSOAP2 est faite pour vous si votre device ne supporte la JSR172.
Partant du tuto J2ME KSOAP2 de Jean-Pierre Clair, j'ai rencontré les problèmes résolus ci dessous :
Premier problème intervenu sous Eclipse lors la compilation J2ME avec l'erreur suivante :
java.lang.NoClassDefFoundError: org/xmlpull/v1/XmlPullParserException
J'avais bien inclus le ksoap2-j2me-core-2.1.2.jar, mais pour permettre la compilation il faut les fichiers sources en .java. Voici donc où les récupérer :
- ksoap2 est une librairie cliente pour web services SOAP pour des environnements java restreins comme les Applets ou applications J2ME (CLDC / CDC / MIDP).
- XML Pull Parsing
- Téléchargement xmlpull_1_1_3_4c_src.zip depuis http://www.xmlpull.org/v1/download/
- kxml2
- Téléchargement kxml2-src-2.3.0.zip depuis la page de téléchargement kXML
- kobjects est une collection de petits ("kilobyte") projets destinés à Java 2 Micro Edition (J2ME/MIDP).
- Dépôt CVS : org.kobjects.base64.Base64.java
- Dépôt CVS : org.kobjects.isodate.IsoDate.java
- kobjects (kilobyte Objects for Mobile Devices)
Ensuite vous faite un nouveau projet nommé KSOAP2, dans lequel vous déposez toutes ces sources. Après quoi il faut ajouter à votre projet J2ME, dans le build path, l'inclusion du projet KSOAP2 également dans le Order and Export.
Voilà un simple J2ME->Create Package créera vos .jad et .jar dans le dossier deployed. Il ne reste plus qu'a les déployer sur votre mobile/PDA pour tester cela.
Deuxième problème avec l'émulateur J2ME
Lors de l'émulation avec Run As->Emulated J2ME Midlet on obtient lors de l'appel du WS :
Warning: To avoid potential deadlock, operations that may block, such as networking, should be performed in a different thread than the commandAction() handler.
Après une recherche sur le net de "Warning: To avoid potential deadlock, operations that may block, such as networking, should be performed in a different thread than the commandAction() handler.", on constate qu'il faut le lancer dans un Thread différent comme l'explique le message :
new Thread(new Runnable(){ public void run() { try{ //ici votre fonction à appeler qui demande les droits de se connecter à internet à cause de la sécurité du mobile appelWs(); }catch(Exception e){} } }).start();
Troisième erreur due à un mauvais retour de mon WS
org.xmlpull.v1.XmlPullParserException: expected: END_TAG {http://schemas.xmlsoap.org/soap/envelope/}Body (position:END_TAG </{http://schemas.xmlsoap.org/soap/envelope/}SOAP-ENV:Fault>@2:296 in java.io.InputStreamReader@84aee8b) at org.kxml2.io.KXmlParser.exception(+47) at org.kxml2.io.KXmlParser.require(+83) at org.ksoap2.SoapEnvelope.parse(+155) at org.ksoap2.transport.Transport.parseResponse(+30) at org.ksoap2.transport.HttpTransport.call(+294)
Complex Type
En cours de recherche... car c'est possible mais ce n'est pas si simple. Commencez par lire le Wiki Ksoap2 :
- Une bonne explication française + exemple sur SOAP et KSOAP
- SOAP-enabling Mobile Devices with KSOAP-2 (2008)
- Low Bandwidth SOAP et son exemple de code AlerterClient (2003)
- Exemple d'implémentation de Ksoap en développement en serveur PHP et client JAVA
- Exemples Ksoap sur leur dépôt SVN
Ressources
- KSOAP2 API JavaDoc
- Client SOAP en ligne facilement utilisable permettent de vérifier le fonctionnement de votre serveur de web service en accédant à son WSDL : SoapClient
Commentaires
Tu peux utiliser l'outil sur https://sourceforge.net/projects/ks... pour générer automatiquement le code en J2ME invoquant le web service