Llamadas a API con paginación (no odata)

Un usuario Pregunto ✅

Yodas bigotes

Hola,

Soy realmente nuevo en las API y estoy luchando para que funcione un código de bucle para garantizar que se extraigan todos los registros, actualmente tiene un límite de 1000.

He usado el ejemplo de https://community.powerbi.com/t5/Desktop/REST-API-Pagination-converting-records-to-text/td-p/681809 pero recibo el siguiente error:

Expression.Error: No podemos aplicar el acceso de campo al tipo List.
Detalles:
Valor =[List]

El código es el siguiente:

dejar
BaseUrl = «https://api.rotacloud.com/v1/shifts?start=1569888000&end=1755875832»,
Token = «SecretToken»,
EntitiesPerPage = 1000,
Opciones = [Headers=[ #»Authorization» = «Bearer » & Token ]],
Url = BaseUrl,

GetJson = (Url) =>
dejar
RawData = Web.Contents (Url, Opciones),
Json = Json.Document (RawData)
en
Json,

GetTotalCount = () =>
dejar
Json = GetJson (URL),
Entidades = Json[object.count]
en
Entidades

EntityCount = GetTotalCount (),
PageCount = Number.RoundUp (EntityCount / EntitiesPerPage),
PageIndex = {1 .. PageCount},

GetPage = (PageIndex) =>
dejar
PageUrl = BaseUrl & «page =» & Text.From (PageIndex) & Opciones,
Json = GetJson (PageUrl),
Valor = Json[data]
en
Valor,

GetUrl = (PageIndex) =>
dejar
PageNum = «page =» & Text.From (PageIndex),
PageUrl = BaseUrl y PageNum
en
URL de la página,

Urls = List.Transform (PageIndex, cada GetUrl (_)),
Pages = List.Transform (PageIndex, cada GetPage (_)),
DataList = List.Union (Páginas)
en
Lista de datos

Lo siguiente es de la documentación de la API, no estoy seguro de si ayuda o no:

Para mantener contentos a nuestros servidores, las solicitudes que devuelven varios artículos pueden paginarse. Las solicitudes paginadas incluirán dos encabezados de respuesta adicionales; ‘X-Total-Count’ (el número total de resultados) y ‘Enlace’ (que contiene una o más relaciones de enlace hipermedia).

Los valores posibles para las relaciones de enlace son; ‘siguiente’ (la relación de enlace para la siguiente página de resultados inmediata), ‘último’ (la relación de enlace para la última página de resultados), ‘primero’ (la relación de enlace para la primera página de resultados) y ‘anterior’ (la relación de enlace para la página de resultados anterior inmediata).

Opcionalmente, puede especificar un parámetro de ‘límite’ para cambiar la cantidad de resultados que se muestran por página (se aplicarán límites estrictos), y puede navegar a través de los resultados paginados usando el parámetro ‘compensación’ que le permite especificar qué resultado debe devolverse primero, p. Ej. ? limit = 10 & offset = 30 (esto devolvería 10 resultados comenzando con el registro 30).

Cualquier ayuda será muy apreciada, ¡gracias de antemano!

Hola @Yodaswhiskers,

Parece estar relacionado con el tipo, podría intentar convertir el valor de la lista en una tabla para ver si funciona o no. Agregue esta parte para ver si funciona o no.

DataList = List.Union(Pages),

    TableFromList = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
in
    TableFromList

Atentamente,
Zoe Zhi

Si esta publicación ayuda, considere Aceptarla como la solución para ayudar a los demás miembros a encontrarla más rápidamente.

Yodas bigotes

En respuesta a dax

Hola Zoe,

Muchas gracias por tu sugerencia. Lo he enmendado como está escrito:

let 
    Source = Json.Document(Web.Contents("https://api.rotacloud.com/v1/shifts?start=1569888000&end=1755875832", [Headers=[Authorization="SecretToken"]])),
    BaseUrl = "https://api.rotacloud.com/v1/shifts?start=1569888000&end=1755875832",
    Token = "SecretToken",
    EntitiesPerPage = 1000,
    Options = [Headers=[ #"Authorization" = "Bearer " & Token ]],
    Url = BaseUrl,

    GetJson = (Url) =>
        let
            RawData = Web.Contents(Url, Options),
            Json = Json.Document(RawData)
        in
            Json,

    GetTotalCount = () =>
        let
            Json = GetJson(Url),
            Entities = Json[object.count]
        in
            Entities,

    EntityCount = GetTotalCount(),
    PageCount = Number.RoundUp(EntityCount / EntitiesPerPage),
    PageIndex = { 1 .. PageCount},

    GetPage = (PageIndex) =>
        let
            PageUrl = BaseUrl & "page=" & Text.From(PageIndex) & Options,
            Json = GetJson(PageUrl),
            Value = Json[data]
        in
            Value,

    GetUrl = (PageIndex) =>
        let
            PageNum = "page=" & Text.From(PageIndex),
            PageUrl = BaseUrl & PageNum
        in
            PageUrl,

    Urls = List.Transform(PageIndex, each GetUrl(_)),
    Pages = List.Transform(PageIndex, each GetPage(_)),
    DataList = List.Union(Pages),

    TableFromList = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
in
    TableFromList

Ha eliminado el error, lo cual es bueno, pero aún está obteniendo registros de 1k. Debería haber alrededor de 80k. ¿Algunas ideas?

Gracias de nuevo por tu ayuda, es muy apreciado.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *