Power BI Tandem连接器认证异常:Models正常Assets失败求助
问题分析与修复方案
两个关键问题导致认证失败
GetModelAssets函数存在语法冗余
函数末尾in result;之后多了一行无效的data;代码,会干扰函数正常返回结果,必须删除。资产接口请求未携带认证令牌
调用/modeldata接口时,Web.Contents的Headers里没有添加Authorization = "Bearer " & accessToken,而Autodesk所有需权限的接口都必须携带该令牌头,这是认证失败的核心原因。
修复后的完整M代码
GetFacilityModels = (baseUrl as text, twinId as text, accessToken as text) as list => let url = baseUrl & "/twins/" & twinId, response = Web.Contents(url, [Headers = [#"Authorization" = "Bearer " & accessToken]]), data = Json.Document(response), models = data[links], result = List.Transform(models, each Record.Field(_, "modelId")) in result; // Function to process model assets GetModelAssets = (baseUrl as text, urn as text, accessToken as text) => let // Define the endpoint URL url = baseUrl & "/modeldata/" & urn & "/scan", input = "{\"families\": [ \"n\", \"z\" ], \"includeHistory\": false, \"skipArrays\":true}", response = Web.Contents( url, [ Headers = [ #"Content-Type"="application/json", #"Authorization" = "Bearer " & accessToken // 新增认证头 ], Content = Text.ToBinary(input) ] ), // Parse the JSON response data = Json.Document(response), result = data in result; // 删除了冗余的data; // Function to combine all assets into a table GetAssetsTable = (baseUrl as text, twinId as text, accessToken as text) => let modelList = GetFacilityModels(baseUrl, twinId, accessToken), assetList = List.Transform(modelList, each GetModelAssets(baseUrl, _, accessToken)), validTables = List.RemoveNulls(assetList), result = Table.Combine(validTables) in result; // Helper function to check if an item is an asset _IsAsset = (item as record) => let isAsset = Record.HasFields(item, {"n:n", "n:!n"}) in isAsset; // Function to retrieve model list [DataSource.Kind="connectortest", Publish="connectortest.Models.Publish"] shared connectortest.Models = () => let baseUrl = "https://developer.api.autodesk.com/tandem/v1", twinID = "urn:adsk.dtt:uSyCHvt1QmakLrZ8g4NSdg", tokenResponse = GetAccessToken(), accessToken = tokenResponse[access_token], modelList = GetFacilityModels(baseUrl, twinID, accessToken) in modelList; // Function to retrieve asset list [DataSource.Kind="connectortest", Publish="connectortest.Assets.Publish"] shared connectortest.Assets = () => let baseUrl = "https://developer.api.autodesk.com/tandem/v1", modelID2 = "urn:adsk.dtm:iXzvRVKqQL6q0WYL01oKgA", tokenResponse = GetAccessToken(), accessToken = tokenResponse[access_token], assetList = GetModelAssets(baseUrl, modelID2, accessToken) in assetList; // Data Source Kind description connectortest = [ Authentication = [ Anonymous = [] // No login UI needed for 2-legged token ] ];
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

