Ir para conteúdo
  • 0

PAGINAÇÃO DE API


FrancoAndre
Ir para solução Solucionado por Erick Oliveira ,

Pergunta

  • Alunos

Galera tenho esse código que faz uma consulta numa api e retorna o data (lista com os dados) e pagination (records com número página e próxima página):

let
    Source = Web.Contents(
        url,
        [
            RelativePath = "road-speed-events",
            Headers = [
                Accept = "application/json",
                #"Content-Type" = "application/json",
                #"cobli-api-key" = api_key
            ],
            Query = [
                limit = Number.ToText(100),
                page = Number.ToText(1),
                start_date = Date.ToText(Date.AddDays(Date.From(DateTime.LocalNow()), - (365 - 1)), "yyyy-MM-dd", "pt-BR"),
                end_date = Date.ToText(Date.From(DateTime.LocalNow()), "yyyy-MM-dd", "pt-BR"),
                timezone = "America/Sao_Paulo"
            ]
        ]
    ),
    json = Json.Document(Source)
in
    json

Preciso de um código que faça um looping de paginação e combine os dados de todas as páginas e no final ter a tabela completa.

image.png.cfe1cedee86e09a73a60bcc3bb828354.png

 

O número de páginas ta respeitando da API e na documentação é informado uma limitação de 50 requests por segundo.

Alguém poderia ajudar?

Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0
  • Alunos
  • Solução

@FrancoAndre

Faça esse ajuste no final da função:
 

(page as number) as table =>
    let
        Source = Web.Contents(
            url,
            [
                RelativePath = "road-speed-events",
                Headers = [
                    Accept = "application/json",
                    #"Content-Type" = "application/json",
                    #"cobli-api-key" = api_key
                ],
                Query = [
                    limit = Number.ToText(100),
                    page = Number.ToText(page),
                    start_date = Date.ToText(
                        Date.AddDays(Date.From(DateTime.LocalNow()), - (365 - 1)), "yyyy-MM-dd", "pt-BR"
                    ),
                    end_date = Date.ToText(Date.From(DateTime.LocalNow()), "yyyy-MM-dd", "pt-BR"),
                    timezone = "America/Sao_Paulo"
                ]
            ]
        ),
        json = Json.Document(Source)
    in
        json[data]
Link para o comentário
Compartilhar em outros sites

  • 1
  • Alunos

Fala @FrancoAndre,

Tenho algo semelhante que talvez se aplique a você, mas vale umas alterações:

Primeiro transforme o seu código em uma função e chame-a de fxBuscarDados:

(page as number) as table =>
    let
        Source = Web.Contents(
            url,
            [
                RelativePath = "road-speed-events",
                Headers = [
                    Accept = "application/json",
                    #"Content-Type" = "application/json",
                    #"cobli-api-key" = api_key
                ],
                Query = [
                    limit = Number.ToText(100),
                    page = Number.ToText(page),
                    start_date = Date.ToText(
                        Date.AddDays(Date.From(DateTime.LocalNow()), - (365 - 1)), "yyyy-MM-dd", "pt-BR"
                    ),
                    end_date = Date.ToText(Date.From(DateTime.LocalNow()), "yyyy-MM-dd", "pt-BR"),
                    timezone = "America/Sao_Paulo"
                ]
            ]
        ),
        json = Json.Document(Source)
    in
        Source

Depois utilize o código abaixo para acumular as tabelas:

