You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Power BI Tandem连接器认证异常:Models正常Assets失败求助

问题分析与修复方案

两个关键问题导致认证失败

  1. GetModelAssets函数存在语法冗余
    函数末尾in result;之后多了一行无效的data;代码,会干扰函数正常返回结果,必须删除。

  2. 资产接口请求未携带认证令牌
    调用/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:20:06