【问题标题】:Getting a Count of Contacts from Outlook Office REST API - Javascript从 Outlook Office REST API 获取联系人计数 - Javascript
【发布时间】:2016-08-18 23:34:58
【问题描述】:

我很难区分 Microsoft 大量相互冲突的 API 文档:outlook.office.com、outlook.office365.com、microsoft graph、Azure 等等

我已成功验证并提取联系人,但我似乎无法计算知道何时应该停止分页。

我一直在使用:

Access Token url: 
    https://login.microsoftonline.com/common/oauth2/v2.0/token;
Successful Contact url: 
    https://outlook.office.com/api/v2.0/me/contacts;

他们的REST API Resource 说我应该能够简单地调用https://outlook.office.com/api/v2.0/me/contacts/$count 但这会不断返回正文为-1 的明文MIME 类型。

如果有人曾经为此苦苦挣扎或知道发生了什么,我将不胜感激指出正确的方向 - 并希望为您提供一些简单的点!


编辑:感谢下面的 Jason 提供的帮助。使用沙箱,我能够通过以下方式重现该问题:

登录到我的帐户 -> 收到访问令牌 -> 向 https://outlook.office.com/api/v2.0/me/contacts/$count 进行了 GET 调用

请求标头:

GET https://outlook.office.com/api/v2.0/me/contacts/$count HTTP/1.1
Accept: text/*, application/xml, application/json; odata.metadata=none
User-Agent: PlayGroundAgent/1.0
Authorization: Bearer [standard-access-token]
client-request-id: 8f605[client-id-obscured-for-security]7289
X-AnchorMailbox: [email-address-removed-for-security on stackOverflow]

回应

HTTP/1.1 200 OK
Transfer-Encoding: chunked
request-id: de95eaa8-95a7-40bb-b0f9-ced7270f0433
X-CalculatedBETarget: SN1PR05MB1998.namprd05.prod.outlook.com
X-BackEndHttpStatus: 200
OData-Version: 4.0
X-DiagInfo: SN1PR05MB1998
X-BEServer: SN1PR05MB1998
X-FEServer: SN1PR0501CA0035
X-MSEdge-Ref: Ref A: 657E0491C29D46978D8DD3B01B9F93A3 Ref B: DDDD64A109F4E842A8213F038BFDD5FA Ref C: Fri Aug 19 09:20:05 2016 PST
Cache-Control: private
Date: Fri, 19 Aug 2016 16:20:05 GMT
Set-Cookie: exchangecookie=6ca5fc4df96e458e8b879de61aa574ef; expires=Sat, 19-Aug-2017 16:20:05 GMT; path=/; HttpOnly
Server: Microsoft-IIS/8.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET

-1

第二次编辑:看起来https://outlook.office.com/api/v2.0/me/contacts?$count=true 也返回了@odata.count": -1,即使它返回了有效的联系人数组。


第三次编辑:工作版本(使用与上述错误相同的方法) 网址:https://outlook.office.com/api/v2.0/me/contacts/$count

请求标头:

GET https://outlook.office.com/api/v2.0/me/contacts/$count HTTP/1.1
Accept: text/*, application/xml, application/json; odata.metadata=none
User-Agent: PlayGroundAgent/1.0
Authorization: Bearer [access-token]
client-request-id: a7954db3-[client-id]-7a6e2e74dd9c
X-AnchorMailbox: [same-email-as-above]

回应

HTTP/1.1 200 OK
Transfer-Encoding: chunked
request-id: 8c5db16b-3023-4968-9bdc-3d5ecac12ecb
X-CalculatedBETarget: SN1PR05MB1998.namprd05.prod.outlook.com
X-BackEndHttpStatus: 200
OData-Version: 4.0
X-DiagInfo: SN1PR05MB1998
X-BEServer: SN1PR05MB1998
X-FEServer: SN1PR0501CA0019
X-MSEdge-Ref: Ref A: 0574E46DB720491FBCEF23B73428F191 Ref B: FA4529229719F069B9D019E4D53E9200 Ref C: Fri Aug 19 09:42:55 2016 PST
Cache-Control: private
Date: Fri, 19 Aug 2016 16:42:55 GMT
Set-Cookie: exchangecookie=63a1de916a4c48be88569f05ce0361a7; expires=Sat, 19-Aug-2017 16:42:55 GMT; path=/; HttpOnly
Server: Microsoft-IIS/8.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET

29

希望这些帮助!

【问题讨论】:

    标签: javascript outlook msdn outlook-restapi


    【解决方案1】:

    很抱歉得知您遇到了问题!这里发生了几件事。

    令人不安的是,您从$count 电话中得到了一个负数。如果您转到https://oauthplay.azurewebsites.net 并使用您的帐户登录,您会从该呼叫中得到相同的结果吗?

    对于分页,如果您只想获取所有结果,最好不要依赖$count 值。相反,您应该使用响应中返回的@odata.nextLink 值来获取下一页。当然,如果您想在获得所有结果之前向用户指示有多少页面,$count 就是这样做的方法。

    分页由页面大小($top 参数)和“光标”($skip parameter). If you're making a call to/me/contactswith no parameters, then you're getting the default page size of 10 and default cursor of 0. You can use the$top` 参数控制,以请求每页更多的结果。

    @odata.nextLink 值将始终返回一个 URL,您可以使用该 URL 根据您在 $top 中指定的页面大小(如果未指定,则为 10)获取下一页。这是 GET https://outlook.office.com/api/v2.0/me/contacts 的价值:

    "@odata.nextLink": "https://outlook.office.com/api/v2.0/me/contacts/?%24skip=10"
    

    这会向前跳过 10 个结果(基于默认页面大小 10)。

    这是来自GET https://outlook.office.com/api/v2.0/me/contacts/?$top=20 的值:

    "@odata.nextLink": "https://outlook.office.com/api/v2.0/me/contacts/?%24top=20&%24skip=20"
    

    如果没有更多页面,@odata.nextLink 值将不会出现在响应中。因此,您可以使用它作为停止分页的指标。

    【讨论】:

    • 感谢您将我指向该沙盒。看到我使用与沙箱相同的身份验证路径(基于 url),这令人欣慰。我第一次尝试时,是的,它返回了一个计数,但随后的几次尝试也产生了-1!不确定触发失败的常见线程是什么......在相关说明中,感谢您对分页的帮助,我担心这会限制我只能向前和向后,我想显示页码这将允许用户从第 1 页跳转到第 4 页,但我需要知道第 4 页实际存在。
    • 是的,在这种情况下,您需要计数。如果您可以在沙箱中重现它,您介意发布完整的响应(包括标题)吗?我想由我们的开发人员运行它。
    • 是的,这似乎有点偶然。我的应用程序设法获得了大约 2 个呼叫的计数,然后返回 -1 而没有任何更改。我也能让沙盒偶尔失败。回复太长,无法放入 cmets,因此我将对问题进行编辑。
    • 嗨,Jason,不确定您是否仍在关注此内容,希望您可能是 - 您最近是否注意到错误有所增加?我的一个 API 现在返回 404,甚至沙箱也给了我 ``` GET outlook.office.com/api/v2.0/me/contacts?$top=50 HTTP/1.1 User-Agent: PlayGroundAgent/1.0 Authorization: Bearer {access_token} client-request-id: {request} X-AnchorMailbox : censored@email.com ``` x-ms-diagnostics: 2000005;reason="token 中 user-context 指定的用户不存在。";error_category="invalid_user"
    猜你喜欢
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 2017-05-11
    • 2020-09-12
    相关资源
    最近更新 更多