Bonjour all,

J'essaye de récupérer le contenu d'un fichier json en local. Voici mon code :

$http.get("js/data/HistoireData.json")
                    .success(function(data, status) {
                        factory.hs = data;
                        $timeout(function() {
                            deferred.resolve(factory.hs);
                        }, 1500);

                    })
                    .error(function(data, status) {
                        factory.hs = false;
                        deferred.reject('Impossible de récupérer les données ' + status);
                    });

Le soucis c'est que ça marche via un navigateur web PC (Firefox, Google Chrome ...) même si ça m'affiche un message de ce style :
" L'utilisation d'XMLHttpRequest de façon synchrone sur le fil d'exécution principal est obsolète à cause de son impact négatif sur la navigation de l'utilisateur final. Consulter http://xhr.spec.whatwg.org/ pour plus d'informations. "

MAIS, Le problème c'est que ça marche pas quand je teste l'application sur mon téléphone Android (ça passe à error avec le status 0).

La question est simple : Pourquoi :'( ? Et comment je corrige ça ?

Merci d'avance :)

Très bonne journée.

27 réponses


joshow
Auteur
Réponse acceptée

J'ai trouvé une solution un peu de bidouillage mais ça rejoint ce que je veux faire. Là voici :

1 Charger le fichier à récupérer dans le fichier index.html (le fichier principal de l'appli mobile). Le .json à la fin c'est plus pour de la compréhension car c'est une simple variable string qui est déclaré.

<script type="text/javascript" src="js/DATA/Musique.json"></script>

2 Aller dans le fichier (ici Musique.json) et déclarer une variable

Vu que j'avais du JSON sur plusieurs lignes j'ai préféré remixé dans ce style là :

Musique = ' ['
+ ' { '
+ ' "id": 1,'
+ ' "title": "Jeanette Strong - Velit sunt elit duis quis consectetur officia proident mollit mollit dolore excepteur",'
+ ' "category": 4'
 + ' },'
+ ' { '
+ ' "id": 2,
+ ' "title": "Oneal Mullins - Laboris quis quis velit officia elit dolore incididunt reprehenderit eiusmod aliqua sunt aliquip incididunt",'
+ ' "category": 1'
+ ' },'
...

3 La variable est déclarée (ici c'est Musique), il faut donc l'utiliser

factory.ms = JSON.parse(Musique);

Et voilà !! C'est vraiment barbare mais au moins toutes les données sont chargées au début (moi ça peut convenir car ça va être du 500 Ko GRAND MAXI).

Vous en pensez quoi ?

Salut,

Ajoute un slash devant ton url ;)

joshow
Auteur

Salut !

Merci pour ta réponse :). Je teste ça d'ici 5 minutes.

joshow
Auteur

@shinix : Non c'est exactement le même problème. J'ai franchement pensé que ça pouvait le faire lol.

Arf, je sais plus comme ça mais sinon essaie "./" (avec le point avant). J'avais eu ce soucis et c'était soit avec le slash soit avec le point slash que je l'avais résolu.

joshow
Auteur

Ok :), je réessaye. Merci encore !

joshow
Auteur

@sinix que ça soit "./..." ou "/....", ça m'affiche la même erreur (càd au status 0).
Ha la la :/

joshow
Auteur

En fait tu es forcément sur la bonne piste car quand je fais une requête de type HEAD sur une autre URL en local sur un autre fichier existant ça me produit le même problème.
Mais quoi mettre dans l'URL roooo :X

joshow
Auteur

Il faudrait utiliser $location pour avoir une URL " propre " non ?

J'ai du mal à comprendre ce que tu veux faire.
tu veux récupérer un fichier qui est sur le téléphone Android ?
comment est-il arrivé là ?

joshow
Auteur

Salut !

