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 :

Exception parseur JSON, fichier php sur vrai site


Sujet :

Android

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 17
    Par défaut Exception parseur JSON, fichier php sur vrai site
    Bonjour j'utilise actuellement un parseur JSON pour un formulaire et afin stocker donc les données sur une base, seulement, lorsque j'utilisais ma base locale les données rentrait sans problèem depuis le formulaire avc l'application Android, mais en utilisant l'url d'un vrai site web (ou j'ai les accès et bien enregistré les fichiers PHP, j'ai le droit à une exception du parseur :

    Error parsing data org.json.JSONException: End of input at character 0 of

    J'ai bien vérifié les fichiers php sont bien dispo sur le nom du site, et j'ai même tappé l'url que j'utilise pour entrer les données du formulaire sur mon navigateur, j'ai bien le fichier PHP..

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Il semble que ton application Android n'arrive pas à lire le fichier.

    Potentiellement un problème de droit au niveau de l'application . As-tu déclarer cela :
    <uses-permission android:name="android.permission.INTERNET" />
    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 17
    Par défaut
    Merci pour ton aide, en effet l'autorisation était déjà présente,

    le code JAVA de mon parseur:
    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
    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
    public class JSONParser {
     
        static InputStream is = null;
        static JSONObject jObj = null;
        static String json = "";
     
        // constructor
        public JSONParser() {
     
        }
     
        // function get json from url
        // by making HTTP POST or GET mehtod
        public JSONObject makeHttpRequest(String url, String method,
                List<NameValuePair> params) {
     
            // Making HTTP request
            try {
     
                // check for request method
                if(method == "POST"){
                    // request method is POST
                    // defaultHttpClient
                    DefaultHttpClient httpClient = new DefaultHttpClient();
                    HttpPost httpPost = new HttpPost(url);
                    httpPost.setEntity(new UrlEncodedFormEntity(params));
     
                    HttpResponse httpResponse = httpClient.execute(httpPost);
                    HttpEntity httpEntity = httpResponse.getEntity();
                    is = httpEntity.getContent();
     
                }else if(method == "GET"){
                    // request method is GET
                    DefaultHttpClient httpClient = new DefaultHttpClient();
                    String paramString = URLEncodedUtils.format(params, "utf-8");
                    url += "?" + paramString;
                    HttpGet httpGet = new HttpGet(url);
     
                    HttpResponse httpResponse = httpClient.execute(httpGet);
                    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 parse the string to a JSON object
            try {
                jObj = new JSONObject(json);
            } catch (JSONException e) {
                Log.e("JSON Parser", "Error parsing data " + e.toString());
            }
     
            // return JSON String
            return jObj;
     
        }
    }

  4. #4
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Quelle est l'erreur complète ?
    Que contient la variable que tu tentes de parser ? Quel est le retour ? Est-ce que la requête passe bien ?
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 17
    Par défaut
    J'essaie de passer un requête POST, je trouve vraiment assez bizarre ce qui se passe car sur ma base en locale avec les même fichiers php(quasiment) les données rentrent et le parseur n'a pas de soucis.
    En mettant l'emplacmeent du fichier PHP qui lui est stocké sur le site (qui est le même avec d'autre identitfiants de connexion) j'ai le droit a : End of input at character 0 of
    La requête ne passe pas du tout je pense..
    J'ai aussi vérifié que le fichier était accessible depuis le naviguateur, et bien oui, et je lis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"success":0,"message":"champs requis non remplis"}

  6. #6
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Quelle est l'erreur complète bis ?
    Tes catch sont mauvais, remplace tes Log.e(TAG, message) par des Log.e(TAG, message, exception) (soit transformer Log.e("JSON Parser", "Error parsing data " + e.toString()); en Log.e("JSON Parser", "Error parsing data ", e);), tu auras ainsi les vraies messages d'exceptions.
    Évite aussi les catch (Exception), souvent, ce n'est pas ce qui est voulu et cela masque des erreurs qui devraient remonter.
    J'espère aussi que tu fais cet appel dans une tâche asynchrone (AsyncTask, thread...), sinon, tu vas crasher sur les Android 3.0+.

    Sur cette ligne-là jObj = new JSONObject(json);, tu parses potentiellement une ligne vide si l'appel réseau a foiré, d'où l'exception.

    Tu accèdes à la page via le navigateur, OK, ça enlève une vérification à réaliser. Quel retour as-tu dans ton application ?
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 17
    Par défaut
    J'ai modifié pour les logs , merci de ta réponse.

    L'erreur reste cependant la même:
    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
    03-15 14:18:44.059: E/JSON Parser(24556): Error parsing data 
    03-15 14:18:44.059: E/JSON Parser(24556): org.json.JSONException: End of input at character 0 of 
    03-15 14:18:44.059: E/JSON Parser(24556): 	at org.json.JSONTokener.syntaxError(JSONTokener.java:450)
    03-15 14:18:44.059: E/JSON Parser(24556): 	at org.json.JSONTokener.nextValue(JSONTokener.java:97)
    03-15 14:18:44.059: E/JSON Parser(24556): 	at org.json.JSONObject.<init>(JSONObject.java:155)
    03-15 14:18:44.059: E/JSON Parser(24556): 	at org.json.JSONObject.<init>(JSONObject.java:172)
    03-15 14:18:44.059: E/JSON Parser(24556): 	at com.test.JSONParser.makeHttpRequest(JSONParser.java:93)
    03-15 14:18:44.059: E/JSON Parser(24556): 	at com.test.ContactFeeActivity$ContactFee.doInBackground(ContactFeeActivity.java:115)
    03-15 14:18:44.059: E/JSON Parser(24556): 	at com.test.ContactFeeActivity$ContactFee.doInBackground(ContactFeeActivity.java:1)
    03-15 14:18:44.059: E/JSON Parser(24556): 	at android.os.AsyncTask$2.call(AsyncTask.java:288)
    03-15 14:18:44.059: E/JSON Parser(24556): 	at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    03-15 14:18:44.059: E/JSON Parser(24556): 	at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
    03-15 14:18:44.059: E/JSON Parser(24556): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    03-15 14:18:44.059: E/JSON Parser(24556): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    03-15 14:18:44.059: E/JSON Parser(24556): 	at java.lang.Thread.run(Thread.java:841)
    Dans l'application, au moment de l'envoi j'ai un force close.Et oui tout ça est bien dans une Asynctask.

  8. #8
    Membre éprouvé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 129
    Par défaut
    Peut-tu afficher la valeur de ce que tu essai de parser ?

    Ta class qui sert pour parser les données json ?

  9. #9
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 17
    Par défaut
    Justement cette valeur est vide..

  10. #10
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Justement cette valeur est vide..
    Ben c'est justement le problème

    03-15 14:18:44.059: E/JSON Parser(24556): org.json.JSONException: End of input at character 0 of
    fait un try catch de JSonException sur ton obj = JsonObject(json);

    car sit u considère que ta valeur retourné peut être nulle alors il faut que tu le traite dans le parser JSON.

  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
    déjà remplace les method == par des method.equals()
    Au moins une requête sera faite.


    Ensuite vire ENTIEREMENT les try / catch, et colles en un autour de l'ensemble de la fonction (un bloc "try" correspond à dire: ok si il y a une erreur ici, je me debrouille pour en sortir, ce n'est pas le cas ici).
    Je ne suis pas complètement sur de la gestion des exceptions... une fonction "makeHttpRequest" qui renvoie un objet sans envoyer d'exception me semble problématique (comment l'appelant peut-il gérer les erreurs ?)

    Ensuite tu as:
    Un HttpClient, dont la durée de vie est un bloc try dans la fonction.
    Un membre InputStream (lié au HttpClient) dont la durée de vie est celle du parser... il y a obligatoirement un problème de conception.

    Pour finir... plutôt que de s'embêter avec tout le code de lecture de stream, utilise EntityUtils:


    Voici le code du parser "corrigé" par exemple:

    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
     
    public class JSONParser {
     
        public static final String   GET = "GET";
        public static final String   POST = "POST";
     
        // function get json from url
        // by making HTTP POST or GET mehtod
        public JSONObject makeHttpRequest(String url, String method, List<NameValuePair> params) throws IOException {
     
            HttpUriRequest  request;
     
            // Making HTTP request
             if (POST.equalsIgnoreCase(method)) {   // equals n'est pas == !!!
               HttpPost httpPost = new HttpPost(url);
               httpPost.setEntity(new UrlEncodedFormEntity(params));
               request = httpPost;
            } else if (GET.equalsIgnoreCase(method)) {
               String paramString = URLEncodedUtils.format(params, "utf-8");
               url += "?" + paramString;  // BIZARRE ! Et si l'url a *déjà* des paramètres ?
               request = new HttpGet(url);
            } else
               throw new IllegalArguementException(method+" is not a supported method !");   // on ne sait jamais !!!
     
            try {
               HttpClient httpClient = new DefaultHttpClient();
               HttpResponse response = httpClient.execute(request);
               HttpEntity entity = response.getEntity();
               String entityStr = EntityUtils.toString(entity);
               return new JSONObject(entityStr );
            } catch (IOException ioe) {
               throw ioe;
            } catch (Exception ex) {
               throw new IOException("Failed to retrieve data !",ex);
            }
    }

Discussions similaires

  1. [FTP] Gestion fichier PHP sur serveur FTP
    Par cdrik59 dans le forum Langage
    Réponses: 1
    Dernier message: 08/12/2006, 16h00
  2. Réponses: 7
    Dernier message: 09/08/2006, 20h45
  3. Lire un fichier vidéo sur mon site
    Par dolf13 dans le forum Langage
    Réponses: 6
    Dernier message: 28/07/2006, 19h21
  4. [Upload] Upload d'un fichier excel sur un site web
    Par oldscrout dans le forum Langage
    Réponses: 3
    Dernier message: 31/03/2006, 10h09
  5. explorateur fichier php sur windows 2003
    Par super-manu dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 09/02/2006, 14h42

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