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

zhuzhuzhuzhu Membre
avril 2015 modifié dans API AppKit #1

Voilà  je souhaite savoir le kilométrage entre deux villes en envoyant les deux villes ainsi que les codes postaux ( le tout de type NString*) au site "viamichelin" mais je n'est pas d'idée de comment faire, si vous auriez une petite idée je suis preneurs.


«1

Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur
    Pourquoi pas utiliser MapKit, qui s'occupe de gérer les Apple Maps, et qui peut fournir les itinéraires ?
  • ba parce dans le cahier des charges de mon projet, je doit impérativement passé par "viamichelin" pour le kilométrage ^^" .


  • Joanna CarterJoanna Carter Membre, Modérateur
    Donc tu devais utiliser Google pour chercher la solution. Ce lien ne m'a mis que 10 seconds - http://dev.viamichelin.com/itinerary-rest.html
  • Toujours le même prof dingue, avec un bagage de connaissance minimum, très certainement incapable de faire lui-même ce qu'il te demande ? Ni même de savoir si c'est possible. J'avais le même genre de prof dans mon BTS !


     


    Vas regarder sur le site viamichelin, si les créateurs mettent à  disposition une API, c'est-à -dire un protocole permettant à  une application de demander des informations sans passer par une page oueb.

  • DrakenDraken Membre
    avril 2015 modifié #6

    Voila, il y a effectivement une API comme l'anglaise qui-ne-connait-pas-le-doctor-who l'a trouvé !


  • Effectivement c'est lui ^^" je galère pas mal à  finir mon projet, merci pour les réponses je vais travailler dessus cette après-midi, je donnerais des nouvelles en fin de journée.


  • zhuzhuzhuzhu Membre
    avril 2015 modifié #8

    désolé je suis hors timing fixé ^^, j'ai tapé ceci:



    int cp1;
    int cp2;
    int typeIti;
    cp1=72000;
    cp2 =49000;
    typeIti=4;
    NSString *addr1;
    NSString *addr2;
    addr1 =@Le Mans;
    addr2 =@Angers;

    NSURL *url = [NSURL URLWithString:@http:;//www.viamichelin.fr/web/Itineraires?strStartMerged=%i, %@ &strDestMerged= %i, %@ &intItineraryType= %i &isFavoriseAutoroute=" TRUE"&isAvoidPeage="TRUE"%22",cp1,addr1,cp2,addr2,typeIti ];
    NSURLRequest* request = [NSURLRequest requestWithURL:url];


     



    mais il y a des erreurs sur l'url qui dit :"expected "]" before numeric constant

  • Joanna CarterJoanna Carter Membre, Modérateur
    Trop de guillemets.
  • zhuzhuzhuzhu Membre
    avril 2015 modifié #10

    maintenant j'ai ceci :



    NSURL *url = [NSURL URLWithString:@http:;//www.viamichelin.fr/web/Itineraires?strStartMerged=%i, %@ &strDestMerged= %i, %@ &intItineraryType= %i &isFavoriseAutoroute= TRUE &isAvoidPeage=TRUE %22" ,cp1,addr1,cp2,addr2,typeIti ];
    NSURLRequest* request = [NSURLRequest requestWithURL:url];

    avec l'erreur: Too many arguments to function "URLWithString"


  • LeChatNoirLeChatNoir Membre, Modérateur
    avril 2015 modifié #11

    NSURL *url = [NSURL URLWithString:@http:;//www.viamichel...strStartMerged=%d,%@&;strDestMerged=%d,%@&;intItineraryType=%d&isFavoriseAutoroute=TRUE&isAvoidPeage=TRUE" ,cp1,addr1,cp2,addr2,typeIti ]; 

    %d pour des int


  • Les espaces dans l'URL, c'est normal ?


     


    url est nil?


    Pourrais-tu utiliser la balise code ?


  • avril 2015 modifié #13

    URLWithString ne prend qu'un seul argument NSString en paramètre, hors là  tu lui passe 6 paramètres ! Essaye de créer ta string avant d'appeler la méthode URLWithString puis de faire juste : 



    NSURL *url= [NSURL URLWithString:maString];

  • stringWithFormat de NSString.


  • Joanna CarterJoanna Carter Membre, Modérateur

    Tu ne peux pas utiliser les formats dan [NSURL URLWithString:...]



    NSString *urlString = [NSString stringWithFormat:@http:;//www.viamichel...strStartMerged=%d,%@&;strDestMerged=%d,%@&;intItineraryType=%d&isFavoriseAutoroute=TRUE&isAvoidPeage=TRUE" ,cp1,addr1,cp2,addr2,typeIti];

    NSURL *url = [NSURL URLWithString:urlString];
  • zhuzhuzhuzhu Membre
    avril 2015 modifié #16

    pas une mauvaise idée, il ne me met plus d'erreur :)



    NSString *monUrl;

    monUrl =[NSString stringWithFormat:@http:;//www.viamichel...strStartMerged=%d,%@&;strDestMerged=%d,%@&;intItineraryType=%d&isFavoriseAutoroute=TRUE&isAvoidPeage=TRUE" ,cp1,addr1,cp2,addr2,typeIti];
    NSURL *url = [NSURL URLWithString:monUrl ];
  • Joanna CarterJoanna Carter Membre, Modérateur

    C'est pas mon boulot d'ajouter les balises de code sur vos messages. S'il vous plaà®t se souvenir de leurs utilisation.


  • AliGatorAliGator Membre, Modérateur
    avril 2015 modifié #18
    Reste plus qu'à  ajouter les percentEscapes à  addr1 et addr2 pour avoir une vraie URL

    (méthode stringByAddingPercentEscapes de NSString)

    Et je plussoie Joanna, utilise les balises CODE pour mettre du code dans tes messages !
  • Demain je vais travailler sur "comment récupéré les données de la page html que le site génère " ^^ 


    désolé pour les balises CODE je tacherais de les mettre à  l'avenir.  


  • Joanna CarterJoanna Carter Membre, Modérateur
    C'est pas de l'XML ?


  • Donc tu devais utiliser Google pour chercher la solution. Ce lien ne m'a mis que 10 seconds - http://dev.viamichelin.com/itinerary-rest.html




     


    Regarde le lien de Joanna, ça te permettra de construire une requête qui va te retourner les infos via michelin sous forme de xml ou de json. ça sera plus simple à  utiliser et surtout plus facile à  maintenir et bien plus rapide que de trier les infos dans une page web 

  • AliGatorAliGator Membre, Modérateur

    Demain je vais travailler sur "comment récupéré les données de la page html que le site génère " ^^ 
    désolé pour les balises CODE je tacherais de les mettre à  l'avenir.

    Tu me fais peur là ... si tu récupères du HTML, c'est que ce n'est pas un WebService et une API que tu utilises, qui te retournerait du XML ou du JSON et qui serait fait pour être exploité par une application tierce comme la tienne, mais que tu utilises une requête vers la page Web à  proprement parler et que tu vas la parser.

    Si c'est ça que tu es parti pour faire (requêter la page Web et parser le HTML plutôt que passer par l'API officielle), c'est une très très mauvaise idée car :
    - C'est souvent illégal (ça s'appelle du crawling, et les conditions générales d'utilisation du site l'interdit en général)
    - Ce n'est pas adapté (c'est bien plus compliqué que de parser du JSON par exemple) et pas fait pour (y compris en terme de charge pour les serveurs de viamichelin)
    - Ca risque de toute façon de ne plus marcher un jour si viamichelin décide de faire un relooking de sa page Web.

    Se reposer sur la structure de la page Web pour récupérer des données est à  éviter à  tout prix, encore plus alors que viamichelin fournit une API donc tu n'as aucune raison de ne pas utiliser leur API officielle faite pour.
  • J'essais juste de récupéré le kilométrage entre 2 villes avec "via michelin", j'ai essayé d'utilisé l'url que via michelin fournissait mais je n'est pas réussi, du coup j'essai de m'adapter.


  • Joanna CarterJoanna Carter Membre, Modérateur
    avril 2015 modifié #24
    Selon http://dev.viamichelin.fr/viamichelin-rest-api.htmlil me paraà®t qu'il faut s'inscrire à  via Michelin pour accéder les services.
  • j'ai un ami qui a réussi à  récupéré le kilométrage viamichelin sans compte en utilisant le même url que moi, mais il développe sous qtcreator.


  • Je viens de faire un test pour voir  si le string de "monUrl" est correcte et il s'avère qu'il est faux :/


     si je remplace par www.google.fr, je récupère bien le contenu de la page de cette façon:



    monUrl =[NSString stringWithFormat:@http://www.google.fr/];
    NSURL *url = [NSURL URLWithString:monUrl ];


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


    si je met url que jai crée de cette façon :




    [NSString stringWithFormat:@http:;//www.viamichelin.fr/web/Itineraires?strStartMerged=%d,%@&;strDestMerged=%d,%@&;intItineraryType=%d&isFavoriseAutoroute=TRUE&isAvoidPeage=TRUE" ,cp1,addr1,cp2,addr2,typeIti];


    cela ne fonctionne pas :(


  • AliGatorAliGator Membre, Modérateur
    Je vois que tu n'as pas suivi ma suggestion des percentEscapes...
  • avril 2015 modifié #28

    Avec ton URL tu vas réussir à  récupérer le kilométrage, c'est pas bien compliqué si tu maà®trise un peu le HTML et le JS mais comme Aligator l'a bien expliqué ce n'est pas la bonne méthode :

     - Plus difficile à  parser que du JSON ou XML et surement moins complet qu'en passant par l'API

     - le moindre petit changement de design ou d'architecture dans la page via michelin et ton truc marche plus

     

    Donc le mieux ça reste d'utiliser la méthode que Joanna t'a donné. Un peu d'aide pour commencer : 

     - tu as un exemple en bas de page, le lien te redirige vers un xml type de l'api, tu peux facilement identifier le kilométrage global de l'itinéraire (dans la balise totalDist) donc ça devrait pas etre trop dur à  parser


     - il faut commencer par bien construire ta requête, pour cela tu vas devoir créer un compte sur viaMichelin, et des coordonnées de départ et d'arrivé (et des étapes si tu en as)


     


    Pour construire t'as requête tu peux t'appuyer sur l'exemple : 


    ca sa changera pas pour toutes tes requêtes 


    tu indique ici si tu veux du xml ou du json


    la langue que tu souhaite utiliser (fra pour français, eng pour anglais) 


    les coordonnées de départ et d'arrivé


    tes info de connexion 


  • Pour les coordonnées de départ et d'arrivé, j'ai pas trop creusé la question mais à  première vu le plus simple est d'utiliser la longitude et la latitude. Tu peux aussi utiliser des poi


  • 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". 


     


    EltonCosmonote, je vais mettre ce que je récupère dans un NSString puis utilisé NSScanner pour récupéré le kilométrage, je suis débutant et je n'est pas envi de m'embêter  à  "parser" du json ou du XML alors que je ne le maitrise pas. 



  • EltonCosmonote, je vais mettre ce que je récupère dans un NSString puis utilisé NSScanner pour récupéré le kilométrage, je suis débutant et je n'est pas envi de m'embêter  à  "parser" du json ou du XML alors que je ne le maitrise pas. 




     


    ça peut être le moment d'apprendre 

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