Calcul kilométrage avec "viamichelin"[résolu]

2»

Réponses

  • LeChatNoirLeChatNoir Membre, Modérateur

    ah ah !


     


    Chopper une NSString monstrueuse et la scanner est plus compliqué je pense que parser du JSON qui est à  peu près simple comme bonjour...


  • Je pense que le *url refuse de prendre le "monUrl" car il y a une modification du string, vu que cela fonctionne si je met :



    monUrl =[NSString stringWithFormat:@http://www.viamichelin.fr/];


  • Je vois que tu n'as pas suivi ma suggestion des percentEscapes...




     


    Je pencherai plus sur un problème avec les espaces...

  • Effectivement j'ai tester zone par zone et il s'avère que les espaces posait problème donc maintenant cela fonctionne voici le code que j'ai tapé:



    //test michelin
    int cp1;
    int cp2;
    int typeIti;
    cp1=72000;
    cp2 =49000;
    typeIti=4;
    NSString *addr1;
    NSString *addr2;
    BOOL fav= TRUE;
    BOOL peage = TRUE;
    addr1 =@LeMans;
    addr2 =@Angers;
    NSString *monUrl;



    monUrl =[NSString stringWithFormat:@http://www.viamichelin.fr/web/Itineraires?strStartMerged=%d,"%@""&;strDestMerged=%d,""%@""&;intItineraryType=%d&isFavoriseAutoroute=%d&isAvoidPeage=%d",cp1,addr1,cp2,addr2,typeIti,fav,peage];
    NSLog(@%@",monUrl);
    NSURL *url = [NSURL URLWithString:monUrl ];




    NSData *donnees = [[NSData alloc] initWithContentsOfURL:url];
    NSString *page = [[NSString alloc] initWithData:donnees encoding:NSASCIIStringEncoding];
    NSLog(@%@",page);



    merci pour l'aide, je vais pouvoir l'intégré à  mon appli en faisant quelques modifications . 


  • On essaye de te mettre sur cette piste depuis quelques posts déjà  :


    stringByAddingPercentEscapesUsingEncoding:


  • jpimbertjpimbert Membre
    avril 2015 modifié #37

    Un p'tit coup de stringByAddingPercentEscapesUsingEncoding: ne peut pas faire de mal pour être sûr d'avoir un URL bien formé.


     


    (grillé)


  • AliGatorAliGator Membre, Modérateur

    ali, je fait juste un test pour pouvoir adapter ce bout de code  pour la suite de mon appli, car les valeurs des différentes variables seront dynamique et dépendrons du choix que fera l'utilisateur.
     
    Après avoir fait afficher l'url dans l'invit de commande je retrouve ceci:


    http://www.viamichelin.fr/web/Itineraires?strStartMerged=72000,Le Mans&strDestMerged=49000,Angers&intItineraryType=4&isFavoriseAutoroute= 1 &isAvoidPeage= 1
    et il s'avère que cela fonctionne,  il y a juste :

    NSURL *url = [NSURL URLWithString:monUrl ];
    qui refuse de prendre le "monUrl".

    Bah oui, c'est normal, justement parce que tu n'as pas utilisé stringByAddingPercentEscapes !!!!

    Ca fait 3 fois que je te donne la solution... je comprend pas pourquoi tu refuses de l'appliquer...
  • tada:



    NSString *monUrl2 =[monUrl stringByReplacingOccurrencesOfString: @ withString: @""];
    NSLog(@%@",monUrl2);
    NSURL *url = [NSURL URLWithString:monUrl2];

    désolé j'avais pas réussi à  m'en servir correctement mais maintenan c'est bon ^^


  • Joanna CarterJoanna Carter Membre, Modérateur

    Je viens de me souvenir, stringByAddingPercentEscapes n'attrape tous les cas. J'ai dû créer une catégorie sur NSString pour l'achever :



    @implementation NSString (Extensions)

    - (NSString*)urlencode:(NSStringEncoding)encoding {
    NSString *str = [self stringByAddingPercentEscapesUsingEncoding:encoding];
    str = [str stringByReplacingOccurrencesOfString:@& withString:@%26];
    str = [str stringByReplacingOccurrencesOfString:@= withString:@%3d];
    str = [str stringByReplacingOccurrencesOfString:@? withString:@%3f];
    str = [str stringByReplacingOccurrencesOfString:@ withString:@%20];
    return str;
    }

    @end
  • Pourquoi tu remplaces les "&", "=" et "?" ? Ils peuvent bien être contenu dans une URL, en particulier si l'URL en question contient des arguments à  passer en GET ?


  • AliGatorAliGator Membre, Modérateur

    tada:


    NSString *monUrl2 =[monUrl stringByReplacingOccurrencesOfString: @ withString: @""];
    NSLog(@%@",monUrl2);
    NSURL *url = [NSURL URLWithString:monUrl2];
    désolé j'avais pas réussi à  m'en servir correctement mais maintenan c'est bon ^^

    Ce n'est toujours pas la bonne solution...

    Déjà  un nom de ville peut contenir bien plus que des espaces comme caractères spéciaux. En particulier des accents et autres. Donc ta solution ne couvre pas tous les cas, loin de là .

    Mais surtout pourquoi diable ne pas vouloir utiliser stringByAddingPercentEscapesUsingEncoding ?? Qui fait tout le boulot à  ta place, et résoudrait ton problème directement... Je ne comprend pas ta réticence et ton refus de suivre la solution qu'on te donne depuis le début ! (ça donne pas trop envie de continuer à  te donner des conseils si tu t'obstines à  ne pas les suivre)
  • AliGatorAliGator Membre, Modérateur

    Je viens de me souvenir, stringByAddingPercentEscapes n'attrape tous les cas. J'ai dû créer une catégorie sur NSString pour l'achever :


    @implementation NSString (Extensions)

    - (NSString*)urlencode:(NSStringEncoding)encoding {
    NSString *str = [self stringByAddingPercentEscapesUsingEncoding:encoding];
    str = [str stringByReplacingOccurrencesOfString:@& withString:@%26];
    str = [str stringByReplacingOccurrencesOfString:@= withString:@%3d];
    str = [str stringByReplacingOccurrencesOfString:@? withString:@%3f];
    str = [str stringByReplacingOccurrencesOfString:@ withString:@%20];
    return str;
    }

    @end

    Cans ce cas plutôt utiliser CFURLCreateStringByAddingPercentEscapes de CoreFoundation (grace au toll-free-bridging c'est facile à  appliquer sur une NSString).

    Et puis sinon y'a l'autre solution d'utiliser NSURLComponents pour composer son URL morceau par morceau, et l'assembler à  la toute fin. C'est vachement + simple (mais c'est iOS7 minimum)
  • Joanna CarterJoanna Carter Membre, Modérateur

    Cans ce cas plutôt utiliser CFURLCreateStringByAddingPercentEscapes de CoreFoundation (grace au toll-free-bridging c'est facile à  appliquer sur une NSString).Et puis sinon y'a l'autre solution d'utiliser NSURLComponents pour composer son URL morceau par morceau, et l'assembler à  la toute fin. C'est vachement + simple (mais c'est iOS7 minimum)




    Voilà  ! Tu as raison.


  • Et puis sinon y'a l'autre solution d'utiliser NSURLComponents pour composer son URL morceau par morceau, et l'assembler à  la toute fin. C'est vachement + simple (mais c'est iOS7 minimum)




    T'as pas remarqué que son prof veux que ça tourne sous iOS 2.5 ?

  • AliGatorAliGator Membre, Modérateur

    T'as pas remarqué que son prof veux que ça tourne sous iOS 2.5 ?

    C'est pour ça que j'ai précisé "mais c'est iOS7 minimum" (sous-entendu "donc ça collera pas") et que j'ai pas proposé cette solution avant, je n'en parle ici qu'en réponse à  Joanna.
  • Joanna CarterJoanna Carter Membre, Modérateur
    Mais CFURLCreateStringByAddingPercentEscapes devrait marcher tout de même.
  • Les villes qui sont prises en paramètres sont toutes en majuscule sans accents et en faisant le test sa fonctionne sans soucis, après je ne sais pas comment utilisé stringByAddingPercentEscapesUsingEncoding pour l'instant vu que j'ai réglé mon soucis je vais laisser tel quel.


    Je modifierais mon programme en conséquence lorsque j'aurai atteint tout les objectifs fixé dans le cahier des charges. 

  • En regardant la doc (et y'a pas mal de discussions également dessus sur le web), tu peux trouver un exemple d'utilisation dans le sample code GeocoderDemo, fichier PlacemarkViewController.m.


  • AliGatorAliGator Membre, Modérateur


    après je ne sais pas comment utilisé stringByAddingPercentEscapesUsingEncoding

    ??? Heu pourtant je vois pas comment on peut faire plus simple... y'a pas de truc compliqué ou de piège ou quoi, t'appelles juste la fonction et point barre... si ça c'est compliqué je vois pas ce que tu trouves simple et j'ose même pas imaginer les difficultés que tu vas avoir pour la suite...


  • Je modifierais mon programme en conséquence lorsque j'aurai atteint tout les objectifs fixé dans le cahier des charges. 




     


    ça c'est une très mauvaise idée, typiquement le genre de truc qu'on fait jamais

  • AliGatorAliGator Membre, Modérateur
    +100 avec Elton. Ce n'est pas une bonne façon d'aborder les choses.

    Mieux vaut faire que certaines tâches mais bien les faire que de tout faire à  moitié. Sinon c'est la meilleure manière d'avoir un code pourri et bancal, qui ne marchera pas à  la fin, et pour lequel plein de cas auxquels tu n'as pas pensé car tu as voulu aller trop vite vont tout casser.

    Si tu comptes construire une cabane, tu n'essaies pas de poser toutes les planches de manière "à  peu près" à  ce que ça tienne "pour le moment", pour ensuite seulement rajouter les clous à  la toute fin (et risquer de tout se prendre sur la tronche). Non, tu construis les fondations d'abord et seulement quand elles sont sécurisées tu avances et construit le reste.

    En dev c'est pareil. En plus, si tu ne reviens sur ton code bancal que à  la fin du projet (et je suis d'accord avec Elton, en pratique je te paries que tu vas pas le faire, mais admettons), tu vas peut-être te rendre compte que pour régler le problème que tu avais laissé en plan, bah en fait il faut aborder tout un pan de ton code différemment... et du coup faudra refaire toute une partie et casser des choses qui auront déjà  été assemblées avec le reste.

    (Après, si tu préfères coder comme un porc et à  la va vite, c'est ton choix, dans ce cas laisse moi noter ton nom pour me souvenir de ne jamais t'embaucher dans ma boite)
  • Je rejoins mes deux compères avec une nuance.



    Si le temps le permet (projet perso, etc.), je ne suis pas contre un proof test à  part et qui sera entièrement réécrit dans tous les cas, car le proof test permet parfois certaines facilités comme des cas non-traités, et rien de mieux que de tout réécrire proprement dans ce cas-là  pour être sûr de ne pas les oublier (enfin de moins en oublier).


     


    Mais en général, non, je déconseille, car on a la flemme de revenir dessus proprement souvent.




  • ça c'est une très mauvaise idée, typiquement le genre de truc qu'on fait jamais




    On parie qu'il y a zéro commentaire dans le code, pour gratiner les choses ?  ^_^

Connectez-vous ou Inscrivez-vous pour répondre.