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

Composants FMX Delphi Discussion :

Récupérer un tableau d'une API via REST Client et ClientDataSet [Android]


Sujet :

Composants FMX Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Par défaut Récupérer un tableau d'une API via REST Client et ClientDataSet
    Bonjour à tous,

    je développe sous delphi 10.2 tokyo une application mobile android. J'interroge une API (format json) via les compos RestClient, RestRequest, RestResponse et Restresponsedatasetadapter lié via un DataSource à un ClientDataSet pour lire le résultat dans un Tgrid lié via livebinding.

    Les paramètres retour de l'API sont les suivants :

    Nom : parametre_retour_salon.png
Affichages : 1468
Taille : 12,0 Ko

    initialement, j'ai créé dans le Restresponsedatasetadapter.FieldDefs les éléments suivants :
    - success ftboolean
    - error ftstring
    - salons ftarray size 7
    et dans ChildDefs de salons :
    - id ftinteger
    - nom ftstring
    - adresse ftstring
    - cp ftstring
    - ville ftstring
    - tel ftstring
    - facebook ftstring

    à l'appel de l'API, la connexion est ok et le retour est ok : j'ai vérifié le content de RestResponse et j'ai bien mon JSON complet. mais l'affectation des données dans le clientdataset ne fonctionne pas correctement. En bidouillant suite aux remarques du forum https://stackoverflow.com/questions/...cts-and-arrays, j'ai supprimé du childdefs les 7 éléments du tableau (de id jusqu'à facebook) pour les mettre au même niveau dans Restresponsedatasetadapter.FieldDefs que j'ai mis à jour pour réactualiser les fielddefs du clientdataset et j'ai rajouté dans Restresponsedatasetadapter.RootElement la valeur "salons".

    mais résultat, le fielddefs du clientdataset est différent : j'ai tous les champs au même niveau sauf le id qui reste dans le childdef du salons avec un name à "salons[0]"

    et si je jette un oeil au concepteur livebinding, mon clientdataset dupplique les elements du champ salons :

    Nom : concepteurlivebinding_salon.png
Affichages : 1289
Taille : 10,6 Ko

    au final, j'arrive à voir la liste des nom adresse cp ville tel facebook dans le grid et le listbox mais je n'ai pas le id ni le success et error, et j'ai des colonnes vides en trop (salons[0] jusqu'à[6]).

    je crois que je n'ai pas tout paramétré correctement

    un petit coup de main n'est pas de refus

    merci beaucoup.

    delaio.

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    quelle API ?

    " via un DataSource à un ClientDataSet "
    il y a peut être une autre manière de faire s'il s'agit de JSON ... à tester voir cette petite vidéo https://youtu.be/O8yM44efjQU (en faisant abstraction de la partie TMSComponent) et voir comment ça se passe ....
    mais avec livebindings, 2 niveaux il me semble que c'est un niveau de trop
    if faut certainement quelque chose d'intermédiaire

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Par défaut
    merci pour la réponse rapide !!!

    c'est une API propriétaire développée par un prestataire. j'ai regardé le tuto... quand j'appelle une autre API (du même prestataire) qui ne retourne pas de tableau et l'affectation dans le clientdataset fonctionne très bien...

    "mais avec livebindings, 2 niveaux il me semble que c'est un niveau de trop "
    effectivement c'est possible mais je ne maitrise pas suffisamment livebinding pour répondre à cette question. Est ce que 2 clientdataset serait la solution ? l'un pour le premier niveau et l'autre pour le 2ème niveau !?!!

    je vais tester... si tu as d'autres idées n'hésites pas

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Par défaut
    ah j'ai oublié de demander : c'est quoi root element et comment ça se paramètre !?!! je suppose que c'est ce qui permet de "ventiler" le tableau salons car dans la doc ils disent :

    Nom : parametre_root_element_salon.png
Affichages : 1100
Taille : 10,0 Ko

    ça explique peut être pourquoi success et error ne s'affichent pas dans le clientdataset !?!! et comment ça marche si plusieurs tableaux dans le paramètre retour !?!!

    en tout cas, quand j'enlève l'affectation à cette propriété, ça plante direct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valeur incorrecte pour le champ 'salons'

  5. #5
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    Bonsoir,

    peux-tu me fournir un petit jeu d'essai (fichier JSON) ? des idées avec livebindings j'en ai plein mais je tatonne encore beaucoup !
    peut être une liaison intermédiaire avec un TProtypeBinSource mais ...
    en tout cas rootelement me parait la bonne piste à suivre mais ce serait pas "response.salons" la valeur de la propriété ?

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Par défaut
    bonsoir,

    voici un petit jeu d'essai JSON :

    json_salons.txt

    Concernant rootelement, je n'ai toujours pas compris comment ça fonctionne mais ta proposition renvoie une erreur (j'ai peut être pas fait comme tu m'as dit aussi... )

    Quoi qu'il en soit, j'ai donc intégré 2 clientdataset pour gérer les 2 niveaux et ça donne ceci (copie d'écran du data module) :

    Nom : 2017-11-17_19h50_10.png
Affichages : 1160
Taille : 7,1 Ko

    salon1_restrepdata :
    - rootelement vide
    - fielddefs : 0-success + 1-error
    - mettre a jour l'ensemble des données : remplissage auto de salon1_cds
    - résultat de salon1_cds.fielddefs : 0-success + 1-error

    salon2_restrepdata :
    - rootelement : salons (d'autres syntaxes ne fonctionnent pas [réf "salon_restrep.salons" proposé]
    - fielddefs : 0-salons (array size 0) + 1-id + 2-nom + 3-adresse + ...
    - restrepdata.salons.childdefs : 0-id
    - mettre a jour l'ensemble des données : remplissage auto de salon2_cds
    - résultat de salon2_cds.fielddefs : 0-id + 1-nom + 2-adresse + ...

    je ne sais pas si c'est clair...

    je lie ensuite dans le concepteur livebindings grid.* avec salon2_cds.*

    ma méthode fonctionne mais ce n'est pas très propre :
    - quand clic droit sur le request et "Exécuter..." à la conception : la grid est propre mais à la compil, ça donne ceci :

    Nom : resultat_grid_salon2.png
Affichages : 1164
Taille : 8,3 Ko

    - j'ai 2 colonnes salons et salons[0] vides qui ne servent pas à grand chose mais je n'ai pas pu faire autrement car si je ne rajoute pas dans salon2_restrepdata.fielddefs['salons'].childdefs un élément 0-id alors le remplissage automatique du salon2_cds.fielddefs ne m'intégre pas à la liste 0-id qui forcément n'apparaitra pas à la compil dans ma grid !!!

    et même si mon bidouillage fonctionne, je ne pense pas pouvoir m'accommoder de cette solution... je vais bientôt avoir une nouvelle api à traiter avec cette fois ci 3 niveaux (un array dans un array).

    concernant ta proposition d'utiliser TProtypeBinSource, perso, je suis novice en la matière... il faudrait m'en dire plus...

    autre question : c'est bien array comme DataType qu'il faut que j'utilise ? parce qu'il y en a pleins d'autres (http://docwiki.embarcadero.com/Libra....DB.TFieldType) mais je ne suis pas arrivée à faire autrement.

    je ne suis quand même pas la seule personne à devoir traiter des tableaux imbriqués en JSON !?!!

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

Discussions similaires

  1. Récupérer un tableau d'une page
    Par axanta dans le forum Langage
    Réponses: 5
    Dernier message: 08/12/2008, 10h32
  2. Réponses: 7
    Dernier message: 04/02/2008, 18h52
  3. Comment récupérer la taille d'une image via un lien ?
    Par MaTHieU_ dans le forum Web & réseau
    Réponses: 5
    Dernier message: 17/09/2007, 14h37
  4. Réponses: 6
    Dernier message: 12/09/2007, 15h58
  5. [Tableaux] récupérer un tableau sur une autre page
    Par samsso2005 dans le forum Langage
    Réponses: 3
    Dernier message: 27/01/2006, 22h58

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