Forum Discussion

Syndicate_Admin's avatar
Syndicate_Admin
Administrator
3 years ago

SDK de Power Query: problemas al paginar una API de REST

Hola a todos

Estoy buscando diseñar un conector personalizado de PowerBI que permita conectarse a una API de REST específica.
Hasta ahora, pude autenticar, recuperar resultados y mostrarlos en PowerBI.

Los problemas comienzan cuando intento introducir la lógica de paginación e incluir algún tipo de pausa entre cada llamada a la API, para dar tiempo a la API para preparar los resultados.
Por favor, necesitaría su ayuda para tener pistas sobre lo que podría mejorarse para solucionar tal situación.
Aquí hay una descripción general de dicho código:

[DataSource.Kind="myFunction", Publish="myFunction.Publish"]
shared myFunction.Contents = () =>
dejar
Variables
login = "login",
contraseña = "contraseña",
start_date = "2022-01-01",
codetype="WES",
Pausar la definición entre cada llamada paginada
Pause = () => Duration.From(Duration.Seconds * 10),
Función de llamada
CallAPI = (json_refresh) =>
dejar
Autenticación
authenticated = Web.Contents(url, [
Encabezados = [
#"Content-Type" = "application/json",
#"Authorization" = "Basic " & Binary.ToText(Text.ToBinary(login & ":" & password), BinaryEncoding.Base64)
],
Contenido = Json.FromValue(json_refresh)
]),
Extracción de datos
body = Json.Document(autenticado),
IsTransactionComplete = body[response][isTransactionComplete],
TransactionUniqueIdentifier = body[response][transactionUniqueIdentifier],
fullset = cuerpo[respuesta][resultados],
Extracción de valores
recordtypes = List.Transform(fullset, each try _[entityType] de lo contrario null),
squareEids = List.Transform(fullset, cada probar Record.FieldOrDefault(Record.FieldOrDefault(Record.FieldOrDefault(_[cuadrado],"datos"), "DQO,1"), "squareEid") de otra manera nulo),
dotEids = List.Transform(fullset, each try _[dot][dotEid] de lo contrario null),
circleEids = List.Transform(fullset, each try _[circle][circleEid] de lo contrario null),
Definición de registro
combinedValues = List.Zip(
{
tipos de registro,
squareEids,
dotEids,
circleEids
}
),
records = List.Transform(combinedValues,
cada [
EntityType = _{0},
Square.SquareEid = _{1},
Dot.DotEid = _{2},
Circle.CircleEid = _{3}
]
),
table = Table.FromRecords(records)
en
[IsTransactionComplete = IsTransactionComplete, TransactionUniqueIdentifier = TransactionUniqueIdentifier, Table = table],
Llamada inicial
json_refresh = [
isoDateFrom = start_date,
codType = codetype
],
initialResult = CallAPI(json_refresh),
Bucle para próximas llamadas
bucle = (resultado) =>
dejar
isComplete = resultado[IsTransactionComplete],
transactionId = resultado[TransactionUniqueIdentifier]
en
if isComplete then
resultado
más
dejar
json_refresh_iteration = [
isoDateFrom = start_date,
codType = codetype,
transactionUniqueIdentifier = transactionId
],
refreshedResult = CallAPI(json_refresh_iteration)
en
refreshedResult,
Bucle hasta que termine
resultados = List.Generate(
() => initialResult,
each [IsTransactionComplete] = false,
cada bucle(_)
cada pausa()
),
¡Y combina resultados!
combinedTable = Table.Combine(List.Transform(results, each [Table]))
en
combinedTable;

Si esto puede ayudar a entender mejor:

-Se realiza una 1ª llamada a la API. Las llamadas a la API aquí se basan en POST JSON realizadas en un servicio web autenticado.

-Basándonos en la respuesta, buscamos si isTransactionComplete es true o false.

-Si es falso, entonces debemos realizar una llamada paginada.

-El formato de la llamada es básicamente el mismo que el primero, pero incluyendo un identificador único de transacción recopilado a través de las respuestas obtenidas.

Después de la segunda llamada a través del código de Visual Studio, el código simplemente se bloquea.

Lo mismo sobre PowerBI, pero después de la segunda llamada paginada esta vez (3ª llamada global).

Revisé en el lado del servicio web, nada parece esperar allí. Las próximas llamadas simplemente no suceden.

¿Puede ayudarme y sugerirme qué podría mejorarse?

¡Gracias de antemano por su ayuda en esto!

1 Reply

  • ¿No tienes idea de esto?

    ¿Tal vez una forma alternativa de proponer un conector personalizable de esta manera?

    Gracias de nuevo por su ayuda!