Développement mobile - Android WebService Un WebService n’est que l’utilisation/échange de données accessibles par internet. Par exemple, en Android on utilise des fichiers xml comme « strings.xml » pour faciliter la maintenance (ou l’internationalisation d’une application), on peut pousser cela encore plus loin. Pour éviter de faire une mise à jour si on désire uniquement corrigé des libellés, on peut pointer vers un fichier xml sur internet. En effet il suffit alors de modifier ce fichier pour mettre à jours les libellés de l’application. Exemple : La première chose à faire et de modifier le manifest en ajoutant la permission : <uses-permission android:name="android.permission.INTERNET"/> On utilisera le parser xml de w3s : import import import import import import import import import import import import import import import import import import import import import import import import android.content.Context; android.util.Log; org.w3c.dom.Document; org.w3c.dom.Element; org.w3c.dom.Node; org.w3c.dom.NodeList; org.xml.sax.InputSource; org.xml.sax.SAXException; java.io.BufferedReader; java.io.File; java.io.FileInputStream; java.io.FileNotFoundException; java.io.FileOutputStream; java.io.IOException; java.io.InputStream; java.io.InputStreamReader; java.io.OutputStreamWriter; java.io.Reader; java.io.StringReader; java.io.StringWriter; java.io.Writer; javax.xml.parsers.DocumentBuilder; javax.xml.parsers.DocumentBuilderFactory; javax.xml.parsers.ParserConfigurationException; public class XMLParser { // constructor public XMLParser() { } public String readXMLFromFile(Context activity, String xmlFile) { InputStream is = null; File file = null; Writer writer = new StringWriter(); file = new File(xmlFile); if (!(file == null)) { try { is = new FileInputStream(file); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (is != null) { char[] buffer = new char[1024]; try { Reader reader = new BufferedReader( new InputStreamReader(is, "UTF-8")); int n; while ((n = reader.read(buffer)) != -1) { writer.write(buffer, 0, n); } is.close(); } catch (IOException e) { Log.e("Error: ", e.getMessage()); return null; } } return writer.toString(); } public void writeXMLToFile(Context context, String xmlFile, String xmlData) { FileOutputStream fOut = null; OutputStreamWriter osw = null; try { fOut = new FileOutputStream(new File(xmlFile)); osw = new OutputStreamWriter(fOut); osw.write(xmlData); osw.flush(); } catch (Exception e) { e.printStackTrace(); } finally { try { osw.close(); fOut.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * Getting XML DOM element * @param XML string * */ public Document getDomElement(String xml){ Document doc = null; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { DocumentBuilder db = dbf.newDocumentBuilder(); InputSource is = new InputSource(); is.setCharacterStream(new StringReader(xml)); doc = db.parse(is); } catch (ParserConfigurationException e) { Log.e("Error: ", e.getMessage()); return null; } catch (SAXException e) { Log.e("Error: ", e.getMessage()); return null; } catch (IOException e) { Log.e("Error: ", e.getMessage()); return null; } return doc; } /** Getting node value * @param elem element */ public final String getElementValue( Node elem ) { Node child; if( elem != null){ if (elem.hasChildNodes()){ for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){ if( child.getNodeType() == Node.TEXT_NODE ){ return child.getNodeValue(); } } } } return ""; } public String getValue(Element item, String str) { NodeList n = item.getElementsByTagName(str); return this.getElementValue(n.item(0)); } public void setValue(Element elem, String str){ Node child; if( elem != null){ if (elem.hasChildNodes()){ for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){ if( child.getNodeType() == Node.TEXT_NODE ){ child.setNodeValue(str); } } } } } public String GetElementAttribute(Element item, String attribName){ return item.getAttribute(attribName); } } Plaçons-nous désormais dans l’activité qui va bénéficier du WebService : public class Niveau2 extends AppCompatActivity { final Context context = this; private String url = "http://adresseInternet/nomFichier.xml"; //[…] On stock l’adresse dans une variable. protected void onCreate(Bundle savedInstanceState){ //[…] final ProgressDialog progressDialog = ProgressDialog.show(Niveau1.this, "Connexion en cours...","En cas de longue attente vérifiez votre connexion à internet", true, true, null); new Thread (new Runnable() Permet d’afficher une boite de dialogue { avec un indicateur d’activité et un message. public void run() { Le parser va découper le fichier xml et l’organiser str[0] = httpRequest(url); comme un « tableau » (chaque tag serait une text.post(new Runnable() colonne et chaque niveau une ligne). { public void run() Voir le fichier xml à la fin. { XMLParser file = new XMLParser(); Document doc = file.getDomElement(str[0]); Element e = (Element) doc.getElementsByTagName("name").item(0); Element e2 = (Element) doc.getElementsByTagName("description").item(0); Element e3 = (Element) doc.getElementsByTagName("question").item(0); Element e4 = (Element) doc.getElementsByTagName("reponse").item(0); String String String String « e » va donc prendre la valeur du premier élément dont le tag est « name ». Pour prendre l’élément « name » suivant (si on reste dans la comparaison avec un tableau, le tuple suivant) on écrira alors : Element e = (Element) doc.getElementsByTagName("name").item(1) nom = file.getElementValue(e); enonce = file.getElementValue(e2); cons = file.getElementValue(e3); rep = file.getElementValue(e4); String inter1 = rep.substring(0, 2); String inter2 = rep.substring(3, 5); String inter3 = rep.substring(6, 8); repons[0] = Integer.parseInt(inter1); repons[1] = Integer.parseInt(inter2); repons[2] = Integer.parseInt(inter3); text.setText(nom); ennonce.setText(enonce); consigne.setText(cons); progressDialog.dismiss(); } }); } }).start(); } Ici « nom » va donc prendre pour valeur « Fabrication de 3 chaises », « inter1 » 18, « inter2 » 12, etc… Voir le fichier xml à la fin. public String httpRequest (String adress) { String answer = "", temp = ""; try { URL url = new URL(adress); HttpURLConnection con = (HttpURLConnection) url.openConnection(); InputStream in = con.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); while ((temp = reader.readLine()) != null) { answer = answer + temp; } reader.close(); } catch (Exception e){} return answer; } Fichier xml en ligne (partiel) :