IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Problème pour récupérer JSON et parsing


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 78
    Par défaut Problème pour récupérer JSON et parsing
    Salut,

    J'ai une bdd web qui contient une table images , contenant elle-même 3 colonnes (id,lien et note). A côté de ceci j'ai un script php récuperant la ligne de la dernière image ajoutée à la bdd pour ensuite l'encoder en JSON :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    	mysql_connect("host","username","mdp"); //remplacé par les vraies valeurs
    	mysql_select_db("appsplea_f");
    	$q = mysql_query("SELECT * FROM images;");
    	$c = mysql_num_rows($q);
    	$q = mysql_query("SELECT * FROM images WHERE id ='".$c."';");
    	while($row=mysql_fetch_assoc($q)){
    		$output[]=$row;
    	}
    	echo(json_encode($output));
    	mysql_close();
    ?>
    Ce code fonctionne puisqu'il retourne :

    [{"id":"3","lien":"\/home\/appsplea\/3.jpg","note":"0"}]
    Mon but est maintenant de récupérer ces données JSON depuis mon application android pour ensuite recuperer les valeurs du champ "lien" et "note".

    J'ai suivi plusieurs tutoriels mais sans réussite. Le dernier en date étant celui-ci : http://preprod-orange-tunisie.makina...n-dans-android

    Dans la méthode onCreate() de mon activité j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
            String url = "ici j'ai mit l'url de mon script php";
            JsonParser jParser = new JsonParser ();
            String json = jParser.getJSONFromUrl(url);
            try {
    	        JSONArray t = new JSONArray(json);
    	        String test="";
    	        for(int i = 0; i < t.length(); i++){
    		        JSONObject t2 = t.getJSONObject(i);
    		        test += t2.getString(TAG_ID);
    	        }
    	        bandeau.setText(test);
            } catch (JSONException e){
            e.printStackTrace(); 
            }
    Et la classe JsonParser contient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
     
    public class JsonParser {
     
    	static InputStream is = null;
    	static JSONObject jObj = null;
    	static String json = "";
     
    	// Constructeur de notre classe
    	public JsonParser() {
    	}
     
    	public String getJSONFromUrl(String url) {
    		try {
    			// faire appel à defaultHttpClient
    			DefaultHttpClient httpClient = new DefaultHttpClient();		
    			HttpPost httpPost = new HttpPost(url);		
    			HttpResponse httpResponse = httpClient.execute(httpPost);		
    			HttpEntity httpEntity = httpResponse.getEntity();			
    			is = httpEntity.getContent();			
    		} catch (UnsupportedEncodingException e) {			
    			e.printStackTrace();			
    		} catch (ClientProtocolException e) {			
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
     
    		try {	
    			BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);			
    			StringBuilder sb = new StringBuilder();			
    			String line = null;			
    			while ((line = reader.readLine()) != null) {			
    				sb.append(line + "\n");		
    			}
    			is.close();		
    			json = sb.toString();		
    		} catch (Exception e) {		
    			Log.e("Buffer Error", "Error converting result " + e.toString());	
    		}
     
    		try {
     
    			jObj = new JSONObject(json);
    		} catch (JSONException e) {
    			Log.e("JSON Parser", "Error parsing data " + e.toString());
    		}
    		return jObj.toString();
    	}
    }
    Seulement voilà mon application plante dés qu'elle arrive sur l'activité en question. Avec les erreurs suivants dans le logcat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    02-16 18:05:44.845: E/AndroidRuntime(16498): 	at java.net.InetAddress.getAllByName(InetAddress.java:220)
    02-16 18:05:44.845: E/AndroidRuntime(16498): 	at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
    02-16 18:05:44.845: E/AndroidRuntime(16498): 	at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    02-16 18:05:44.845: E/AndroidRuntime(16498): 	at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    02-16 18:05:44.845: E/AndroidRuntime(16498): 	at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
    02-16 18:05:44.845: E/AndroidRuntime(16498): 	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
    02-16 18:05:44.845: E/AndroidRuntime(16498): 	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
    02-16 18:05:44.845: E/AndroidRuntime(16498): 	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
    02-16 18:05:44.845: E/AndroidRuntime(16498): 	at com.apps.galerie.JsonParser.getJSONFromUrl(JsonParser.java:33)
    02-16 18:05:44.845: E/AndroidRuntime(16498): 	at com.apps.galerie.MainActivity.onCreate(MainActivity.java:57)
    02-16 18:05:44.845: E/AndroidRuntime(16498): 	at android.app.Activity.performCreate(Activity.java:4533)
    02-16 18:05:44.845: E/AndroidRuntime(16498): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053)
    02-16 18:05:44.845: E/AndroidRuntime(16498): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934)
    En sachant que j'ai bien déclarer la ligne "<uses-permission android:name="android.permission.INTERNET"/>" dans le manifest de l'application.

    Voilà j'ai vraiment beaucoup de mal. Je tourne en rond et j'ai vraiment besoin d'aide. Aidez-moi s'il vous plait.

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Bonjour,

    Déjà... il manque des lignes du logcat !
    (en particulier celle avec le nom de l'exception, les causes, etc...)

    Ensuite....

    Le code du "JsonParser" est complètement ... hum... comment dire.... pourri ?
    En particulier la gestion des exceptions... plein de try/catch (un seul global suffirait), disparition complète des exceptions quand il y en a une (et continuation comme si de rien n'était, avec des NullPointerException à la clé du coup)... Aucune information passée à l'appelant comme quoi il y a eu justement un problème.... Réinvention de la roue pour transformer un HttpEntity en string (la fonction EntityUtils.toString() suffit), etc... etc....

    D'ailleurs JsonParser.getJSONFromUrl ne renvoit pas du JSON, mais une string... donc devrait s'appeler getStringContentFromUrl().... Il n'y a d'ailleurs aucun parsing JSON dans JsonParser (donc pourquoi l'appeler JsonParser ?)

    Pour finir, le code en question *NE PEUT PAS* être appelé depuis le thread UI (comme dans le onCreate par exemple). Il faut l'appeler d'une tâche à part....

    Je colle ici un bout de code que j'avais proposé pour une FAQ:

    Suite à de très nombreux messages (et utilisations de tutoriaux très limites du web), voici un code "correct" (et réutilisable) pour lire du JSON....

    Fichier JSONObjectTask.java
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    93
     
    /**
     * 
     */
    package ....; // remplacez par le votre !
     
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpUriRequest;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
    import org.json.JSONObject;
     
    import android.os.AsyncTask;
     
    /**
     * 
     */
    public class JSONObjectTask extends AsyncTask<HttpUriRequest, Void, JSONObject> {
     
        /**
         * L'interface d'écoute des resultats.
         */
        public static interface OnJSONObjectResult
        {
            /**
             * Sera appelé quand l'objet JSON sera recu.
             * @param res
             */
            public  void    onJSONObjectResult(JSONObject res);
            /**
             * Sera appelé quand une erreur a eu lieu pendant la requête.
             * @param error
             */
            public  void    onJSONRequestFailure(Throwable error);
        }
     
        private OnJSONObjectResult callback;
        private Throwable error;
     
        /**
         * Définit le callback pour les résultats.
         * @param cb L'interface de callback utiliser.
         */
        public JSONObjectTask(OnJSONObjectResult cb)
        {
            this.callback= cb;
        }
     
        /* (non-Javadoc)
         * @see android.os.AsyncTask#doInBackground(Params[])
         */
        @Override
        protected JSONObject doInBackground(HttpUriRequest ... params) {
            JSONObject ret = null;
            try {
                HttpClient localClient = getHttpClient();
                HttpResponse response = null;
                for (HttpUriRequest request : params)
                    response = localClient.execute(request);
                HttpEntity entity = (response == null) ? null : response.getEntity();
                String entityStr = (entity == null) ? null : EntityUtils.toString(entity);
                ret = (entityStr == null) ? null : new JSONObject(entityStr);
            } catch (Throwable t) {
                Log.w("JSONTask","Error while retrieving JSON",t);
                this.error = t;
            }
            return ret;
        }
     
        /**
         * Surchargez cette fonction pour créer le lien vers un autre client, ou pour ajouter des paramètres au client (agent-string / timeouts / ...).
         * @return HttpClient
         */
        protected HttpClient getHttpClient() {
            return new DefaultHttpClient();
        }
     
        /* (non-Javadoc)
         * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
         */
        @Override
        protected void onPostExecute(JSONObject result) {
            if (this.callback != null) {
                if (this.error != null)
                    this.callback.onJSONRequestFailure(this.error);
                else
                    this.callback.onJSONObjectResult(result);
            }
        }
     
    }

    L'utilisation est fort simple:
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    class MyActivity extends Activity implements JSONObjectTask.OnJSONObjectResult
    {
        public void onCreate(...)
        {
              HttpGet get = new HttpGet(URL);
              new JSONObjectTask(this).execute(get);
     
              // on peut pile-uper les requetes....
              HttpPost post = new HttpPost(URL);
              post.setEntity(... post data ...);
              new JSONObjectTask(this).execute(post, get);
        }
     
        public void onJSONObjectResult(JSONObject obj)
        {
             // ... on utilise l'objet ...
        }
     
        public void onJSONRequestFailure(Throwable t)
        {
             // ... on affiche l'erreur ....
        }
    }

    Si vous avez besoin d'un JSONArray.... dupliquez le fichier JSONObjectTask.java en JSONArrayTask.java, puis remplacez toutes les occurrences de "JSONObject" par "JSONArray" (replace all)....
    Et voila....

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 78
    Par défaut
    Merci! Par contre a la ligne 11 du deuxieme code jai pas bien saisi ce qu'il faut que je mette a la place de "...post data..." .

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Ben rien si il n'y a pas de paramètres au Post...
    Sinon, tout paramètre nécessaire (par exemple UrlEncoded name-pair values)...

    Attention, il me semble que ce qui vous interesse est la version JSONArray !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 78
    Par défaut
    Daccord , pouvez vous me donner un exemple concret avec ce que je veux faire. En reprenant le json posté dans mon premier message , comment est-ce que je peux recuperer par exemple le lien ? Ca me permettrai dy voir un peu plus clair quand au fonctionnement du code que vous m'avez fourni.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 78
    Par défaut
    Bonjour,

    Je sais que cette demande me fait passer pour quelqu'un qui veut qu'on lui mâche le travail , et aussi que vous n'avez pas forcément le temps pour ça. Seulement je travail sur mon application depuis un mois , et je tourne en rond pour récupérer ces données depuis maintenant deux semaines. Autrement dis je suis désespéré. J'ai déjà fait le tour d'à peu prêt tous les tutos sur le sujet ainsi que la plupart des sujets traitant de ça sur ce forum.
    Le code fournit ici me semble très propre mais c'est trop abstrait pour moi sans un exemple concret. Juste le fait de savoir comment récupérer la donnée "lien" , me permettrait de comprendre le fonctionnement du code et donc , comment récupérer tout le reste et je pourrai ENFIN avancer dans mon application.

    Je ne pensais que ce serait si compliqué de récupérer les éléments d'une BDD externe. Aidez moi s'il vous plait , j'attends beaucoup de cette discussion.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 78
    Par défaut
    Bonsoir,

    Je me permet de remonter ce topic afin d'éviter d'en créer un nouveau pour pas grand chose.
    J'ai maintenant besoin d'utiliser le Post afin d'envoyer des données à mon script php pour récuperer les données. L'idée est de recupérer les caractéristiques de l'image correspondant à l'id passé en paramètres.

    J'utilise donc le code fournit plus haut dans ce topic , et j'ajoute ceci à mon activité principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    nameValuePairs.add(new BasicNameValuePair("id","1"));
    try{
        	HttpGet get = new HttpGet(url2);
        	HttpPost post = new HttpPost(url2);
        	post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        	new JSONArrayTask(this).execute(post,get);
    }catch(Exception e){
        			//
        		}
    Je n'ai aucune erreur ou plantage quand je lance mon activité , mais aucune image ne s'affiche.
    J'ai bien évidement changé mon script php en conséquence avec un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $q = mysql_query("SELECT * FROM images WHERE id ='".$_REQUEST['id']."';");
    Je pense que j'appel très mal le traitement , j'ai un peu essayé de bidouiller mais sans succès.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 78
    Par défaut
    Si tu passe par là nicroman , j'ai toujours pas réussi ...

  9. #9
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Déjà il faut savoir... faire un "GET" ? (HttpGet) ou un "POST" ? à priori, pas les deux en même temps !

    En prime les paramètres ne se passent pas obligatoirement de la même manière entre GET (obligatoirement dans l'URL) et POST (peuvent être en payload du post, si le contenu de celui est Form-Encoded).

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 78
    Par défaut
    D'accord donc moi j'ai besoin uniquement de POST vu que ce que je veux c'est récupérer l'image correspondant à l'ID que j'envoie à mon script php en paramètres.

    Donc je vire le HttpGet si j'ai bien saisi. Mais maintenant , je comprends pas bien comment passer ces paramètres avec POST? Que veux dire "en payload du post" ?

  11. #11
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Heu... si le but est juste de récupérer des données, pas modifier les données coté serveur, c'est GET qu'il faut utiliser (les proxys pourront alors 'cacher' la réponse à loisir)... POST c'est uniquement pour rajouter des données... PUT pour les modifier....


    GET n'a pas de "données"... donc le simple header HTTP suffit pour faire la requete: grosso modo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    GET /monchemin/monobject.php?param1=xxxx&param2=yyyy HTTP/1.1
    server: monserver.com
    if-modified-Since: 2012/12/13T12:13:15Z
    accept: image/*
    Ceci est fait par "HttpGet"... les paramètres sont à passer directement dans l'URL...

    POST peut avoir des "données" à deux endroits... dans l'URL (comme le GET ci-dessus), mais aussi dans le "corps" de la requête (après les headers) par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    POST /monchemin/monobject.php?param1=xxxx HTTP/1.1
    server: monserver.com
    accept: image/*
    content-type: x/url-encoded
    content-length: 11
     
    param2=yyyy
    Ceci est fait par "HttpPost"... les paramètres peuvent être passés dans l'URL, mais aussi dans l'Entité attachée à la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    monPost.setEntity(new UrlEncodedFormEntity(...));
    Attention coté PHP, les deux styles de paramètres ne se récupèrent pas de la même manière.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. LDAP - Problème pour récupérer l'uid
    Par sangei dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 16/11/2005, 13h56
  2. Réponses: 10
    Dernier message: 16/11/2005, 08h33
  3. problème pour récupérer une valeur dans ma bd (débutante)
    Par auryn111 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/08/2005, 17h49
  4. [TWebbrowser] Probléme pour récupérer la source
    Par Gauth dans le forum Web & réseau
    Réponses: 8
    Dernier message: 09/04/2005, 15h57
  5. Problème pour récupérer la clé primaire
    Par caramel dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/04/2003, 13h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo