Besoin d’aide – API et pagination
-
Besoin d’aide – API et pagination
Posté par Samuel sur 29 mai 2024 à 17h17Bonjour,
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 5 mois, 1 semaine 3 Membres · 17 Réponses -
17 Réponses
-
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
-
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” -
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.
-
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().
-
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
-
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
SourcePourriez-vous me dire où dois-je mettre la fonction Number.list() ?
Merci à vous !
-
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> -
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”.
-
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.
-
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 👌
-
Merci pour votre gentillesse..
Question, FactAPICallInfo c’est mon API ?
-
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.
Connectez-vous pour répondre.