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> :

imageimageimage

·        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).