Boucle pour tester la validiter d'un lien

Résolu/Fermé
louisgautier Messages postés 1632 Date d'inscription lundi 27 septembre 2010 Statut Membre Dernière intervention 13 janvier 2017 - Modifié par KX le 25/06/2016 à 14:52
louisgautier Messages postés 1632 Date d'inscription lundi 27 septembre 2010 Statut Membre Dernière intervention 13 janvier 2017 - 25 juin 2016 à 20:50
Bonjour,

Je travail avec l'api TheTvDbApi (pas très utile a savoir mais sait on jamais)

J'essaye d'obtenir une fiche série aléatoire, en fonction de leur id ( qui est sur 5 ou 6 chiffres)
J'ai donc crée un nombre aléatoire (j’essaye de me limiter car c'est une opération lourde dans un asyncTask apparemment)

Mais ensuite je sèche, car la plus par des id que j’obtienne retourne un 404 not found. Il faut donc absolument que je fasse une boucle pour tester l'id, si null, on recommence, sinon, je fait mon traitement.

protected String[] doInBackground(String... args) {

                //while (true){
                    r = new Random( System.currentTimeMillis());
                    r_id = 200000 + r.nextInt(300000);
                    rdm = String.valueOf(r_id);
                    try{
                        URL url = new URL("[http://thetvdb.com/api/706CFDB632CA5BB2/series/]"+rdm+"/fr.xml");
                        if (url.openConnection().toString().equals("HTTP_OK")){
                            try{
                                t = tvdb.getSeries(rdm, "fr");
                                Log.d("r_id", rdm);
                                data[0] = t.getSeriesName();
                                data[1] = t.getPoster();
                                Log.d("le titre", t.getSeriesName());
                                Log.d("banner", t.getPoster());
                                Log.d("titre", data[0]);
                                Log.d("poster", data[1]);
                                return data;
                                //r = new Random( System.currentTimeMillis());
                                //r_id = 200000 + r.nextInt(300000);
                                //rdm = String.valueOf(r_id);
                            }
                            catch (TvDbException e){
                                e.printStackTrace();
                            }
                            return data;
                        }
                        else {
                            //retour to doInBackground;
                            doInBackground();
                        }
                        return data;
                    }
                    catch (Exception e){
                        e.printStackTrace();
                    }
                    //return data;
               // }
                return data;
            }




Sauf que bah, ça marche pas !! doInBackground fait une dizaine de boucle et le AsyncTask crash (déjà je pense que j'en ferais un thread a par entière, mais plus tard)
Mais au final sur les 10 test, aucun id est valide alors..
Merci de m’éclairer de votre science !
A voir également:

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
25 juin 2016 à 15:16
Bonjour,

Ce que tu cherches à faire n'est pas viable, il faudrait d'abord que tu récupères une liste d'id valides avant d'en choisir aléatoirement un dans cette liste.

Par exemple tu récupères la liste des séries les plus récemment mis à jour avec https://api.thetvdb.com/updated/query?fromTime=...
Voir la documentation ici : https://api.thetvdb.com/swagger

Puis avec la liste d'ids obtenu tu fais :
List<Integer> ids = ...
int pos = r.nextInt(ids.size()); // entre 0 et ids.size()-1
int id = ids.get(pos);

Remarque : la manière dont tu interroges les url c'est vraiment très bas niveau, tu devrais regarder des API standards Java :

https://docs.oracle.com/javaee/7/tutorial/jaxrs-client.htm
https://docs.oracle.com/javaee/7/api/index.html?javax/ws/rs/client/package-summary.html
0
louisgautier Messages postés 1632 Date d'inscription lundi 27 septembre 2010 Statut Membre Dernière intervention 13 janvier 2017 69
25 juin 2016 à 15:21
Bonjour,
Oui j'ai pas l'habitude de travailler avec des api, c'est un peu nouveau pour moi tous ca !!
Je vais essayé de faire comme vous dites. Un asyncTask est suffisant pour ce genre de traitement ?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
25 juin 2016 à 15:33
"j'ai pas l'habitude de travailler avec des api"
Pourtant ce que tu fais c'est de l'Android, donc c'est déjà une API...
Et idem pour The TVDB API qui fait d'ailleurs déjà des appels plus haut niveau, il n'y a qu'à voir les exemples...

TheTVDBApi tvDB = new TheTVDBApi("your_api_key");
List<Series> results = tvDB.searchSeries("Lost", "en");

Nul part tu n'as besoin d'ouvrir toi même ton url.openConnection, laisse l'API faire...

"Un asyncTask est suffisant pour ce genre de traitement ?"
AsyncTask c'est spécifique Android et je ne connais pas, mais vu que l'action ici va être déterministe (tu vas toujours obtenir un résultat immédiatement) je ne sais pas si c'est vraiment utile de faire une tâche asynchrone, la faire en direct ça peut marcher aussi.
0
louisgautier Messages postés 1632 Date d'inscription lundi 27 septembre 2010 Statut Membre Dernière intervention 13 janvier 2017 69
25 juin 2016 à 16:04
Je ne comprend pas comment utiliser le lien https://api.thetvdb.com/updated/query?fromTime=... Cela me demande de faire un GET et j'obyiendrais un JSON c'est ca ?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
25 juin 2016 à 16:21
Oui, la plupart des API Rest répondent en JSON.

Dans ton cas elle devrait avoir cette forme :

{
  "data": [
        { "id": 1, "lastUpdated": 0 },
        { "id": 2, "lastUpdated": 0 },
        { "id": 3, "lastUpdated": 0 }
  ]
}

Mais je pense que le plus simple est de continuer à utiliser les classes TheTVDBApi que tu as commencer à utiliser (maladroitement certes) et qui seront plus adaptées.

Par exemple, voici la correction de ton code précédent (donc sans URL ni rien)
Même si on est bien d'accord que d'un point de vue algorithmique c'est faux.

private static final Random r = new Random();

protected String[] doInBackground(String... args) {
    int r_id = 200000 + r.nextInt(300000);
    String rdm = String.valueOf(r_id);
    Log.d("r_id", rdm);

    Series t;
    try {
        t = tvdb.getSeries(rdm, "fr");
    } catch (TvDbException e) {
        Log.e("getSeries", "can't getSeries: "+rdm, e);
        return null;
    }

    String[] data = { t.getSeriesName(), t.getPoster() };
    Log.d("le titre", t.getSeriesName());
    Log.d("banner", t.getPoster());
    Log.d("titre", data[0]);
    Log.d("poster", data[1]);
    return data;
}
0
louisgautier Messages postés 1632 Date d'inscription lundi 27 septembre 2010 Statut Membre Dernière intervention 13 janvier 2017 69
25 juin 2016 à 16:29
Oui, je suis complétement perdu..
Car au final, je questionne l'api mais l'id crée n'est peut être pas valide et donc, j'aurais une erreur !
0