Méthode POST avec Android

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Je fais (de nouveau) appel à vous car j’ai du mal à faire fonctionner la connexion entre mon application Android et ma base de données.

Alors petit résumé: J’ai une base de données SQL sur un serveur et une application Android sur mon téléphone. Mon téléphone fait appel à des scripts PHP sur mon serveur, qui eux font la liaison avec la BDD.

Pour l’exemple, j’ai une table "Utilisateur" avec trois tuples: login, password et mail. J’arrive à récupérer les données de la table utilisateur, et j’arrive aussi à insérer un utilisateur.

Mon problème est le suivant: Je n’arrive pas à utiliser la méthode POST, et je suis donc contraint d’utiliser la méthode GET (en faisant passer les paramètres via l’URL donc), ce qui n’est pas terrible pour les mots de passe; d’autant plus que j’aurais surement besoin de faire passer des variables plus grosses et plus nombreuses par la suite.

Je vous mets le code me permettant d’effectuer une inscription (=de rentrer une nouvelle ligne dans la table utilisateur). Ce qui est en commentaire dans la méthode post(), c’est la requête GET qui fonctionne, ce qui est en dessous est ce que j’ai essayé de faire avec la méthode POST, mais qui ne fonctionne pas.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
public class Inscription extends AppCompatActivity {
    Utilisateur u = new Utilisateur();

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

        Button connexion = (Button) findViewById(R.id.buttonInscription);
        connexion.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                EditText inputLogin = (EditText) findViewById(R.id.editTextLogin);
                EditText inputMdp = (EditText) findViewById(R.id.editText3Mdp);
                EditText inputEmail = (EditText) findViewById(R.id.editTextMail);

                //Log.v("Login input: ", u.toString());

               // Utilisateur u = new Utilisateur();
                u.setLogin(inputLogin.getText().toString());
                u.setMdp(inputMdp.getText().toString());
                u.setMail(inputEmail.getText().toString());

                //Log.v("User onCreate: ", u.toString());

                new InscriptionServeur().execute();
                //Intent intent = new Intent(Inscription.this, Inscription.class);
                //startActivity(intent);

            }
        });

    }


    class InscriptionServeur extends AsyncTask<String, String, String> {
        private final String url = "http://xxx.xxx.xxx.xxx/xxxx/scriptInscription.php";
        private final OkHttpClient client = new OkHttpClient();
        private Gson gson = new Gson();
        private String c;

        protected String doInBackground(String... args) {
            try {
                post(url);
            } catch (IOException e) {
                e.printStackTrace();
            }

            return "";
        }

        public String post(String url) throws IOException {
            // GET qui fonctionne

           /* url+="?login=" + u.getLogin() + "&mdp=" + u.getMdp() + "&mail=" + u.getMail();
            Log.v("********TEST*********: " , url);

            Request request = new Request.Builder().url(url).build();
            // Execute the request.
            Response response = null;
            response = client.newCall(request).execute();*/


           //Début POST qui ne fonctionne pas
            c=gson.toJson(u);
            MediaType JSON_TYPE = MediaType.parse("application/json; charset=utf-8");

            Request myGetRequest = new Request.Builder()
                    .url(url)
                    .post(RequestBody.create(JSON_TYPE, c))
                    .build();

            client.newCall(myGetRequest).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                   // Context context = getApplicationContext();
                    Log.v("fail", "fail");
                    //Toast.makeText(context, "FAIL", Toast.LENGTH_LONG);
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                   // Context context = getApplicationContext();
                    Log.v("success", "success");
                   // Toast.makeText(context, "PASS", Toast.LENGTH_LONG);
                }
            });
            return null;

        }
    }
}

Dans mon script PHP, j’ai une condition qui vérifie d’une part que toutes les variables ont bien un valeur (avec isset), et d’autre part que l’insertion a bien fonctionné. Lorsque j’utilise la méthode GET, tout se passe bien, mais lorsque j’utilise POST, le script échoue au premier if (avec les issets, en me disant que tous les champs ne sont pas remplis)

Merci par avance pour vos réponses !

+0 -0

Cette réponse a aidé l’auteur du sujet

Bonjour,

Désolé pour le retard dans la réponse, j’ose espérer que vous avez reussi à surpasser cette erreur.

Deux petites remarques :

  • AsyncTask permet de lancer le traitement sur un autre thread. Quand vous appeller client.newCall(myGetRequest).enqueue, okhttp va créé un thread pour lancer la requête. Vous créé donc un thread pour créé un autre, un seul suffit largement.

  • Le standart est Retrofit pour faire des appels REST, c’est beaucoup plus simple et y’a un tutoriel sur le site. Je me permet de vous recommander la lecture.

Le souci dans votre code est à la ligne 70, je pense, RequestBody.create(JSON_TYPE, c). Je pense que vous vouliez utiliser un FormBuilder ! Ou sinon c’est du côté serveur. Avez-vous essayer avec un client REST ? Comment vous tester le contenu dans le script Inscription.php, vous pouvez donné le code associé ?

Exemple, utilisation :

1
2
3
        Builder formBody = new Builder();
        formBody.add("title", "foo");
        formBody.build();

Un exemple complet de code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package org.hugo.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {

    void post(String url) throws IOException {

        RequestBody formBody = new FormBody.Builder()
                .add("title", "foo")
                .add("body", "bar")
                .add("userId", "1")
                .build();

        Request request = new Request.Builder()
                .url(url)
                .method("POST", formBody)
                .build();
        OkHttpClient client = new OkHttpClient();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("", "", e);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                // Affiche la réponse
                Log.e("", "Coucou : "+response.body());
            }
        });

    }

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

        try {
            post("http://jsonplaceholder.typicode.com/posts");
        } catch (IOException e) {
            Log.e("", "", e);
        }

    }
}

Édité par Hugo

Développeur d’application Android - Clé PGP

+1 -0
Auteur du sujet

Merci beaucoup pour votre très long message !

En fait, après plusieurs heures de tests et d’acharnement, j’ai fini par trouvé la solution par moi même (et avec l’aide de la doc aussi :P) juste avant que vous ne postiez votre réponse !

Pour ceux qui tomberont sur ce post plus tard et qui seront dans le même cas que moi, Hugo a parfaitement raison, c’est ma ligne 70 qui n’allait pas, et il a donné la solution complète par la suite (je n’ai pas testé, mais je suis certain que ça fonctionne).

Pour faire mes tests, je changeais simplement les variables $_POST['...'] en $_GET[’…’] dans mon code php et j’essayais bêtement avec un navigateur (en faisant passer les variables par l’URL donc).

Merci encore pour cette réponse très clair et détaillée qui en aidera beaucoup d’autres je pense !

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte