WebService - Pierre Rainero

publicité
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) :
Téléchargement