Partage
  • Partager sur Facebook
  • Partager sur Twitter

Android utilisation de retrofit

Sujet résolu
    13 septembre 2017 à 12:27:39

    Bonjour,

    Je viens de me mettre à l'android. J'aimerai connecter mon application à une base de donnée. En cherchant sur le net j'ai trouvé la bibliothèque retrofit. Cependant, je ne dois pas savoir comment l'utiliser car mon application ne fonctionne pas avec retrofit. Voici les fichiers de l'application :

    Le script php :

    <?php
    
        try
    
        {
    
            $bdd = new PDO('mysql:host=localhost;dbname=monappli;charset=utf8', 'root', 'root');
    
        }
    
        catch(Exception $e)
    
        {
    
                die('Erreur : '.$e->getMessage());
    
        }
    
    
    
        $req1 = $bdd->query('SELECT id,pseudo FROM membres');
    
        $output = $req1->fetchAll(PDO::FETCH_ASSOC);
    
        echo(json_encode($output));
    
    ?>

    Le retour du script :

    [{"id":"1","pseudo":"toto"}]

    Le code de l'activité :

    import android.app.Activity;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;
    
    
    import retrofit2.Call;
    import retrofit2.Retrofit;
    import retrofit2.Response;
    import retrofit2.converter.gson.GsonConverterFactory;
    import retrofit2.http.GET;
    import retrofit2.Callback;
    
    
    public class inscription extends Activity {
    
        interface script {
            @GET("script.json")
            Call<membresbdd> membres();
        }
    
    
        Button inscription = null;
        TextView pseudo=null;
        TextView id =null;
    
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_inscription);
    
            inscription = (Button) findViewById(R.id.inscription);
            pseudo = (TextView) findViewById(R.id.pseudo);
            id = (TextView) findViewById(R.id.id);
    
            // On attribue un listener adapté aux vues qui en ont besoin
            inscription.setOnClickListener(inscriptionListener);
        }
    
        // Uniquement pour le bouton "inscription"
        private OnClickListener inscriptionListener = new OnClickListener() {
            @Override
            public void onClick(View v) {
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("http://monadresseip/")
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
    
            script service = retrofit.create(script.class);
            service.membres().enqueue(new Callback<membresbdd>() {
                @Override
                public void onResponse(Call<membresbdd> call, Response<membresbdd> response) {
                    Toast.makeText(getApplicationContext(), String.format("connexion OK"), Toast.LENGTH_SHORT).show();
                    // response.body();
                    Log.e("Error Code", String.valueOf(response.code()));
                    Log.e("Error Body", response.errorBody().toString());
    
                }
                @Override
                public void onFailure(Call<membresbdd> call, Throwable t) {
                    Toast.makeText(getApplicationContext(), String.format("ECHEC"), Toast.LENGTH_SHORT).show();
                    Log.e("error throwable", t.getMessage());
    
                }
            });
           }  
    }




    Je voudrais recuperer l'id et le pseudo et les mettre dans les textview id et pseudo.

    L'erreur vient peut etre du fait qu'il faut mettre "script.php" au lieu de "script.json" dans le @GET mais dans ce cas on ne passe plus dans onresponse mais dans onfailure.

    Si je laisse "script.json", on passe dans le onresponse mais response.tostring() renvoit code=404 et message=not found.

    De plus, si je met response.body(), l'application plante.

    Je ne sais pas d'ou vient le problème.

    Pourriez vous m'éclairer s'il vous plait ?


    -
    Edité par Sybess 13 septembre 2017 à 12:28:50

    • Partager sur Facebook
    • Partager sur Twitter
      13 septembre 2017 à 14:58:14

      Salut ;). Déjà oui il faut que tu mettes le nom "script.php". Ensuite, tu dis que tu passes dans le onFailure ? Tu reçois quelle exception ?

      Postes également ta classe membresbdd histoire de voir. T'as essayé avec juste une "ResponseBody" a la place de ta classe membresbdd ? Ca te permettra juste de voir si c'est une erreur lorsque tu parses ta réponse. Ca te permettra peut-être de t'aiguiller.

      -
      Edité par IpProg 13 septembre 2017 à 14:59:16

      • Partager sur Facebook
      • Partager sur Twitter
        13 septembre 2017 à 16:09:05

        Bonjour ipProg,

        J'ai mis script.php Je passe bien dans le onfailure.

        L'erreur est : java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

        Voici ma classe membresbdd :

        import com.google.gson.annotations.Expose;
        import com.google.gson.annotations.SerializedName;
        
        public class membresbdd {
        
            @SerializedName("id")
            @Expose
            private String id;
            @SerializedName("pseudo")
            @Expose
            private String pseudo;
        
            public String getId() {
                return id;
            }
        
            public void setId(String id) {
                this.id = id;
            }
        
            public String getPseudo() {
                return pseudo;
            }
        
            public void setPseudo(String pseudo) {
                this.pseudo = pseudo;
            }
        }


        J'ai pas compris comment remplacer ma classe par responseBody.

        Tu veux que je change les call<membresbdd> par ResponseBody ou changer call<membresbdd> par call<ResponseBody> ?

        -
        Edité par Sybess 13 septembre 2017 à 16:11:32

        • Partager sur Facebook
        • Partager sur Twitter
          13 septembre 2017 à 17:32:34

          Essayes en changeant ton call<membresbdd> par call<List<membresbdd>> . Ton json renvoie un Tableau et comme indiqué ça lui convient pas des masses :D. Du coup, là tu devrais être bon ;)

          • Partager sur Facebook
          • Partager sur Twitter
            13 septembre 2017 à 18:39:58

            J'ai bien changé call<membresbdd> par call<List<membresbdd>> mais maintenant c'est l'application qui plante.

            dans le logcat il y a ceci :

            Error Code: 200 (donc on passe dans le onresponse)

            AndroidRuntime: Shutting down VM

            /AndroidRuntime: FATAL EXCEPTION: main

                                                                          Process: mon.appli, PID: 32014

                                                                          java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference

                                                                              at mon.appli.inscription$3.onResponse(inscription.java:140)

                                                                              at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)

                                                                              at android.os.Handler.handleCallback(Handler.java:739)

                                                                              at android.os.Handler.dispatchMessage(Handler.java:95)

                                                                              at android.os.Looper.loop(Looper.java:145)

                                                                              at android.app.ActivityThread.main(ActivityThread.java:5951)

                                                                              at java.lang.reflect.Method.invoke(Native Method)

                                                                              at java.lang.reflect.Method.invoke(Method.java:372)

                                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)

                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)

            -
            Edité par Sybess 13 septembre 2017 à 18:45:32

            • Partager sur Facebook
            • Partager sur Twitter
              14 septembre 2017 à 14:30:40

              C'est pas a cause de ton log  que ça plante ? Tu demandes un errorBody() sur ta response mais tu reçois un status code 200 ( donc ta réponse est bonne ). Vire ça et testes directement le body(). Tu peux mettre des points d'arrêt aussi et lancer en mode debug ton application pour avoir un retour plus précis.
              • Partager sur Facebook
              • Partager sur Twitter
                14 septembre 2017 à 15:44:33

                Oui en effet c'était à cause du log. Maintenant j'arrive à me connecter à la base de donnée.

                Est ce que tu saurais comment faire pour afficher seulement les pseudos dans des textView ?

                • Partager sur Facebook
                • Partager sur Twitter
                  14 septembre 2017 à 17:21:08

                  Regardes ce que te renvoies ta méthode response.body(). Normalement ça devrait être du type membresbdd donc t'as plus qu'a utiliser ton getter ;). Enfin après c'est une liste par contre donc pour afficher le premier par exemple, tu fais response.body().get(0).getPseudo();

                  Si tu veux afficher une liste, il va falloir que tu te renseignes sur les recyclerView. Il faudra que tu crées un adapter qui sera chargé de créer une vue en fonction des items que tu lui fournira.

                  -
                  Edité par IpProg 14 septembre 2017 à 17:21:15

                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 septembre 2017 à 17:34:47

                    Ok ce que tu me dis fonctionne a merveille.

                    Merci beaucoup pour ton aide :)

                    dernière petite question est ce qu'il existe une fonction pour connaitre le nombre de ligne de la liste ?

                    -
                    Edité par Sybess 14 septembre 2017 à 17:38:19

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Android utilisation de retrofit

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown