ANDROID

PROJET VISITEURS

API REST, JAVA, DAO etc...

Introduction

Je suis ravi de partager les détails de mon dernier projet : une application Android que j’ai développée en utilisant des API que j’ai conçues spécialement pour cela. J’ai utilisé Android Studio comme environnement de développement principal, ce qui a facilité la création d’une interface utilisateur intuitive et l’optimisation des performances de l’application.

Android Studio Wallpaper

Objectifs

rest-api-icon

API REST

Une API REST est une interface qui permet aux applications de communiquer via des requêtes HTTP en utilisant des méthodes standard comme GET, POST, PUT et DELETE pour manipuler des ressources représentées par des URL.

Logo Cloud

Mettre à disposition l'API

Lors du projet, nous hébergerons l'API pour qu'elle soit accessible en ligne, qui nous permettra de l'utiliser en faisant des requêtes.

Android Studio Logo

Utilisation de L'API

Lors du projet, nous utiliserons Java via Android Studio pour interagir avec l'API.

Outils utilisés

Postman

Postman est un outil collaboratif qui permet de tester, développer et documenter des API, offrant une interface conviviale pour envoyer des requêtes, analyser les réponses et automatiser les tests d'API.

Logo AlwaysData

Alwaysdata

Alwaysdata est une plateforme d'hébergement web qui propose des services de serveur, de base de données et d'applications web pour les développeurs et les entreprises.

FileZilla logo

FileZilla

FileZilla permet le transfert de fichiers via FTP entre un ordinateur local et un serveur distant.

Android Studio Logo

Android Studio

Android Studio est un environnement de développement intégré (IDE) officiel pour créer des applications Android. On va coder sur ce Framework pour créer notre application.

Création de l'API

API REST : Interface de programmation d'application (API) qui permet d'établir une communication entre plusieurs logiciels.

J’ai d’abord créé l’API en PHP en utilisant le modèle CRUD.

  • addVisiteur.php
  • getVisiteurById.php
  • getVisiteurs.php
  • modifVisiteurByIdV.php
  • supVisiteurByIdV.php
  •  

Pour illustrer cela, nous allons voir comment ajouter un visiteur. Partons du principe que la connexion à la base de données (connexion.php) soit établie.

Se connecter à la BD est la première étape

				
					<?php

function connexionPDO(){
	$login = "Login Acces BD";
	$mdp = "Mdp";
	$bd = "nomBD_visiteur";
	$serveur = "mysql-serveur.alwaysdata.net";
	try{
		$conn = new PDO("mysql:host=$serveur;dbname=$bd",$login,$mdp);
		return $conn;
	} catch (PDOException $e){
		print "connexion à la base de données impossible";
		die();
	}
}
?>
				
			

AddVisiteur()

				
					<?php
include("connexion.php");

// Vérifiez que tous les paramètres requis sont présents, y compris 'id'
if (isset($_POST['id']) && isset($_POST['nom']) && isset($_POST['prenom']) && isset($_POST['login']) && isset($_POST['mdp']) && isset($_POST['adresse']) && isset($_POST['cp']) && isset($_POST['ville']) && isset($_POST['dateEmbauche'])) {
    $visiteurId      = $_POST['id'];
    $visiteurNom     = $_POST['nom'];
    $visiteurPrenom  = $_POST['prenom'];
    $visiteurLogin   = $_POST['login'];
    $visiteurMdp     = $_POST['mdp'];
    $visiteurAdresse = $_POST['adresse'];
    $visiteurCp      = $_POST['cp'];
    $visiteurVille   = $_POST['ville'];
    $visiteurDateEmbauche   = $_POST['dateEmbauche'];

    try {
        $connexion = connexionPDO();
        $req = "INSERT INTO visiteur (id, nom, prenom, login, mdp, adresse, cp, ville, dateEmbauche) VALUES (:id, :nom, :prenom, :login, :mdp, :adresse, :cp, :ville, :dateEmbauche)";
        $stmt = $connexion->prepare($req);
        
        // Paramétrez les valeurs pour la requête préparée, y compris l'ID
        $stmt->bindParam(':id', $visiteurId);
        $stmt->bindParam(':nom', $visiteurNom);
        $stmt->bindParam(':prenom', $visiteurPrenom);
        $stmt->bindParam(':login', $visiteurLogin);
        $stmt->bindParam(':mdp', $visiteurMdp);
        $stmt->bindParam(':adresse', $visiteurAdresse);
        $stmt->bindParam(':cp', $visiteurCp);
        $stmt->bindParam(':ville', $visiteurVille);
        $stmt->bindParam(':dateEmbauche', $visiteurDateEmbauche);

        // Exécution de la requête
        if ($stmt->execute()) {
            print("1");
        } else {
            print "Non exécuté";
        }
    } catch (PDOException $e) {
        print "Erreur: " . $e->getMessage();
        die();
    }
} else {
    print "Les paramètres nécessaires ne sont pas définis.";
}
?>

				
			

Transmission sur le serveur

Transmission de l'API sur le serveur