Alors désolé si je suis pas clair. Mais, en fait, je veux récupérer l'URL d'une ressource (mp3, JSON, XML ...) localement mis dans le dossier de mon application (exactement c'est dans "NOM-APPLICATION/dossiers-ressources/"). Et le problème c'est que j'ai du mal à mettre les bonnes URL des ressources : ça ne marche que quand je teste l'appli via un navigateur PC, ça ne marche pas quand je suis sur mobile.

J'ai été clair ? lol

Merci encore àtous !

Non c'est pas clair du tout
tu utilises une application Android ou bien tu accèdes à un site via le navigateur ?

joshow
Auteur

Via le navigateur, y'a pas de prob sur l'accès aux ressources (l'URL est bien bonne donc).
MAIS, via le navigateur Android, je n'arrive pas accéder aux ressources.

Ah c'est depuis le navigateur Android, j'ai cru que tu parlais d'une app android.

Du coup, tu as testé sur plusieurs navigateur android ? en navigation privée aussi ? (des fois que^^)

joshow
Auteur

En fait j'utilise cordova pour déployer une appli Android. Mais l'appli est en fait un site web lol.

Je galère simplement à mettre " la bonne URL " pour accéder à mon dossier d'application :'(.

Ah ouai donc c'est bien une app mais hybride.
Question basique mais toujours à vérifier^^ :

  • as-tu vérifier les majuscules/minuscules dans le chemin de direction du fichier et le fichier.
  • es-tu bien dans "www/"
  • as-tu refait un build après modification ? (tu peux aussi aller dans /platforms/android/ et la je sais plus dans quel dossier tu as une copie de ton dossier "www" vérifie si ton fichier json est bien dedans.
  • as-tu essayé un test basique du style http.get() -->success = alert('ça marche') et error-> alert('ça marche pas') et compiler comme ça pour voir si avec un simple http.get sans chichi ça fonctionne ?

C'est des questions basique mais importante à poser^^

joshow
Auteur

as-tu vérifier les majuscules/minuscules dans le chemin de direction du fichier et le fichier.
oui
es-tu bien dans "www/"
le fichier index.html (le seul qui est en fait en action pour le navigateur) est bien dans www/
as-tu refait un build après modification ? (tu peux aussi aller dans /platforms/android/ et la je sais plus dans quel dossier tu as une copie de ton dossier "www" vérifie si ton fichier json est bien dedans.
lol :p. J'ai vérifié ça car au départ je me lançais dans cette piste :X
as-tu essayé un test basique du style http.get() -->success = alert('ça marche') et error-> alert('ça marche pas') et compiler comme ça pour voir si avec un simple http.get sans chichi ça fonctionne ?
yes je l'ai déjà essayé comme le montre le premier post de ce forum

Plus j'en parle et plus je suis persuadé que le navigateur Android ne reconnaît pas mes " url relatives " donc peut-être faut-il utiliser une " url absolue " via une API Cordova ou même via AngularJS ?

Encore MERCI :). C'est vraiment bloquant alors que ça a l'air d'être un problème ridicule :'(.

Mais en faite je sais pas si on est sur la même longueur xD.

Ton fichier json est bien DANS l'application et non sur le téléphone ?

M'enfin après quelques investigations, essaie voir ça comme url : /android_asset/www/js/data/HistoireData.json

tu utilises un framework pour coder ton app ? (genre Ionic ou autre ?)
par ex. sur Ionic tu peux définir :

var url = "";
if(ionic.Platform.isAndroid()){
    url = "/android_asset/www/";
}
joshow
Auteur

Ton fichier json est bien DANS l'application et non sur le téléphone ?
Exact tu as raison !

tu utilises un framework pour coder ton app ? (genre Ionic ou autre ?)
J'utilise AngularJS donc dur d'utiliser ton code :X. Comment je pourrais l'adapter à ce que j'utilise ?

MERCI ENCOREEE !

Bah tout simplement :

$http.get("/android_asset/www/js/data/HistoireData.json")
                    .success(function(data, status) {
                        factory.hs = data;
                        $timeout(function() {
                            deferred.resolve(factory.hs);
                        }, 1500);

                    })
                    .error(function(data, status) {
                        factory.hs = false;
                        deferred.reject('Impossible de récupérer les données ' + status);
                    });

test déjà comme ça si ça marche sur Android, après si ça marche on va l'adapter pour une utilisation sur téléphone et sur navigateur :)

En fait tu veux charger une resource à partir d'une webview (composant web dans une appli Android)
essaye "file:///android_asset/www/js/data/HistoireData.json"
j'ai pas testé mais j'ai googlé
voir ici

joshow
Auteur

Merci énormément pour vos deux réponses :) c'est trop cool.
Je resterai ce soir car mon ordi bugue là lol

joshow
Auteur

Désolé j'ai eu des probs, je vais essayer de tester maintenant !

joshow
Auteur

J'eai essayé ces 3 trucs (avec success / error) :

$http.head("/android_asset/www/js/data/Musique.json") ...
$http.head("./js/data/Musique.json") ...
$http.head("file:///android_asset/www/js/data/Musique.json")...

Les 3 renvoient une erreur de status 0 :/

Salut, as-tu simplement essayé le code que je t'ai donné l'autre jour ?

$http.get("/android_asset/www/js/data/HistoireData.json")
                    .success(function(data, status) {
                        factory.hs = data;
                        $timeout(function() {
                            deferred.resolve(factory.hs);
                        }, 1500);

                    })
                    .error(function(data, status) {
                        factory.hs = false;
                        deferred.reject('Impossible de récupérer les données ' + status);
                    });
joshow
Auteur

Oui je l'ai essayé entre temps et même soucis (erreur de status 0). :/

PS : Désolé j'avais oublié de le préciser !

joshow
Auteur

Encore la même chose pour les 5 (erreur de status 0).
HistoireData.json et Musique.json sont placés dans le même répertoire donc c'est la même chose.
C'est un truc bidon comme ça qui bloque tout, c'est chaud lol.

$http.head("/android_asset/www/js/data/Musique.json")
$http.head("/assets/www/js/data/Musique.json")
$http.head("./js/data/Musique.json")
$http.head("file:///android_asset/www/js/data/Musique.json")
$http.head("http://" + document.domain + "/Children/www/js/data/Musique.json")