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

API, COM et SDKs Delphi Discussion :

API Rest Lecture Json


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre actif Avatar de oneDev
    Homme Profil pro
    dilettant
    Inscrit en
    Mars 2019
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : dilettant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 213
    Points : 222
    Points
    222
    Par défaut API Rest Lecture Json
    Bonjour,

    Je teste l'utilisation d'API avec Delphi 10.4.2. Je teste donc fixer.io.
    J'ai généré les composants avec le debogeur REST.

    Le debogeur me permet bien de récupérer le fichier attendu :

    Code json : 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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    {
      "success":true,
      "timestamp":1632647943,
      "base":"EUR",
      "date":"2021-09-26",
      "rates":{
        "AED":4.304841,
        "AFN":103.078752,
        "ALL":121.479309,
        "AMD":565.190571,
        "ANG":2.103402,
        "AOA":704.222176,
        "ARS":115.490499,
        "AUD":1.613784,
        "AWG":2.110204,
        "AZN":1.99707,
        "BAM":1.953139,
        "BBD":2.36604,
        "BDT":99.885221,
        "BGN":1.956324,
        "BHD":0.441583,
        "BIF":2338.159933,
        "BMD":1.17201,
        "BND":1.585016,
        "BOB":8.091795,
        "BRL":6.252795,
        "BSD":1.171785,
        "BTC":2.8031075e-5,
        "BTN":86.375361,
        "BWP":13.181998,
        "BYN":2.933058,
        "BYR":22971.395832,
        "BZD":2.362045,
        "CAD":1.483847,
        "CDF":2346.954602,
        "CHF":1.08236,
        "CLF":0.033675,
        "CLP":929.205145,
        "CNY":7.579042,
        "COP":4496.662454,
        "CRC":732.20104,
        "CUC":1.17201,
        "CUP":31.058265,
        "CVE":110.814007,
        "CZK":25.443873,
        "DJF":208.290077,
        "DKK":7.435987,
        "DOP":66.136985,
        "DZD":160.434151,
        "EGP":18.394,
        "ERN":17.585956,
        "ETB":54.088721,
        "EUR":1,
        "FJD":2.452436,
        "FKP":0.846754,
        "GBP":0.85642,
        "GEL":3.645409,
        "GGP":0.846754,
        "GHS":7.079398,
        "GIP":0.846754,
        "GMD":60.417572,
        "GNF":11450.538033,
        "GTQ":9.06411,
        "GYD":244.952909,
        "HKD":9.124954,
        "HNL":28.367143,
        "HRK":7.504268,
        "HTG":117.183523,
        "HUF":356.882949,
        "IDR":16740.697715,
        "ILS":3.749096,
        "IMP":0.846754,
        "INR":86.783297,
        "IQD":1710.548582,
        "IRR":49447.101951,
        "ISK":150.498255,
        "JEP":0.846753,
        "JMD":173.585208,
        "JOD":0.831001,
        "JPY":129.794837,
        "KES":129.394361,
        "KGS":99.390902,
        "KHR":4787.661226,
        "KMF":492.600249,
        "KPW":1054.809009,
        "KRW":1383.276962,
        "KWD":0.352821,
        "KYD":0.976496,
        "KZT":498.732755,
        "LAK":11532.578725,
        "LBP":1790.831676,
        "LKR":234.083024,
        "LRD":200.535333,
        "LSL":17.240714,
        "LTL":3.460641,
        "LVL":0.708938,
        "LYD":5.315111,
        "MAD":10.536816,
        "MDL":20.747211,
        "MGA":4605.999673,
        "MKD":61.470295,
        "MMK":2193.176807,
        "MNT":3327.615053,
        "MOP":9.39765,
        "MRO":418.407365,
        "MUR":50.088076,
        "MVR":18.107998,
        "MWK":955.188547,
        "MXN":23.504313,
        "MYR":4.908968,
        "MZN":74.80984,
        "NAD":17.521992,
        "NGN":482.286479,
        "NIO":41.313794,
        "NOK":10.005063,
        "NPR":138.200458,
        "NZD":1.667899,
        "OMR":0.451043,
        "PAB":1.171785,
        "PEN":4.814662,
        "PGK":4.1431,
        "PHP":59.397719,
        "PKR":198.19123,
        "PLN":4.605396,
        "PYG":8064.830869,
        "QAR":4.267333,
        "RON":4.950223,
        "RSD":117.4182,
        "RUB":84.986668,
        "RWF":1166.149941,
        "SAR":4.396227,
        "SBD":9.444132,
        "SCR":16.336373,
        "SDG":516.274712,
        "SEK":10.139297,
        "SGD":1.586169,
        "SHP":1.614331,
        "SLL":12399.866106,
        "SOS":685.626242,
        "SRD":25.105045,
        "STD":24258.240544,
        "SVC":10.252872,
        "SYP":1473.730156,
        "SZL":17.521983,
        "THB":39.183855,
        "TJS":13.282697,
        "TMT":4.102035,
        "TND":3.284563,
        "TOP":2.641246,
        "TRY":10.411672,
        "TTD":7.964764,
        "TWD":32.512968,
        "TZS":2717.891563,
        "UAH":31.324535,
        "UGX":4136.59984,
        "USD":1.17201,
        "UYU":49.975267,
        "UZS":12511.207051,
        "VEF":250611157048.6555,
        "VND":26680.807455,
        "VUV":130.833505,
        "WST":3.000719,
        "XAF":655.054347,
        "XAG":0.052262,
        "XAU":0.00067,
        "XCD":3.167416,
        "XDR":0.825862,
        "XOF":653.981965,
        "XPF":119.604046,
        "YER":294.061523,
        "ZAR":17.483038,
        "ZMK":10549.500546,
        "ZMW":19.452395,
        "ZWL":377.386739
      }
    }

    J'ai donc les composants générés par le degobeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    RESTClient1: TRESTClient;
    RESTRequest1: TRESTRequest;
    RESTResponse1: TRESTResponse;
    J'ai ajouté ceux-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    RESTResponseDataSetAdapter1: TRESTResponseDataSetAdapter;
    FDMemTable1: TFDMemTable;
    ListBox1: TListBox;
    J'ai testé le code suivant :

    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
    procedure TFrmMain.FormCreate(Sender: TObject);
    var
      str: string;
      fmt: TFormatSettings;
      d: TDateTime;
      rates: TJSONValue;
     
      strReader: TStringReader;
      jsonTextReader: TJsonTextReader;
    begin
      RESTResponseDataSetAdapter1.Dataset := FDMemTable1;
      RESTResponseDataSetAdapter1.ResponseJSON := RESTResponse1;
      RESTRequest1.Params[0].Value := TKeyFixer.GetKey;
      RESTRequest1.Execute;
     
      str := FDMemTable1.FieldList.Text;
      // ShowMessage(str); // success, timestamp, base, date, rates
     
      ListBox1.Items.Add(FDMemTable1.Fields[0].AsString); // T
      if (FDMemTable1.Fields[0].AsBoolean) then
        ListBox1.Items.Add('true')
      else
        ListBox1.Items.Add('false');
     
      ListBox1.Items.Add(FDMemTable1.Fields[1].AsString); // timestamp
      ListBox1.Items.Add(FormatDateTime('dd/mm/yyyy hh:nn:ss.zzz',
        UnixToDateTime(FDMemTable1.Fields[1].AsInteger)));
     
      ListBox1.Items.Add(FDMemTable1.Fields[2].AsString); // "eur"
      ListBox1.Items.Add(FDMemTable1.Fields[3].AsString); // date
     
      fmt := TFormatSettings.Create;
      fmt.DateSeparator := '-';
      fmt.ShortDateFormat:='yyy-mm-dd';
     
      if TryStrToDateTime(FDMemTable1.Fields[3].AsString, d, fmt) then
        ListBox1.Items.Add(FormatDateTime('dd/mm/yyyy hh:nn:ss.zzz', d))
      else
        ListBox1.Items.Add('-');
     
      ListBox1.Items.Add(FDMemTable1.Fields[4].AsString); // json
     
      strReader := TStringReader.Create(FDMemTable1.Fields[4].AsString);
      jsonTextReader := TJsonTextReader.Create(strReader);
     
      while jsonTextReader.read do
        case jsonTextReader.TokenType of
          TJsonToken.PropertyName:
            ListBox1.Items.Add('prop: ' + jsonTextReader.Value.AsString);
          TJsonToken.String:
            ListBox1.Items.Add('str: ' + jsonTextReader.Value.AsString);
          TJsonToken.Float:
          try
            ListBox1.Items.Add('fl: ' + jsonTextReader.Value.AsExtended.ToString);
          except
            on e: Exception do
              ListBox1.Items.Add(e.Message);
          end;
        end;
    end;
    Exception EJsonReaderException dans le module...
    Chaine non terminée. Délimiteur attendu : ",Chemin 'BIF', ligne 1, position 255.

    J'ai l'impression que je ne récupère pas la chaine complète.
    Avez-vous des conseils à me donner pour parvenir à lire toutes les infos ?
    Merci de vos commentaires.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Bonjour
    Citation Envoyé par oneDev Voir le message
    J'ai donc les composants générés par le debogueur...
    J'ai ajouté ceux-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RESTResponseDataSetAdapter1: TRESTResponseDataSetAdapter;
    FDMemTable1: TFDMemTable;
    Moi ce qui m'étonne c'est qu'il y ait eu besoin d'ajouter ces deux derniers mais c'est peut-être parce que la démarche n'a pas été jusqu'au bout car j'ai l'impression que tu t'es compliqué la vie.
    Tu n'as pas dû indiqur de racine (dans l'onglet Données tabulaire dans ton cas "rates") et appliqué dans ce cas tout ces composants sont créés et tu peux utiliser directement le fdmemtable.

    Quand, en plus, tu utilises livebinding ton code devrait se limiter a une partie congrue du style (sans tester)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TFrmMain.FormCreate(Sender: TObject);
    begin
      RESTRequest1.Params[0].Value := TKeyFixer.GetKey;
      RESTRequest1.Execute;
    end
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 126
    Points
    13 126
    Par défaut
    La longueur du champ[4] ne fait manifestement que 255 caractères.

    J'avais commencé avec ces composants REST mais les ai abandonnés, trop lourds à mon goût
    De plus ici je ne vois pas l'utilité d'un DataSet puisqu'il n'y a pas d'array.
    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
    with TNetHttpClient.Create(nil) do
    try
      var RespContent := TStringStream.Create;
      Get('https://api.frankfurter.app/latest?from=EUR', RespContent);
     
      var JSon       := TJSOnObject.ParseJSONValue(RespContent.DataString);
      var Rates      := JSon.GetValue<TJSonObject>('rates');
      var Reader     := TStringReader.Create(Rates.ToJSON);
      var TextReader := TJsonTextReader.Create(Reader);
     
      while TextReader.read do
        case TextReader.TokenType of
          TJsonToken.PropertyName : ListBox1.Items.Add('prop: ' + TextReader.Value.AsString);
          TJsonToken.Float        : ListBox1.Items.Add('fl: ' + TextReader.Value.AsExtended.ToString);
        end;
    ...

  4. #4
    Membre actif Avatar de oneDev
    Homme Profil pro
    dilettant
    Inscrit en
    Mars 2019
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : dilettant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 213
    Points : 222
    Points
    222
    Par défaut
    Merci de vos réponses.

    Citation Envoyé par SergioMaster Voir le message
    Moi ce qui m'étonne c'est qu'il y ait eu besoin d'ajouter ces deux derniers mais c'est peut-être parce que la démarche n'a pas été jusqu'au bout car j'ai l'impression que tu t'es compliqué la vie.
    Effectivement, le code est c'est en cours, je suis en train de faire des tests pour voir comment tout récupérer correctement.
    En fait je découvre FMX en même temps, je n'ai donc peut être pas les bonnes méthodes.

    Citation Envoyé par SergioMaster Voir le message
    Tu n'as pas dû indiqur de racine (dans l'onglet Données tabulaire dans ton cas "rates") et appliqué dans ce cas tout ces composants sont créés et tu peux utiliser directement le fdmemtable.
    En fait non . Je souhaite récupérer également l'entête. Mais j'avais vu effectivement que sinon, on pouvait indiquer la racine.

    Citation Envoyé par Andnotor Voir le message
    La longueur du champ[4] ne fait manifestement que 255 caractères.

    J'avais commencé avec ces composants REST mais les ai abandonnés, trop lourds à mon goût
    De plus ici je ne vois pas l'utilité d'un DataSet puisqu'il n'y a pas d'array.
    Je te remercie de ton code. Je vais regartder tout ça rapidement.
    Je vous tiendrais informé.

  5. #5
    Membre actif Avatar de oneDev
    Homme Profil pro
    dilettant
    Inscrit en
    Mars 2019
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : dilettant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 213
    Points : 222
    Points
    222
    Par défaut
    Je récupère bien les données et j'arrive à toutes les lire.
    Je ne sais pas si c'est la meilleure façon de faire mais cela fonctionne.

    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
    63
    64
    65
    66
    67
    68
    procedure TFrmMain.FormCreate(Sender: TObject);
    var
      str: string;
      tms: Integer;
      fmt: TFormatSettings;
      d: TDateTime;
     
      jsonOb: TJSOnObject;
      rates: TJSONValue;
      reader: TStringReader;
      txtReader: TJsonTextReader;
    begin
      RESTRequest1.Params[0].Value := TKeyFixer.GetKey;
      RESTRequest1.Execute;
     
      jsonOb := TJSOnObject.ParseJSONValue(RESTResponse1.JSONText) as TJSOnObject;
     
      str := jsonOb.Values['success'].Value;
      ListBox1.Items.Add(str); // T
     
      str := jsonOb.Values['timestamp'].Value;
      tms := StrToIntDef(str, -1);
      if (tms > 0) then
        ListBox1.Items.Add(FormatDateTime('dd/mm/yyyy hh:nn:ss.zzz',
          UnixToDateTime(tms)))
      else
        ListBox1.Items.Add('-');
     
      str := jsonOb.Values['base'].Value;
      ListBox1.Items.Add(str); // "eur"
     
      str := jsonOb.Values['date'].Value;
      ListBox1.Items.Add(str); // date
     
      fmt := TFormatSettings.Create;
      fmt.DateSeparator := '-';
      fmt.ShortDateFormat := 'yyy-mm-dd';
     
      if TryStrToDateTime(str, d, fmt) then
        ListBox1.Items.Add(FormatDateTime('dd/mm/yyyy hh:nn:ss.zzz', d))
      else
        ListBox1.Items.Add('-');
     
      ListBox1.Items.Add('------------------------------');
     
      try
        rates := jsonOb.GetValue<TJSOnObject>('rates');
        reader := TStringReader.Create(rates.ToJSON);
        try
          txtReader := TJsonTextReader.Create(reader);
          try
            while txtReader.Read do
              case txtReader.TokenType of
                TJsonToken.PropertyName:
                  ListBox1.Items.Add('prop: ' + txtReader.Value.AsString);
                TJsonToken.Float:
                  ListBox1.Items.Add('fl: ' + txtReader.Value.AsExtended.ToString);
              end;
          finally
            txtReader.Free;
          end;
        finally
          reader.Free;
        end;
      finally
        jsonOb.Free;
      end;
    end;

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 126
    Points
    13 126
    Par défaut
    Tu peux éviter ces conversions en étant plus précis sur le type souhaité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    str := UnixToDateTime(jsonOb.Values['timestamp'].AsType<integer>).ToString;
     
    str := jsonOb.Values['date'].AsType<TDateTime>.ToString;
    Je préfère utiliser GetValue\TryGetValue mais AsType est bon aussi.

  7. #7
    Membre actif Avatar de oneDev
    Homme Profil pro
    dilettant
    Inscrit en
    Mars 2019
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : dilettant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 213
    Points : 222
    Points
    222
    Par défaut
    Merci de ta remarque, je note cela.
    En fait, quand je lis les infos d'un fichier que je reçois que me méfie toujours des infos que je reçois, j'évite donc de faire des convertions automatiques.
    Je vais tester comment améliorer ça.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 126
    Points
    13 126
    Par défaut
    C'est justement à cela que sert TryGetValue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if jsonOb.TryGetValue<TDateTime>('date', d) then
      ListBox1.Items.Add('Date: ' +d.ToString);

  9. #9
    Membre actif Avatar de oneDev
    Homme Profil pro
    dilettant
    Inscrit en
    Mars 2019
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : dilettant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 213
    Points : 222
    Points
    222
    Par défaut
    cela fonctionne très bien merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 7] Récupération et traitement Json dans une api rest
    Par Atonnh dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2018, 16h18
  2. [3.x] API Rest - Json
    Par Wilhem31 dans le forum Symfony
    Réponses: 9
    Dernier message: 25/01/2018, 14h15
  3. Deserialization Json apres requete API Rest
    Par olibara dans le forum C#
    Réponses: 4
    Dernier message: 15/11/2016, 11h57
  4. [Lazarus] Envoyer des données JSON sur API REST par la méthode PUT
    Par Jon Shannow dans le forum Lazarus
    Réponses: 11
    Dernier message: 13/05/2016, 08h30
  5. Format d'un JSON pour une API REST
    Par pierapi dans le forum Langage
    Réponses: 2
    Dernier message: 17/09/2015, 15h15

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