enveloppe addVisiteur
FileZilla logo
Logo AlwaysData 2

Test de l'API sur Postman

URL saisi: https://eren.alwaysdata.net/API/addVisiteur.php?id=x26

&nom=Dupont

&prenom=Jean

&login=jdupont

&mdp=password123

&adresse=123+Rue+Principale

&cp=75001&ville=Paris

&dateEmbauche=2024-05-04

Retour -> 1 (insertion OK)

Utilisation via notre application

Android Studio Logo

Création du DAO et classe Visiteur

Intégration du fichier HttpPostRequest 

Création de l’interface de saisie

Création de la classe AjoutActivity

Modèle

HttpPostRequest.java

HttpPostRequest : classe Java pour envoyer des requêtes HTTP POST en arrière-plan depuis une application Android, utilisant `AsyncTask` pour gérer les paramètres et la réponse sans bloquer le fil principal.

				
					import (...)

public class HttpPostRequest extends AsyncTask<String, Void, String> {
    public static final String REQUEST_METHOD = "POST";
    public static final int READ_TIMEOUT = 15000;
    public static final int CONNECTION_TIMEOUT = 15000;
    private HttpURLConnection connection;

    @Override
    protected String doInBackground(String... params) {
        String targetURL = params[0];
        String urlParameters = params[1];
        Log.d("url", targetURL);
        Log.d("urlParametres", urlParameters);
        URL url;
        connection = null;

        try {
            // Create the connection
            url = new URL(targetURL);
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod(REQUEST_METHOD);
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestProperty("Content-Length", Integer.toString(urlParameters.getBytes().length));
            connection.setRequestProperty("Content-Language", "fr-FR");
            connection.setReadTimeout(READ_TIMEOUT);
            connection.setConnectTimeout(CONNECTION_TIMEOUT);

            connection.setUseCaches(false);
            connection.setDoInput(true);
            connection.setDoOutput(true);

            // Send the request
            DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
            wr.writeBytes(urlParameters);
            wr.flush();
            wr.close();

            // Get the response
            InputStream is = connection.getInputStream();
            BufferedReader rd = new BufferedReader(new InputStreamReader(is));
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = rd.readLine()) != null) {
                response.append(line);
                // response.append('\r');
            }
            rd.close();
            Log.d("reponse", response.toString());
            return response.toString();

        } catch (Exception e) {
            e.printStackTrace();
            return null;

        } finally {
            // Disconnect the connection after execution
            if (connection != null) {
                connection.disconnect();
            }
        }
    }
}

				
			

VisiteurDAO.java

DAO : Un Data Access Object fournit une interface pour interagir avec une base de données, séparant l’accès aux données de la logique métier avec des méthodes CRUD.

				
					import (...)

public class VisiteurDAO {
    public VisiteurDAO() {
    }

    public String addVisiteur(Visiteur unVisiteur) {
        String result = "";
        // Adresse de l'URL de l'API à interroger
        String myUrl = "https://eren.alwaysdata.net/API/addVisiteur.php";

        // Préparez les paramètres à transmettre pour effectuer l'ajout
        String params = "id=" + unVisiteur.getId() +
                "&nom=" + unVisiteur.getNom() +
                "&prenom=" + unVisiteur.getPrenom() +
                "&login=" + unVisiteur.getLogin() +
                "&mdp=" + unVisiteur.getMdp() +
                "&adresse=" + unVisiteur.getAdresse() +
                "&cp=" + unVisiteur.getCp() +
                "&ville=" + unVisiteur.getVille() +
                "&dateEmbauche=" + unVisiteur.getDateEmbauche();
        Log.d("VisiteurDAO", "Paramètres préparés : " + params);

        HttpPostRequest postRequest = new HttpPostRequest();
        try {
            result = postRequest.execute(new String[]{myUrl, params}).get();
        } catch (InterruptedException e) {
            Log.e("VisiteurDAO", "Requête interrompue", e);
        } catch (ExecutionException e) {
            Log.e("VisiteurDAO", "Erreur lors de l'exécution de la requête", e);
        }

        // Résultat du traitement
        Log.d("VisiteurDAO", "Résultat : " + result);
        return result;
    }
}
				
			

Visiteur.java

				
					package com.api_rest.gestionvisiteurs.modele;

public class Visiteur {
    private String id;
    private String nom;
    private String prenom;
    private String login;
    private String mdp;
    private String adresse;
    private String cp;
    private String ville;
    private String dateEmbauche;

    // Constructeur sans argument
    public Visiteur() {}

    // Constructeur complet
    public Visiteur(String id, String nom, String prenom, String login, String mdp, String adresse, String cp, String ville, String dateEmbauche) {
        this.id = id; this.nom = nom; this.prenom = prenom; this.login = login; this.mdp = mdp; this.adresse = adresse; this.cp = cp; this.ville = ville; this.dateEmbauche = dateEmbauche;
    }