let
    NumberPages = 100000, // Selecione um número de páginas limites para mapear
    FetchAllPages = List.Accumulate(
        List.Numbers(1, NumberPages), 
        {},
        (state, current) =>
            let
                // Buscar dados da página atual
                currentPageData = fxBuscarDados(current),
                // Verificar se a página atual retornou algum dado
                hasData = Table.RowCount(currentPageData) > 0,
                // Se a página atual não tiver dados, retorna o estado acumulado
                Condition = 
                    if hasData then
                        List.Combine({state, currentPageData})
                    else
                        state
            in
                condition
    ),
    // Chamar a função para todas as páginas e converter para tabela
    AllData = Table.FromList(FetchAllPages, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
in
    AllData

 

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
17 minutos atrás, Erick Oliveira disse:

Fala @FrancoAndre,

Tenho algo semelhante que talvez se aplique a você, mas vale umas alterações:

Primeiro transforme o seu código em uma função e chame-a de fxBuscarDados:

(page as number) as table =>
    let
        Source = Web.Contents(
            url,
            [
                RelativePath = "road-speed-events",
                Headers = [
                    Accept = "application/json",
                    #"Content-Type" = "application/json",
                    #"cobli-api-key" = api_key
                ],
                Query = [
                    limit = Number.ToText(100),
                    page = Number.ToText(page),
                    start_date = Date.ToText(
                        Date.AddDays(Date.From(DateTime.LocalNow()), - (365 - 1)), "yyyy-MM-dd", "pt-BR"
                    ),
                    end_date = Date.ToText(Date.From(DateTime.LocalNow()), "yyyy-MM-dd", "pt-BR"),
                    timezone = "America/Sao_Paulo"
                ]
            ]
        ),
        json = Json.Document(Source)
    in
        Source

Depois utilize o código abaixo para acumular as tabelas:

let
    NumberPages = 100000, // Selecione um número de páginas limites para mapear
    FetchAllPages = List.Accumulate(
        List.Numbers(1, NumberPages), 
        {},
        (state, current) =>
            let
                // Buscar dados da página atual
                currentPageData = fxBuscarDados(current),
                // Verificar se a página atual retornou algum dado
                hasData = Table.RowCount(currentPageData) > 0,
                // Se a página atual não tiver dados, retorna o estado acumulado
                Condition = 
                    if hasData then
                        List.Combine({state, currentPageData})
                    else
                        state
            in
                condition
    ),
    // Chamar a função para todas as páginas e converter para tabela
    AllData = Table.FromList(FetchAllPages, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
in
    AllData

 

Opa, Erick! Retornou 500 Internal Server Error 😞


image.png.817649eee128d218097c634b5fd4344e.png

Será que limitação de request foi estourada?

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
22 horas atrás, Erick Oliveira disse:

@FrancoAndre Altera a variável NumberPages para um número pequeno, tipo 10, e faz o teste.

Fiz a alteração mas apresentou outro erro na etapa FetchAllPages:

image.png.955b172c58f7e11fa27303e8e02685eb.png

 

Tentei ajuda com o chatgpt e ele sugeriu converter currentPageData em uma lista antes de combiná-la com o state ficando List.Combine({state, Table.ToRows(currentPageData)}), porém apresentou o mesmo problema:

image.png.f7cc447a0d70487988647c4cfc25b3ce.png

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
Em 06/01/2024 em 16:20, Erick Oliveira disse:

@FrancoAndre

Faça esse ajuste no final da função:
 

(page as number) as table =>
    let
        Source = Web.Contents(
            url,
            [
                RelativePath = "road-speed-events",
                Headers = [
                    Accept = "application/json",
                    #"Content-Type" = "application/json",
                    #"cobli-api-key" = api_key
                ],
                Query = [
                    limit = Number.ToText(100),
                    page = Number.ToText(page),
                    start_date = Date.ToText(
                        Date.AddDays(Date.From(DateTime.LocalNow()), - (365 - 1)), "yyyy-MM-dd", "pt-BR"
                    ),
                    end_date = Date.ToText(Date.From(DateTime.LocalNow()), "yyyy-MM-dd", "pt-BR"),
                    timezone = "America/Sao_Paulo"
                ]
            ]
        ),
        json = Json.Document(Source)
    in
        json[data]

Permanece o mesmo erro 
image.png.1e044f230036d493f80d168ed545271f.png

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
11 horas atrás, FrancoAndre disse:

Permanece o mesmo erro 
image.png.1e044f230036d493f80d168ed545271f.png

Fiz uma alteração na função para ser retornado uma tabela e na consulta, na etapa FetchAllPages onde se encontra uma condição, envolvi o currentPageData com chaves para transformar em lista, ficando: List.Combine({state, {currentPageData}}). Com isso a tabela paginada com todos os dados foi gerada!

Agrade pelo código Erick, ajudou bastante! Grato!

Link para o comentário
Compartilhar em outros sites

Faça login para comentar

Você vai ser capaz de deixar um comentário após fazer o login



Entrar Agora
×
×
  • Criar Novo...