如何使用 Microsoft Graph API 检索用户的个人资料和用户的日历?

How to retrieve the user's profile and the user's calendars using the Microsoft Graph API?

我可以使用 Microsoft Graph API 检索用户的个人资料,以及他们在我的 Web 应用程序中的日历。有时,我必须在一个请求中得到它们;比如网络太慢或者什么原因。但是,API GET /me 的响应中没有关于日历的 属性。我该如何处理?

我在 Graph Client 中使用了以下代码:

// get the user's profile
var me = await _serviceClient.Me.Request().GetAsync();

// list the user's calendars
var result = _serviceClient.Me.Calendars.Request().GetAsync();

谁能帮帮我?非常感谢。

Microsoft Graph 的核心是 API 聚合器。换句话说,它充当多个产品 API 的代理(Azure Active Directory、Exchange Online、SharePoint、OneDrive、OneNote 等)。通常,您无法跨 API 边界检索数据。

在这种情况下,/me 从 Azure Active Directory 中提取数据,而 /calendars 从 Exchange Online 中提取数据。因此,您无法通过一次调用检索两个结果集。

您可以使用 JSON Batching 来估计单个调用,但我不确定它是否会产生很大的不同。与一次调用相比,两次调用的开销非常小,而且无论如何,结果的大小应该几乎相同。 JSON 批处理允许您进行单个调用,但它需要稍大的请求负载(JSON 才能执行),而且结果大小应该与两次调用相同)。我希望任何性能差异充其量可以忽略不计。

根据您的描述,我假设您想获取用户的个人资料并在一个请求中列出他的个人资料。

参考this document,我们可以用下面的API来实现

`https://graph.microsoft.com/v1.0/$batch`

我们可以把这两个请求放在正文中,像这样:

`{
  "requests": [
    {
      "id": "1",
      "method": "GET",
      "url": "/me"
    },
    {
      "id": "2",
      "method": "GET",
      "url": "/me/calendars"
    }
    ]
}`

我们可以得到这样的结果(为简洁起见,屏幕截图已被截断)

补充一下 Marc 的评论,您不应该假设批处理是最快的解决方案,因为 HTTP 请求可以并行发出。 Tasks 确实需要花一些时间,但没有理由需要按顺序执行多个调用。

这是一个来自 Fiddler 的时间线,其中一个批处理调用与其他两个调用执行相同的操作。