    // Getters
    public String getId() { return id; }
    public String getNom() { return nom; }
    public String getPrenom() { return prenom; }
    public String getLogin() { return login; }
    public String getMdp() { return mdp; }
    public String getAdresse() { return adresse; }
    public String getCp() { return cp; }
    public String getVille() { return ville; }
    public String getDateEmbauche() { return dateEmbauche; }

    // Setters
    public Visiteur setId(String id) { this.id = id; return this; }
    public Visiteur setNom(String nom) { this.nom = nom; return this; }
    public Visiteur setPrenom(String prenom) { this.prenom = prenom; return this; }
    public Visiteur setLogin(String login) { this.login = login; return this; }
    public Visiteur setMdp(String mdp) { this.mdp = mdp; return this; }
    public Visiteur setAdresse(String adresse) { this.adresse = adresse; return this; }
    public Visiteur setCp(String cp) { this.cp = cp; return this; }
    public Visiteur setVille(String ville) { this.ville = ville; return this; }
    public Visiteur setDateEmbauche(String dateEmbauche) { this.dateEmbauche = dateEmbauche; return this; }

    // toString
    @Override
    public String toString() {
        return "Visiteur{" +
                "id='" + id + '\'' +
                ", nom='" + nom + '\'' +
                ", prenom='" + prenom + '\'' +
                ", login='" + login + '\'' +
                ", mdp='" + mdp + '\'' +
                ", adresse='" + adresse + '\'' +
                ", cp='" + cp + '\'' +
                ", ville='" + ville + '\'' +
                ", dateEmbauche='" + dateEmbauche + '\'' +
                '}';
    }
}
				
			

Vue

Android Studio facilite la création d’interfaces grâce à son éditeur de mise en page. Le développeur peut simplement glisser-déposer (drag-and-drop) des composants comme des boutons, des champs de texte ou des images, et obtenir un aperçu en temps réel du design sur différents appareils. Cette méthode visuelle accélère la conception tout en générant automatiquement le code XML, simplifiant ainsi le processus.

Contrôleur

Dans le contrôleur, l’activité AjoutActivity permettra de saisir les informations nécessaires via l’interface, puis d’appeler le DAO pour envoyer ensuite ces informations.

				
					import (...)

public class AjoutActivity extends AppCompatActivity {
    private Visiteur nouveauVisiteur;
    private VisiteurDAO visiteurAcces;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ajout);

        // Récupération des valeurs saisies
        Button btnEnregistrer = findViewById(R.id.btnValiderModif);
        btnEnregistrer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ajouter();
            }
        });
    }

    private void ajouter() {
        EditText editTextNom = findViewById(R.id.editTextNom);
        EditText editTextPrenom = findViewById(R.id.editTextPrenom);
        EditText editTextLogin = findViewById(R.id.editTextLogin);
        EditText editTextMdp = findViewById(R.id.editTextMdp);
        EditText editTextAdrRue = findViewById(R.id.editTextAdrRue);
        EditText editTextCp = findViewById(R.id.editTextAdrCp);
        EditText editTextVille = findViewById(R.id.editTextAdrVille);
        EditText editTextDateEmbauche = findViewById(R.id.editTextDateEmbauche);

        String visNom = editTextNom.getText().toString();
        String visPrenom = editTextPrenom.getText().toString();
        String visLogin = editTextLogin.getText().toString();
        String visMdp = editTextMdp.getText().toString();
        String visAdrRue = editTextAdrRue.getText().toString();
        String visCp = editTextCp.getText().toString();
        String visVille = editTextVille.getText().toString();
        String visDateEmbauche = editTextDateEmbauche.getText().toString();

        if (visNom.isEmpty() || visPrenom.isEmpty() || visLogin.isEmpty() || visMdp.isEmpty() || visAdrRue.isEmpty() || visCp.isEmpty() || visVille.isEmpty() || visDateEmbauche.isEmpty()) {
            Toast.makeText(getApplicationContext(), "Veuillez ajouter tous les champs", Toast.LENGTH_SHORT).show();
        } else {
            visiteurAcces = new VisiteurDAO();
            nouveauVisiteur = new Visiteur(visNom, visPrenom, visLogin, visMdp, visAdrRue, visCp, visVille, visDateEmbauche);
            Log.d("test", "Contenu de l'objet --> " + nouveauVisiteur);

            String result = visiteurAcces.addVisiteur(nouveauVisiteur);
            Log.d("test", "Contenu de result --> " + result);

            if (result.equals("1")) {
                Context c = getApplicationContext();
                Toast msg = Toast.makeText(c, "Client ajouté :)", Toast.LENGTH_LONG);
                msg.show();

                Intent i = new Intent(AjoutActivity.this, PropositionActivity.class);
                startActivity(i);
            } else {
                Context c = getApplicationContext();
                Toast msg = Toast.makeText(c, "Client non ajouté :(", Toast.LENGTH_LONG);
                msg.show();
            }
        }
    }
}

				
			

Résultat

Vue

Insertion des données

Données insérées, AjoutActivity appelle DAO.

DAO

Insertion en cours dans la BD...

Insertion OK

Fin

© Eren Varli