Consommation d'un Web Service
REST
dans une application Android
Description
Création d'une application Android permettant
d'afficher le catalogue des formations de la société FormArmor. Ce
catalogue sera fourni par un Web Service Rest créé préalablement.
Ce Web Service est disponible sous GlassFish à l'adresse :
"http://192.168.1.16:8080/WebServiceCatalogue/webresources/formation"
192.168.1.16 est l'adresse IP du poste
contenant le Web Service et 8080 le numéro du port de
GlassFish.
La ressource est ici fournie au format XML.
Étapes à suivre
Sous Android Studio
·
Créer l'application Android intitulé
"Android_AfficheFormations".
·
Modifier les permissions en ajoutant la "use-permission", dans le
fichier AndroidManifest.xml, permettant l'utilisation d'Internet
puis
android:usesCleartextTraffic="true"
·
Juste après le <application>
:



·
Modifier l'activité
Insérer un TextView dont l'id sera "txtAffichage" et sans texte.
Voici le code Xml en résultant :
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="368dp"
android:layout_height="495dp"
android:orientation="horizontal"
tools:layout_editor_absoluteX="8dp"
tools:layout_editor_absoluteY="8dp">
<TextView
android:id="@+id/txtAffichage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>
</android.support.constraint.ConstraintLayout>
·
Modifier la classe principale "MainActivity.java" pour
obtenir le code suivant :
package com.example.android_afficheformations2023;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class MainActivity extends Activity
{
TextView txtAffichage;
// L'ADRESSE IP SERA A REMPLACER PAR L'IP DU POSTE CONTENANT LE WEB SERVICE
// Version maison
String lien = "http://192.168.1.20:8080/WebService2023/webresources/formation";
// Version lycée
// String lien = "http://192.168.1.5:8080/WebService2023/webresources/formation";
URL urlCon;
HttpURLConnection urlConnection;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initialisations();
//Lancement de la tache asynchrone (obligatoire car l'appel à un WebService est "une tache longue")
AccesWebServices accesWS = new AccesWebServices();
try
{
//Recupération et affichage de la valeur de retour(de type String)
String rep = accesWS.execute().get();
txtAffichage.setText(rep);
}
catch (Exception e)
{
e.printStackTrace();
}
}
public void initialisations()
{
txtAffichage = (TextView) findViewById(R.id.txtAffichage);
}
private class AccesWebServices extends AsyncTask<Void, Void, String>
{
@Override
protected void onPreExecute()
{
super.onPreExecute();
Toast.makeText(getApplicationContext(), "Début du traitement asynchrone", Toast.LENGTH_LONG).show();
}
@Override
protected String doInBackground(Void... params) {
try
{
urlCon = new URL(lien);
urlConnection = (HttpURLConnection) urlCon.openConnection();
// Transformation du HttpUrlConnection en chaine
InputStream in = urlConnection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(in));
String retour = rd.readLine();
return retour;
}
catch (Exception ex)
{
return null;
}
}
}
}
Dans la classe principale modifier
également l'adresse IP et le nom du projet se trouvant à la
ligne
private static final String url ="http://192.168.1.20:8080/WebService2023/webresources/formation";
Pour mettre ce qui correspond à votre poste.
Explications de la classe principale
Java
La "consommation"
d'un Web Service sous Android est considéré comme une tâche lourde
et donc en tant que telle doit être exécutée en mode asynchrone
(tâche de fond). Voir cours précédent sur les AsynTask. Ici
la "classe asynchrone" est AccesWebServices. Elle hérite de la
classe AsyncTask qui implémente elle-même une interface, nous
obligeant à redéfinir au moins la méthode "doInBackGround". Code de
cette méthode :
protectedHttpResponse doInBackground(Void... params) {
try
{
urlCon
= new URL(lien);
urlConnection =
(HttpURLConnection) urlCon.openConnection();
// Transformation du HttpUrlConnection en
chaine
InputStream in = urlConnection.getInputStream();
BufferedReader rd = new BufferedReader(new
InputStreamReader(in));
String retour = rd.readLine();
return retour;
}
catch(Exception ex)
{
return null;
}
}
L'exécution de la tâche de fond se fait en
instanciant la classe AccesWebServices et en invoquant, à travers
cette instance, la méthode execute() :
AccesWebServices accesWS = newAccesWebServices();
try
{
//Recupération
et exploitation de la valeur de
retour(de type String)
String rep = accesWS.execute().get();
La réponse est ensuite placée dans la zone de
texte (txtAffichage) :
txtAffichage.setText(retourWS);
Vous
pouvez tester après avoir lancer Wamp puis GlassFish (ou
payara).