Forum Discussion
Nueva conexión API
Hola @Giovanni_Brutto
To answer your second question first:
When you said you tried to amend it, did you simply replace the URL withapi_url = "https://api-jb2.integrations.ecimanufacturing.com/api/v1/job-materials"
If so it should work , what error did you receive when you tried it?
Para tu primera pregunta:
Sí, puedes pasar el parámetro del token de una consulta a otra, como se muestra a continuación. Sin embargo, generalmente es mejor mantener la generación del token dentro de la misma consulta a menos que tengas un requisito específico. Incluso un pequeño retraso entre actualizaciones de consulta puede causar problemas si el token expira o se actualiza fuera de sincronía.
Consulta GetToken
let
client_id = "YOUR_CLIENT_ID",
client_secret = "YOUR_CLIENT_SECRET",
token_url = "https://api-user.integrations.ecimanufacturing.com/oauth2/api-user/token",
tokenBody =
"grant_type=client_credentials"
& "&scope=openid"
& "&client_id=" & client_id
& "&client_secret=" & client_secret,
tokenResponse =
Json.Document(
Web.Contents(
token_url,
[
Headers = [
#"Content-Type" = "application/x-www-form-urlencoded",
Accept = "application/json"
],
Content = Text.ToBinary(tokenBody)
]
)
)
in
tokenResponse
Consulta de JobMaterials
let
// Read token from GetToken query
AccessToken = GetToken()[access_token],
api_url = "https://api-jb2.integrations.ecimanufacturing.com/api/v1/job-materials",
apiResponse =
Json.Document(
Web.Contents(
api_url,
[
Headers = [
Authorization = "Bearer " & AccessToken,
Accept = "application/json"
]
]
)
),
// API usually returns a list of records
AsList =
if apiResponse is list then
apiResponse
else if apiResponse is record and Record.HasFields(apiResponse, "data") then
apiResponse[data]
else
{},
TableOut =
if List.Count(AsList) > 0 then
let
tbl = Table.FromList(AsList, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
firstRecord = tbl{0}[Column1],
expanded = Table.ExpandRecordColumn(tbl, "Column1", Record.FieldNames(firstRecord))
in
expanded
else
#table({}, {})
in
TableOut
Hola @kushanNa,
Sigue requiriendo las páginas como variable (y si introduzco algunos valores, se me equivoca). Lo que necesito es un bucle desde la página 1 hasta el final para sacar toda la paginación. Espero que tenga sentido.
John
- Syndicate_Admin11 months ago
Administrator
Hola @Giovanni_Brutto
¿Puedes probar este código y enviarme una captura de pantalla del primer paso en el que te está dando un error?
let // ----------------------------- // 1. OAuth Token Request // ----------------------------- client_id = "YOUR_CLIENT_ID", client_secret = "YOUR_CLIENT_SECRET", token_url = "https://api-user.integrations.ecimanufacturing.com/oauth2/api-user/token", tokenResponse = Json.Document( Web.Contents( token_url, [ Headers = [ #"Content-Type" = "application/x-www-form-urlencoded", Accept = "application/json" ], Content = Text.ToBinary( "grant_type=client_credentials" & "&scope=openid" & "&client_id=" & client_id & "&client_secret=" & client_secret ) ] ) ), access_token = tokenResponse[access_token], // ----------------------------- // 2. Paging Function (calls API) // ----------------------------- PageSize = 200, GetPage = (Skip as number) => let url = "https://api-jb2.integrations.ecimanufacturing.com/api/v1/job-materials" & "?take=" & Number.ToText(PageSize) & "&skip=" & Number.ToText(Skip), response = Json.Document( Web.Contents( url, [ Headers = [ Authorization = "Bearer " & access_token, Accept = "application/json" ] ] ) ), items = if response is list then response else if response is record and Record.HasFields(response, "data") then response[data] else {} in items, // ----------------------------- // 3. Generate list of pages until empty // ----------------------------- Pages = List.Generate( () => [Skip = 0, Data = GetPage(0)], each List.Count([Data]) > 0, each [Skip = [Skip] + PageSize, Data = GetPage([Skip] + PageSize)], each [Data] ), AllItems = List.Combine(Pages), // ----------------------------- // 4. Convert to Table // ----------------------------- Output = if List.Count(AllItems) = 0 then #table({}, {}) else let tbl = Table.FromList(AllItems, Splitter.SplitByNothing(), null, null, ExtraValues.Error), expanded = Table.ExpandRecordColumn(tbl, "Column1", Record.FieldNames(tbl{0}[Column1])) in expanded in OutputLa función no está ahí para que la introduzcamos manualmente, en realidad está ahí para añadir datos automáticamente.
- Syndicate_Admin11 months ago
Administrator
Hola, @kushanNa
El primer paso como bloqueador es el paso de Obtener Página: es pedir un parámetro: como dije antes, un bucle anutomático sería mejor.
Incluso si introduzco un parámetro (probé con 1), la función invocada que se crea acaba en error.
Como dije antes, si puede ayudar, estoy disponible para una sesión en equipo. Solo avísame.
- Syndicate_Admin11 months ago
Administrator
Hola @kushanNa ,
Disculpa si te molesto, pero estoy en problemas con ello.
¿Tienes mi mensaje? ¿Alguna opinión?
Atentamente
John
- Syndicate_Admin11 months ago
Administrator