【问题标题】:Paging issues with Office 365 Calendar APIOffice 365 日历 API 的分页问题
【发布时间】:2015-09-24 13:09:55
【问题描述】:

我在 Office 365 REST API 中遇到了一些奇怪的分页问题。

当通过以下请求批量获取用户的所有事件时(当然,每次调用时更新skip参数):

https://outlook.office365.com/api/v1.0/users%2Ftest1@eveoh.onmicrosoft.com/Events/?$orderby=Start&$select=ID&$top=50&$skip=100

用户的日历中有 1000 多个事件,有时我每次都会收到相同的事件。在这种情况下,经过 666 次事件,具有讽刺意味的是。每次返回 odata.nextLink 并更新 skip 参数,但我返回的事件与上一页相同。该例程以无限循环结束,获取同一事件的更多事件。

另外,出于某种原因,我有时会收到比要求更大的批次。例如,根据以下请求,我得到 470 个事件,而预期为 250 个。

https://outlook.office365.com/api/v1.0/users%2Ftest1@eveoh.onmicrosoft.com/Events/?$orderby=Start&$select=ID&$top=250

有没有人也遇到过这些问题,如果有,您是如何解决的?

更多请求/响应跟踪示例说明问题can be found here

【问题讨论】:

  • 您是否尝试过提取较小的批次,例如每批次 10 或 20 条记录。
  • 在我的回答下方查看您遇到的问题。
  • 我还没有看到这个问题。如果$top$skip 参数未得到遵守,则服务中的某个地方存在错误。如果您可以在发生这种情况时提供响应标头,这将很有帮助(如果您可以使用client-request-idreturn-client-request-id 标头为您的请求提供instrument,则更有帮助。
  • 我创建了一个带有痕迹here 的 Gist。它已使用标题进行检测。它表明跳过许多事件的三个​​请求都导致返回相同的事件。不跳过(或不多)会导致不同的事件。
  • 感谢您提供详细信息。我能够自己重现这一点。我会把这个交给我们的工程师。

标签: office365 outlook-restapi office365api


【解决方案1】:

这里是返回请求事件的准确记录数的完整代码。

// The code sample below demonstrates how to get events using the Office 365 unified API (Preview).
$.ajax('https://graph.microsoft.com/beta/me/Events/?$top=1', {
        headers: { 
           Authorization: 'Bearer {token:https://graph.microsoft.com/}',
            Accept: 'application/json;odata.metadata=none',
    }
}).then(function (response) {
        for (var i = 0; i < response.value.length; i++) {
            console.log('Event "' + response.value[i].Subject + '"');
        }
        console.log('\n' + 'Full JSON response:')
        console.log(response);
    }).fail(function (error) {
        console.log(error);
    });

另外,如果你想测试一下:

1) 转到以下 url (o365 沙盒 api) -> 代码示例 -> 获取事件 -> 并选择您的语言 C# 或 JS:

https://apisandbox.msdn.microsoft.com/

2) 使用您的 o365 凭据登录。

3) 通过为您请求的最高记录添加 ?top=1 来更改查询。

4) 你会看到 api 准确地返回了请求的记录数。

希望这会有所帮助。

【讨论】:

  • 我面临的问题并不仅仅发生在每个用户身上,所以我认为我提出的请求没有问题(见上文)。在某些情况下,它似乎是 API 中的 skip 参数的错误。关于何时发生这种情况的一些解释或解决方法的建议会很好。
  • 避免使用 $skip 并改用 $filter 并每天获取事件,每天应该最少,然后您可以每天提取数据。让我知道这是否适合您。
  • 虽然这可能有效,但效率不高,因为我需要每天为每个用户发送一个请求。这将是每个用户 365 次调用来获取一年的日历。不是很可扩展。即使这样,我也不能保证所有事件都已返回。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
相关资源
最近更新 更多