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!
dax
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.