调用Graph API时遇“Parsing OData Select and Expand failed”错误求助
你遇到的错误是因为Graph API beta版本对$expand的嵌套深度有严格限制,最多允许2层嵌套。你的请求中accessPackageResourceRoleScopes($expand=accessPackageResourceRole($expand=accessPackageResource))已经达到了3层(accessPackageResourceRoleScopes → accessPackageResourceRole → accessPackageResource),超出了允许范围。
要获取与accessPackage关联的应用或组(即accessPackageResource),可以通过拆分请求的方式实现:
方法1:分步请求
第一步:获取accessPackage的资源角色范围及角色ID
先请求目标accessPackage,展开accessPackageResourceRoleScopes并只选择必要字段(包括accessPackageResourceRoleId):GET https://graph.microsoft.com/beta/identityGovernance/entitlementManagement/accessPackages/f2b3c168-e756-40c1-8532-ad08f9fe0a77?$expand=accessPackageCatalog,accessPackageResourceRoleScopes($select=id,accessPackageResourceRoleId,accessPackageResourceScope),accessPackageAssignmentPolicies这个请求的嵌套深度是2层(accessPackage → accessPackageResourceRoleScopes),符合API限制,能正常返回数据。
第二步:根据角色ID获取对应的accessPackageResource
对第一步返回的每个accessPackageResourceRoleId,单独发送请求展开关联的accessPackageResource:GET https://graph.microsoft.com/beta/identityGovernance/entitlementManagement/accessPackageResourceRoles/{accessPackageResourceRoleId}?$expand=accessPackageResource
方法2:使用批量请求减少调用次数
如果需要获取多个角色对应的资源,可以用Graph API的批量请求功能,一次性发送多个查询:
POST https://graph.microsoft.com/beta/$batch Content-Type: application/json { "requests": [ { "id": "1", "method": "GET", "url": "/identityGovernance/entitlementManagement/accessPackageResourceRoles/{roleId1}?$expand=accessPackageResource" }, { "id": "2", "method": "GET", "url": "/identityGovernance/entitlementManagement/accessPackageResourceRoles/{roleId2}?$expand=accessPackageResource" } // 可以继续添加更多请求 ] }
这样就能绕过$expand的深度限制,成功获取到与accessPackage关联的应用或组信息。
内容的提问来源于stack exchange,提问作者Debbie Johnson

