OkHttp

Fermé
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021 - 5 avril 2017 à 15:54
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021 - 7 avril 2017 à 13:11
Bonjour,

Encore moi. J'ai lu la documentation sur
OkHttp
: https://square.github.io/okhttp/ J'avoue ne pas trop comprendre comment adapter cette librairie à ce que je souhaite faire. Une page de login sur mon appli, l'utilisateur renseigne son pseudo et son mot de passe, clique sur le bouton de connexion et ensuite c'est là que je devrais normalement utiliser
OkHttp
pour que au clique du bouton, mon appli communique avec le fichier PHP. Hors je ne sais pas comment faire. Pour l'instant j'ai une base de données externe ainsi qu'un script PHP permettant d'interroger la base de données.

Donc j'ai bien compris que je devais utiliser ce code là pour faire ma requête :
OkHttpClient client = new OkHttpClient();

String run(String url) throws IOException {
  Request request = new Request.Builder()
      .url(url)
      .build();

  Response response = client.newCall(request).execute();
  return response.body().string();
}


Je ne demande pas un code tout fait bien sûr. Juste que l'on m'explique ce code pour que je puisse le comprendre et l'adapter à mon projet.

P.S. : Si j'ai bien compris ce code est à insérer dans une classe séparée pour éviter de polluer l'activité principale ? Dans ce cas comment faire pour lier le clique du bouton dans l'activité principale au script de requête de la classe secondaire ? Et également comment lier les variables du script PHP situé sur mon serveur aux champs de formulaire (pseudo et mot de passe) de mon appli ?

4 réponses

jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 4 649
7 avril 2017 à 01:02
Ce qui serait pas mal c'est :
1- sortir le code de connexion à ta bdd et le mettre dans un fichier à part.
Comme ça... si tu ajoutes des "pages" à ton "site" il suffira juste d'inclure le script de connexion au lieu de le réécrire à chaque fois.
( pour "inclure" .. il suffit d'utiliser les instructions INCLUDE , REQUIRE ... )

2 - ajoute la gestion des erreurs PDO à ton code
Regarde ici comment faire :
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

3 - Tu dois retourner un FETCH de ta requête ....
https://www.php.net/manual/fr/pdostatement.fetch.php
1
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 4 649
5 avril 2017 à 16:26
Bonjour,

Sans être très expérimenté en dev Android ... je dirais que :
RequestBody formBody = new FormBody.Builder()
                .add("login", "lavaleurdetonchamplogin")
                .add("password", "lavaleurdetonchamppassword")
          
                .build();

        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(url)
                .post(formBody)
                .addHeader("content-type", "application/json") 
                .build();

        Response response = client.newCall(request).execute();
        return response.body().string();


côté php, les variables seront reçues en POST
<?php

//récupération des variables
$login = !empty($_POST['login']) ? $_POST['login'] : NULL;
$password= !empty($_POST['password']) ? $_POST['password'] : NULL;


//Traitement des variables
if($login && $password){
  //ici tu code le traitement avec une interrogation de ta bdd

 // puis tu remplis la variable $result;
  $result = true;
}else{
  $result = false;
}

//ici tu renvois le résultat 
// par exemple en format JSON
echo json_encode($result);



0
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021
5 avril 2017 à 16:39
Merci. Mais l'appli doit communiquer à distance avec le script PHP donc il manque l'insertion de l'URL de destination du script. Côté PHP j'avais fait ce premier jet qui bien sûr est à améliorer :
<?php
	try // Connection à la base de données.
	{
		$bdd = new PDO('mysql:host=localhost;dbname=', '', '');
	}
	catch (Exception $erreur) // En cas d'erreur de connexion à la base de données.
	{
		die('Erreur de connection à la base de données. Merci de bien vouloir ré-essayer.' . $erreur->getMessage());
	}

	// Vérification de l'existence du pseudo et du mot de passe.
	$requete = $bdd->prepare('SELECT COUNT(*) AS existence FROM utilisateurs WHERE pseudo = :pseudo AND password = :password');
	$requete->bindValue(':pseudo', $_POST['pseudo'], PDO::PARAM_STR);
	$requete->bindValue(':password', $_POST['password'], PDO::PARAM_STR);
	$data = $requete->execute();
	$requete->closeCursor();
	$output = $requete;
	 
	echo(json_encode($output));
?>


Je vais me baser sur ton code pour ré-écrire.
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 4 649
5 avril 2017 à 16:53

donc il manque l'insertion de l'URL de destination du script

Pourtant :
 .url(url)
0
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021 > jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024
5 avril 2017 à 17:15
Ah désolé. ^^
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 4 649 > YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021
Modifié le 5 avril 2017 à 19:27
Au passage ..

$requete->bindValue(':pseudo', $_POST['pseudo'], PDO::PARAM_STR);
$requete->bindValue(':password', $_POST['password'], 


... évite d'utiliser directement les variables POST ( mais c'est pareil avec les GET / SESSION / COOKIE .....)
mais utilises plutôt la récupération "propre" que je t'ai proposé dans mon code

//récupération des variables
$pseudo= !empty($_POST['pseudo']) ? $_POST['pseudo'] : NULL;
$password= !empty($_POST['password']) ? $_POST['password'] : NULL;


puis dans ton code :
$requete->bindValue(':pseudo', $pseudo, PDO::PARAM_STR);
$requete->bindValue(':password', $password, 
0
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021 > jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024
6 avril 2017 à 23:25
Bonsoir,

Alors voici donc le nouveau code :
<?php
	// Récupération des variables.
	$pseudo = !empty($_POST['pseudo']) ? $_POST['pseudo'] : NULL;
	$password = !empty($_POST['password']) ? $_POST['password'] : NULL;

	try // Connexion à la base de données.
	{
		$bdd = new PDO('mysql:host=localhost;dbname=', '', '');
	}
	catch (Exception $erreur) // En cas d'erreur de connexion à la base de données.
	{
		die('Erreur de connexion à la base de données. Merci de bien vouloir ré-essayer.' . $erreur->getMessage());
	}

	// Vérification de l'existence du pseudo et du mot de passe.
	$requete = $bdd->prepare('SELECT COUNT(*) AS existence FROM utilisateurs WHERE pseudo = :pseudo AND password = :password');
	$requete->bindValue(':pseudo', $pseudo, PDO::PARAM_STR);
	$requete->bindValue(':password', $password);
	$data = $requete->execute();
	$requete->closeCursor();
	$output = $requete;
	 
	echo(json_encode($output));
?>


Est-ce que cela te paraît correcte ? Donc si je résume, 1 = récupération des variables transmises par l'appli, 2 = connexion à la base de données, 3 = on vérifie l'existence des variables dans la base de données, 4 = on renvoie une réponse.

Question. Plutôt que de faire :
$output = $requete;
	 
	echo(json_encode($output));


On ne pourrait pas raccourcir en écrivant :
echo(json_encode($requete));
0
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021 > YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021
6 avril 2017 à 23:28
D'ailleurs... on pourrait tout simplement écrire :
$requete = $bdd->prepare('SELECT COUNT(*) AS existence FROM utilisateurs WHERE pseudo = :pseudo AND password = :password');
	$requete->bindValue(':pseudo', $pseudo, PDO::PARAM_STR);
	$requete->bindValue(':password', $password);
	$requete->execute();
	$requete->closeCursor();

	echo(json_encode($requete));


Non ?
0
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021
7 avril 2017 à 13:11
Pour la séparation de la connexion je verrai cela après lorsque j'aurai terminé l'intégralité du code. Après avoir potassé voici ce à quoi je suis arrivé :
<?php
	// Récupération des variables.
	$pseudo = !empty($_POST['pseudo']) ? $_POST['pseudo'] : NULL;
	$password = !empty($_POST['password']) ? $_POST['password'] : NULL;

	try
	{
		// Création d'une variable contenant le chemin d'accès au serveur puis à la base de données.
		$connexion = 'mysql:host=localhost;dbname=';
		// Création d'une variable contenant la commande d'utilisation de l'UTF-8.
		$parametres = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
		// Connexion à la base de données en utilisant les variables prédéfinies.
		$bdd = new PDO($connexion, '', '', $parametres);
		$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	}
	catch (PDOException $erreur)
	{
		// Affichage d'un message en cas d'erreur de connexion à la base de données.
		$message = 'Erreur de connexion à la base de données. Merci de bien vouloir ré-essayer.' . $erreur->getMessage();
		die($message);
	}

	// Vérification de l'existence du pseudo et du mot de passe grâce à une requête.
	$requete = $bdd->prepare('SELECT * FROM utilisateurs WHERE pseudo = :pseudo AND password = :password');
	$requete->bindValue(':pseudo', $pseudo, PDO::PARAM_STR);
	$requete->bindValue(':password', $password);
	$requete->execute();
	$reponse = $requete->fetchAll();

	// Fermeture de la requête.	
	$requete->closeCursor();
	$requete = NULL;
	
	// Retour de la réponse en format Json.
	echo(json_encode($reponse));
?>


On est d'accord qu'avec ce code je vérifie bien l'existence du pseudo et du mot de passe dans la base de données et que je retourne une réponse en format Json ?

Peux-tu m'expliquer ce que signifie
PDO::PARAM_STR
stp ? Ainsi que
!empty($_POST['pseudo']) ? $_POST['pseudo'] : NULL;
?

Si le code est bon concrètement il me reste à instaurer des conditions si la paire pseudo / mot de passe existe ou non. Ce qu'il doit se passer si elle existe et ce qu'il doit se passer si elle n'existe pas. Cela se passe aussi côté serveur dans le script PHP ou je dois introduire les conditions plutôt côté client ?
0