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.
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.
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.
Lors du projet, nous utiliserons Java via Android Studio pour interagir avec l'API.
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.
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 permet le transfert de fichiers via FTP entre un ordinateur local et un serveur distant.
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.
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.
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.";
}
?>
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
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 {
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();
}
}
}
}
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;
}
}
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 + '\'' +
'}';
}
}
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.
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();
}
}
}
}
© Eren Varli