Développement mobile - Android
WebService
Un WebService nest que lutilisation/échange de données accessibles par internet. Par
exemple, en Android on utilise des fichiers xml comme « strings.xml » pour faciliter la
maintenance (ou linternationalisation dune 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 lapplication.
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 android.content.Context;
import android.util.Log;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import 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 lactivité qui va bénéficier du WebService :
public class Niveau2 extends AppCompatActivity {
final Context context = this;
private String url = "http://adresseInternet/nomFichier.xml";
//[]
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()
{
public void run()
{
str[0] = httpRequest(url);
text.post(new Runnable()
{
public void run()
{
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 nom = file.getElementValue(e);
String enonce = file.getElementValue(e2);
String cons = file.getElementValue(e3);
String 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();
}
On stock ladresse dans une variable.
Permet dafficher une boite de dialogue
avec un indicateur dactivité et un message.
Le parser va découper le fichier xml et lorganiser
comme un « tableau » (chaque tag serait une
colonne et chaque niveau une ligne).
Voir le fichier xml à la fin.
Ici « nom » va donc
prendre pour valeur
« Fabrication de 3
chaises », « inter1 » 18,
« inter2 » 12, etc
Voir le fichier xml à la fin.
« 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)
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) :
1 / 5 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !