Besoin d’aide – API et pagination

  • Besoin d’aide – API et pagination

    Posté par Samuel sur 29 mai 2024 à 17h17

    Bonjour,

    J’ai un projet dans lequel, je dois sortir une table complète de données venant d’une API.

    L’API contient 58 pages et chaque page 30 blocs Json.

    Comment puis-je faire pour avoir tous les blocs de toutes les pages sur une seule table de données ?

    Merci à vous !

    Samuel a répondu Il y a 2 mois, 3 semaines 3 Membres · 17 Réponses
  • 17 Réponses
  • Brice

    Membre
    4 juin 2024 à 16h23

    Bonjour

    Il faut faire une liste du nombre de page et faire un appel de votre API en faisant un lien relatif et fonction intégrant le numéro de page je peux vous faire un exemple si vous voulez ça pourrais vous permettre d’avoir un aperçu

  • Brice

    Membre
    4 juin 2024 à 16h30

    Voici un exemple :

    Je sais pas si ca peut vous aider

    Bonjour

    Il faut faire une liste du nombre de page et faire un appel de votre API en faisant un lien relatif et fonction intégrant le numéro de page je peux vous faire un exemple si vous voulez ça pourrais vous permettre d’avoir un aperçu

    (NumPage as text) => let
    Source = Json.Document(Web.Contents(“https://votre.api.com/”,
    [
    RelativePath=”/chemin/relatif/?numpage=”&NumPage
    ]))
    in
    #”Source”

  • Samuel

    Membre
    5 juin 2024 à 7h23

    Bonjour Brice,

    Merci pour votre réponse, mais il me semble que ce script en Python demande une entrée ?

    Si c’est le cas, il faudrait trouver le nombre de page max qui se trouve dans l’appel de l’API et à partir de là, faire une boucle.

    Lors de l’appel de l’API le retour en json donne un item page_last qui correspond à la dernière page.

    J’aimerais que ma requête ou fonction en Python soit automatique en lecture.

    Bien à vous,

    Sam.

  • Brice

    Membre
    6 juin 2024 à 9h48

    Oui l’entrée c’est votre nombre de page qui peux s’obtenir faisait un un calcul automatique et en générant une liste qui sera elle même réduite ou allongé selon la quantité de données fourni

    Fonction Number.list().

  • Samuel

    Membre
    6 juin 2024 à 17h38

    Bonjour Brice,

    Merci à vous…

    Je vais tester votre solution et reviens vers vous.

    Je sais que l’API créée en php par notre DSI comporte un paramètre pagination car il y a beaucoup de données.

    Donc je dois trouver un contournement.

    Merci à vous,

    Sam

  • Samuel

    Membre
    8 juin 2024 à 11h08

    Voilà ce que j’obtiens.

    (NumPage as text) =>
    let
    Source = Json.Document(Web.Contents(“Mon API”,
    [
    Headers=[#”X-Gravitee-Api-Key”=”Ici la clé”],
    RelativePath=”/api/vehicules/v1/vehicules?page=”&NumPage
    ]))
    in
    Source

    Pourriez-vous me dire où dois-je mettre la fonction Number.list() ?

    Merci à vous !

  • Jonathan

    Membre
    8 juin 2024 à 17h22

    Bonjour Samuel,

    Quand vous faites cet appel API de manière unitaire, par exemple pour la page 1, l’API ne vous renvoie pas d’information concernant le nombre de pages au total c’est bien ça ?

    Assez souvent les APIs renvoient des informations, soit sur le nombre de pages à appeler, soit sur le nombre d’éléments total et le nombre d’éléments par page (à nous de calculer le nombre d’appels à faire).

    Si ce n’est pas le cas, vous pouvez générer par exemple une liste de 1 à 10 pour tester = {1..10} puis vous appliquez votre fonction sur cette liste (que vous aurez au préalable convertie en table).

    Vous verrez déjà si cela fonctionne et peut-être verrez-vous des tables vides ou des erreurs à la suite de cet appel. Vous pourrez gérer ça assez facilement côté Power Query je pense.

    Je vous donne un exemple d’appel avec de la pagination :

    <div>
    <div>let</div>
    <div> method = “Document.getList”,</div>
    <div> param = “””doctype””: “”invoice”””,</div>
    <div> Source = FactAPICallInfo(method, APINbPerPage, “1”, param),</div>
    <div> infos = Source[infos],</div>
    <div> nbpages = infos[nbpages],</div>
    <div> List_Pages= {1..nbpages},</div>
    <div> Converted_to_Table = Table.FromList(List_Pages, Splitter.SplitByNothing(), null, null, ExtraValues.Error),</div>
    <div> Renamed_Columns = Table.RenameColumns(Converted_to_Table”, {{“Column1”, “NumPage”}}),</div>
    <div> Changed_Type = Table.TransformColumnTypes(Renamed_Columns, {{“NumPage”, type text}}),</div>
    <div> Added_Custom = Table.AddColumn(Changed_Type, “Custom”, each FactGetAPIData(method, [NumPage], param))</div>
    <div>in</div>
    <div>Added_Custom</div>
    <div> </div>
    <div>Au début, j’appelle l’API pour connaître le nombre de pages. Ensuite je crée une liste de 1 au nombre total puis j’appelle ma fonction X fois. </div>
    <div> </div>
    <div>Donc je récapitule : vous gardez votre fonction en l’état. Vous créez pour le moment une liste de 1 à mettons 10 (Dans une nouvelle requête). Vous convertissez cette liste en table (vous changez le type en texte) puis vous appelez votre votre fonction sur cette colonne.</div>
    <div> </div>
    <div>Ensuite si ça marche, vous agrandissez le 10 jusqu’à trouver des nulls pour voir comment gérer les “problèmes”.</div>
    </div>

  • Jonathan

    Membre
    8 juin 2024 à 17h23

    Bonjour Samuel,

    Quand vous faites cet appel API de manière unitaire, par exemple pour la page 1, l’API ne vous renvoie pas d’information concernant le nombre de pages au total c’est bien ça ?

    Assez souvent les APIs renvoient des informations, soit sur le nombre de pages à appeler, soit sur le nombre d’éléments total et le nombre d’éléments par page (à nous de calculer le nombre d’appels à faire).

    Si ce n’est pas le cas, vous pouvez générer par exemple une liste de 1 à 10 pour tester = {1..10} puis vous appliquez votre fonction sur cette liste (que vous aurez au préalable convertie en table).

    Vous verrez déjà si cela fonctionne et peut-être verrez-vous des tables vides ou des erreurs à la suite de cet appel. Vous pourrez gérer ça assez facilement côté Power Query je pense.

    Je vous donne un exemple d’appel avec de la pagination :

    let

    method = “Document.getList”,

    param = “””doctype””: “”invoice”””,

    Source = FactAPICallInfo(method, APINbPerPage, “1”, param),

    infos = Source[infos],

    nbpages = infos[nbpages],

    List_Pages= {1..nbpages},

    Converted_to_Table = Table.FromList(List_Pages, Splitter.SplitByNothing(), null, null, ExtraValues.Error),

    Renamed_Columns = Table.RenameColumns(Converted_to_Table”, {{“Column1”, “NumPage”}}),

    Changed_Type = Table.TransformColumnTypes(Renamed_Columns, {{“NumPage”, type text}}),

    Added_Custom = Table.AddColumn(Changed_Type, “Custom”, each FactGetAPIData(method, [NumPage], param))

    in

    Added_Custom

    Au début, j’appelle l’API pour connaître le nombre de pages. Ensuite je crée une liste de 1 au nombre total puis j’appelle ma fonction X fois.

    Donc je récapitule : vous gardez votre fonction en l’état. Vous créez pour le moment une liste de 1 à mettons 10 (Dans une nouvelle requête). Vous convertissez cette liste en table (vous changez le type en texte) puis vous appelez votre fonction sur cette colonne.

    Ensuite si ça marche, vous agrandissez le 10 jusqu’à trouver des nuls pour voir comment gérer les “problèmes”.

    • Cette réponse a été modifiée Il y a 3 mois par  Jonathan.
    • Cette réponse a été modifiée Il y a 3 mois par  Jonathan.
    • Cette réponse a été modifiée Il y a 3 mois par  Jonathan.
  • Jonathan

    Membre
    8 juin 2024 à 17h28

    C’est franchement laborieux pour formater son texte ici 😂

  • Samuel

    Membre
    9 juin 2024 à 9h01

    Bonjour Jonathan,

    Merci de prendre un peu de temps.

    Je comprends très bien ce que vous dites, c’est très explicite.

    Dans mon appel API, par défaut j’ai la page 1 avec 30 résultats, si je demande la page 2, j’aurais la page 2 avec 30 résultats.

    Donc je vais travailler votre exemple et je vous tiens au courant.

    Merci à vous,

    Sam.

  • Jonathan

    Membre
    9 juin 2024 à 10h47

    Parfait, j’espère que vous arriverez à finaliser votre requête. Je pense que si l’API ne retourne rien comme info intéressante, il faudra faire une fonction récursive qui s’appelle elle-même jusqu’au moment où le résultat est vide. J’ai préparé un exemple pour plus tard 👌

  • Samuel

    Membre
    9 juin 2024 à 11h25

    Merci pour votre gentillesse..

    Question, FactAPICallInfo c’est mon API ?

  • Jonathan

    Membre
    9 juin 2024 à 11h31

    Oui et non, dans mon exemple, c’est un premier appel qui permet d’obtenir les infos de la pagination, qu’à priori vous n’avez pas.

  • Samuel

    Membre
    9 juin 2024 à 19h07

    Ah, je crois que cela s’intitule page_last dans mon API

  • Jonathan

    Membre
    9 juin 2024 à 19h17

    Ce sera donc plus simple 👌

Page 1 sur 2

Connectez-vous pour répondre.