大家在使用Graph API開發Teams App的時候,有時候會需要獲取某個租戶Tenant的所有team,在寫這篇文章的時候Graph API并沒有提供這么一個功能,沒有一個類似于”GET /teams”的api。
在Micorsoft Graph官方文檔的已知問題中,也提到了目前不支持這么一個api。
https://docs.microsoft.com/en-us/graph/known-issues?view=graph-rest-beta#get-teams-is-not-supported
那如果我們開發的app想要獲取team列表,有其他什么方法嗎?
我們現在想一下Microsoft Teams中每個team是一個什么概念?在AzureAD中,一個team實際上就是一個AzureAD中的group。group是可以通過graph api來列舉的。實際上在Group中有一個屬性叫resourceProvisioningOptions
,它的定義如下:?https://docs.microsoft.com/en-us/graph/group-set-options
Supported values for resourceProvisioningOptions | Description | Default if not set |
---|---|---|
Teams | Provision this group as a team in Microsoft Teams. Additionally, this value can be added to the resourceProvisioningOptions string collection on group update through a?PATCH ?operation, in order to convert an existing Microsoft 365 group to a team. | The group is a regular Microsoft 365 group without Teams capabilities. |
可以知道,原來我們通過這個屬性就可以來判斷這個group是不是一個Teams里的team。
GET /groups?$select=id,resourceProvisioningOptions
這個接口會返回如下的內容
{"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#groups","value": [{"id": "00e897b1-70ba-4cb9-9126-fd5f95c4bb78","resourceProvisioningOptions": []},{"id": "00f6e045-f884-4359-a617-d459ee626862","resourceProvisioningOptions": ["Team"]}]
}
可以發現第一個group不是team,第二個group是,因為第二個group的?resourceProvisioningOptions
?里含有?Team
。
看到這里,大家可能會問,一個租戶里的group有很多,我如果拿到了所有的group,再自己過濾是不是有點浪費。有沒有更好的方法來直接返回所有的team?
有!我們需要借助方便的OData查詢語法,如下:
GET /groups?$filter=resourceProvisioningOptions/Any(x:x eq 'Team')
上面這個調用就可以返回租戶中的所有的team,實際上就是?GET /teams
?要做的東西了。注意上面的?$filter
?的表達式,如果大家想具體深入的學習這些查詢條件的語法,可以查看這個文檔,學會了后你會覺得使用graph api原來如此方便。可以把很多原來需要在查詢端做的事情,都讓graph api服務來完成。
https://docs.microsoft.com/en-us/graph/query-parameters#filter-parameter