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

Contribuez Pascal Discussion :

Interroger un web service JSON


Sujet :

Contribuez Pascal

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 100
    Points : 15 574
    Points
    15 574
    Billets dans le blog
    9
    Par défaut Interroger un web service JSON
    Bonjour !

    Je vous propose d'apprendre à interroger un web service JSON et à analyser les données reçues.

    Le web service que j'ai choisi pour cet exemple fournit des informations sur le calendrier liturgique catholique. La documentation de l'API se trouve à l'adresse suivante :

    http://calapi.inadiutorium.cz/api-doc

    Je souhaite consulter la date du jour dans le calendrier. Voici comment interroger le web service :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    uses
      fphttpclient;
     
    const
      URL = 'http://calapi.inadiutorium.cz/api/v0/fr/calendars/general-fr/today';
     
    var
      vJSONText: string;
     
    begin
      vJSONText := TFPCustomHTTPClient.SimpleGet(URL);
    Afin de bien comprendre ce qui se passe (et afin de pouvoir éventuellement travailler sans connexion), je colle directement dans mon code la chaîne de caractères renvoyée précédemment par la méthode SimpleGet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      vJSONText := '{"date":"2018-04-01","season":"easter","season_week":1,"celebrations":[{"title":"Dimanche de Pâques de la Résurrection du Seigneur","colour":"white","rank":"Triduum Pascal","rank_num":1.1}],"weekday":"sunday"}';
    Voici comment convertir cette chaîne de caractères en données JSON sous la forme du type TJSONData :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    uses
      fpjson, jsonparser;
     
    { ... }
     
    var
      { ... }
      vJSONData: TJSONData;
     
    begin
      { ... }
     
      vJSONData := GetJSON(vJSONText);
    Le premier avantage de cette conversion est de pouvoir reformater la chaîne de caractères :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      WriteLn(vJSONData.FormatJSON());
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    {
      "date" : "2018-04-01",
      "season" : "easter",
      "season_week" : 1,
      "celebrations" : [
        {
          "title" : "Dimanche de Pâques de la Résurrection du Seigneur",
          "colour" : "white",
          "rank" : "Triduum Pascal",
          "rank_num" : 1.1000000000000001E+000
        }
      ],
      "weekday" : "sunday"
    }

    Le principal avantage est de pouvoir accéder à la donnée de son choix :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      WriteLn(vJSONData.FindPath('celebrations').Items[0].FindPath('title').AsString);
    Non seulement ça fonctionne, mais à présent les accents s'affichent correctement (dans la console de Notepad++).

    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    Dimanche de Pâques de la Résurrection du Seigneur

    Comme vous le voyez, on accède à une table associative ({}) par la méthode FindPath, et on accède à un tableau ([]) par la variable Items.

    Vous trouverez ci-joint le code source complet de l'exemple.

    Joyeuses Pâques !
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 100
    Points : 15 574
    Points
    15 574
    Billets dans le blog
    9
    Par défaut
    Pour vous exercer, voici d'autres web services que j'ai essayés :

    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
    const
      URL: array[1..9] of string = (
        // Obtenir votre adresse IP
        'http://checkip.dyndns.org',
        // Savoir dans quel pays se trouve une adresse IP
        'https://api.ip2country.info/ip?41.83.38.206',
        // Calendrier liturgique catholique
        'http://calapi.inadiutorium.cz/api/v0/la/calendars/general-la/today', // latin
        'http://calapi.inadiutorium.cz/api/v0/fr/calendars/general-fr/today', // français
        // Nom d'utilisateur aléatoire
        'https://randomuser.me/api/',
        // Informations sur un livre à partir de son ISBN
        'https://www.googleapis.com/books/v1/volumes?q=isbn:2070394565',
        // Chercher dans le catalogue d'un marchand de disque
        'https://itunes.apple.com/search?term=elisabeth+schwarzkopf',
        // Tournois en cours sur le site lichess.org
        'https://lichess.org/api/tournament',
        // Recherche sur le site de la BNF
        'http://gallica.bnf.fr/services/Categories?SRU=gallica%20all%20%22lamartine%22'
      );

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 100
    Points : 15 574
    Points
    15 574
    Billets dans le blog
    9
    Par défaut
    Connaissez-vous d'autres web services envoyant des données au format JSON ?

    Concernant Gallica, je crois comprendre en lisant cette page que le service le plus utile est celui qui renvoie du XML. Quelqu'un aurait-il un exemple simple de lecture d'un fichier XML avec les unités standard de Free Pascal ?

    P.-S.
    Apparemment il y a tout ce qu'il faut . En plus c'est en français. Merci au traducteur.
    Il y a aussi ce tutoriel.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Décembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 5
    Points : 9
    Points
    9
    Par défaut Base JSON des données des exoplanètes du projet Exoclock
    Bonsoir,

    Il y a cette base ( URL_requete:='https://www.exoclock.space/database/planets_json' ) que j'essaie d'utiliser.
    Mais le parseur ne crée qu'un élément de la collection sur deux. Or, la taille de la collection (collection.count=777) est correcte d'où plantage (List index (388) out of bound)...

    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
     
    ...
    type
       T_Exoplanete = record
           nom,priorite : string;  { priorité des observations }
       end;
    var
       exoplanete_elements : array of T_exoplanete;    
       f_log                        : textfile;
    procedure DoParse(parseur : TJSONParser);
    var
       js : TJSONData;
       star,collection      : TJSONObject;
       i                        : integer;
       result_ok            : boolean;
    begin
       Try
           js:=parseur.Parse;
          Try
             If Assigned(js) then
             begin
                 collection :=TJSONObject(js);
                 nb_exoplanete:=collection.count+1;
                 Setlength(exoplanete_elements,nb_exoplanete);
                 result_ok:=false;
     
     
                 for i:=0 to nb_exoplanete-1 do
                 begin
                    star:=TJSONObject(collection.Extract(i));
                    with star,exoplanete_elements[i] do
                    begin
                       nom:=Strings['name'];
                       priorite:=Strings['priority'];
                    end;
                 end;
             end
             else
                Writeln(f_log,'Pas de données JSON disponibles');
          Finally
             FreeAndNil(js);
          end;
      except
         On E : Exception do
            Writeln(f_log,'Une erreur est survenue lors du traitement du fichier : ',E.Message);
      end;
    end;  
     
    appelé par :
       ...
       flux:=TFileStream.Create(nf_elements_json, fmopenRead);
       try
          parseur:=TJSONParser.Create(flux);
          try
             DoParse(parseur);
          finally
             FreeAndNil(parseur);
          end;
       finally
          flux.Destroy;
       end;                 
       ...
    Un code somme toute classique issu des exemples trouvés sur le site.
    Si vous avez une idée, je suis preneur...
    Merci

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 855
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 855
    Points : 13 657
    Points
    13 657
    Par défaut
    Citation Envoyé par Marc le Lorrain Voir le message
    Un code somme toute classique...
    ...d'erreur à ne pas commettre.


    Lorsqu'on veut supprimer des éléments d'une liste dans une boucle (Extract), elle doit aller du plus grand au plus petit (downto).

    Si nb_exoplanete = collection.count +1 la boucle ne doit pas dépasser nb_exoplanete -2 (pourquoi +1 ?).

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Décembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 5
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    ...d'erreur à ne pas commettre.


    Lorsqu'on veut supprimer des éléments d'une liste dans une boucle (Extract), elle doit aller du plus grand au plus petit (downto).

    Si nb_exoplanete = collection.count +1 la boucle ne doit pas dépasser nb_exoplanete -2 (pourquoi +1 ?).
    Ok et merci pour la remarque. Je pensais que count donnait l'index de la fin du tableau. Mais cela ne change pas le problème car en parcourant les données JSON je n'obtiens que la moitié des données contenue dans le fichier JSON. Un élément de collection sur deux pour être plus précis. count est correct...
    Je n'ai pas compris la remarque concernant la suppression d'élément. Il ne s'agit que d'un parcours de contenu JSON.

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 855
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 855
    Points : 13 657
    Points
    13 657
    Par défaut
    Citation Envoyé par Marc le Lorrain Voir le message
    Il ne s'agit que d'un parcours de contenu JSON.
    Ben non puisque tu extraits un élément à chaque pas.
    Il faut soit revoir ta boucle, soit changer de méthode d'accès au json.

    Et si tu continues avec extract, n'oublie pas de libérer star puisqu'il n'appartient plus à js.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Décembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 5
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Ben non puisque tu extraits un élément à chaque pas.
    Il faut soit revoir ta boucle, soit changer de méthode d'accès au json.

    Et si tu continues avec extract, n'oublie pas de libérer star puisqu'il n'appartient plus à js.
    Je n'avais pas compris qu' extract enlevait les données de la structure JSON. Je pensais qu'il ne faisait que recopier celle-ci vers la destination. Donc le compteur diminuait d'autant, d'où la récupération d'un élément sur deux en incrémentant l'indice. En extrayant toujours l'élément 0 je peux parcourir (enfin extraire) toute la liste.
    Merci pour ces conseils.

Discussions similaires

  1. Interroger un web service
    Par wisiweb dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 06/12/2013, 19h26
  2. [Web Service] Web service JSON inaccessible depuis domaine distant
    Par flashnet dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 25/02/2013, 01h31
  3. [1.x] web services json
    Par Willy55 dans le forum Symfony
    Réponses: 10
    Dernier message: 16/05/2012, 16h48
  4. Comment interroger un Web Service en PL/SQL
    Par squallJ dans le forum Oracle
    Réponses: 2
    Dernier message: 19/08/2009, 12h31

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