【发布时间】:2018-06-21 19:33:58
【问题描述】:
我正在尝试使用 Outlook REST API 标记(标记)一条消息,但我不断收到错误消息。我尝试过使用不同的 REST URL,但没有帮助 - 错误只是有所不同。
我认为清单中允许这样做的重要值是:
<Requirements>
<Sets>
<Set Name="Mailbox" MinVersion="1.1" />
</Sets>
</Requirements>
...
<Permissions>ReadWriteItem</Permissions>
<Rule xsi:type="RuleCollection" Mode="Or">
<Rule xsi:type="ItemIs" ItemType="Message" FormType="Read" />
</Rule>
...
<VersionOverrides xmlns="http://schemas.microsoft.com/office/mailappversionoverrides" xsi:type="VersionOverridesV1_0">
<Requirements>
<bt:Sets DefaultMinVersion="1.3">
<bt:Set Name="Mailbox" />
</bt:Sets>
</Requirements>
这是我正在尝试执行的导致错误的部分:
Office.context.mailbox.getCallbackTokenAsync({ isRest: true }, function (result)
{
if (result.status === "succeeded")
{
var accessToken = result.value;
var itemId = getItemRestId();
var restUrl = Office.context.mailbox.restUrl + "/api/v2.0/messages/" + itemId;
var request = {
url: restUrl,
type: "PATCH",
dataType: 'json',
data: { "Flag": { "FlagStatus": "Flagged" } },
headers: {
"Authorization": "Bearer " + accessToken,
"Conntent-Type": "application/json"
}
};
$.ajax(request)
.done(function (item)
{
// dome something
})
.fail(function (error)
{
// handle error
});
}
else
{
// handle error
}
});
function getItemRestId()
{
if (Office.context.mailbox.diagnostics.hostName === 'OutlookIOS')
{
return Office.context.mailbox.item.itemId;
}
else
{
return Office.context.mailbox.convertToRestId(
Office.context.mailbox.item.itemId,
Office.MailboxEnums.RestVersion.Beta
);
}
}
上面这段代码会报错:
{"readyState":4,"responseText":"","status":404,"statusText":"Not Found"}
如果我尝试 JSON.stringify() 我得到的请求的数据属性:
{"readyState":4,"responseText":"","status":404,"statusText":"Not Found"}
如果我将其余 URL 更改为(在旧示例中可以看到):
'https://outlook.office.com/api/beta/me/messages/'+ itemId;
以及请求的 headers 属性(在旧示例中可见):
headers: {
'Authorization': 'Bearer ' + accessToken,
'Content-Type': 'application/json'
}
然后我得到以下错误:
{
"readyState": 4,
"responseText": "{\"error\":{\"code\":\"ErrorAccessDenied\",\"message\":\"The api you are trying to access does not support item scoped OAuth.\"}}",
"responseJSON": {
"error": {
"code": "ErrorAccessDenied",
"message": "The api you are trying to access does not support item scoped OAuth."
}
},
"status": 403,
"statusText": "Forbidden"
}
谁能看到我在这里做错或遗漏了什么?
我在 Outlook 2016 中调试,帐户是 Office 365。
更新:提琴手输出
这是我自己的样本发送的请求(导致 403 Forbidden) 确切错误: {"error":{"code":"ErrorAccessDenied","message":"您尝试访问的 api 不支持项目范围的 OAuth。"}}
PATCH https://outlook.office.com/api/beta/me/messages/AAMkAGNmMDllMTVhLTI3ZDctNDYxZS05ZWM5LTA3ZWQzMzYyNDBiOABGAAAAAAD6OQOAoKyKT6R02yYFe0bIBwD5fUzv7OgQQYAILztCFSSWAALg591rAAC382lxTQ2HQpUKZsAGTeWVAARPu37CAAA= HTTP/1.1
Content-Type: application/json
Accept: application/json, text/javascript, */*; q=0.01
Authorization: Bearer <long token code removed...>
Referer: https://localhost:44394/MessageRead.html?_host_Info=Outlook$Win32$16.02$da-DK
Accept-Language: da-DK
Origin: https://localhost:44394
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Host: outlook.office.com
Content-Length: 33
Connection: Keep-Alive
Cache-Control: no-cache
{"Flag":{"FlagStatus":"Flagged"}}
这是演示项目发送的请求(结果为 200 OK)
PATCH https://outlook.office.com/api/beta/me/messages/AAMkAGNmMDllMTVhLTI3ZDctNDYxZS05ZWM5LTA3ZWQzMzYyNDBiOABGAAAAAAD6OQOAoKyKT6R02yYFe0bIBwD5fUzv7OgQQYAILztCFSSWAALg591rAAC382lxTQ2HQpUKZsAGTeWVAARPu37CAAA= HTTP/1.1
Content-Type: application/json
Accept: application/json, text/javascript, */*; q=0.01
Authorization: Bearer <long token code removed...>
Referer: https://<company.domain.com>:1443/outlookaddindemo/RestCaller/RestCaller.html?_host_Info=Outlook$Win32$16.02$da-DK
Accept-Language: da-DK
Origin: https://<company.domain.com>:1443
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Host: outlook.office.com
Content-Length: 47
Connection: Keep-Alive
Cache-Control: no-cache
{
"Flag": {
"FlagStatus": "Flagged"
}
}
我能看到的唯一区别是第二个请求有效负载似乎已格式化为读取,而数据方面与前一个相同。
我似乎在这里找不到问题 - 我什至确保两个项目都使用相同版本的 JQuery。
【问题讨论】:
-
您的 Outlook 客户端版本是多少? Outlook 2016 中存在一个关于 REST 令牌的已知错误。
-
在原帖中,客户端是 Outlook 2016 for Windows。但它也可以是浏览器中的 Outlook 2013 或 Outlook.com/Office365。这必须适用于所有人。
-
如果这确实是 Outlook 2016 for Windows 中未修复的错误,是否有人知道解决方法,或者如果您使用的是 Outlook 2016 for Windows,您只是运气不佳?
-
该错误已修复,这就是我要求您提供版本的原因。检查文件->Office 帐户,然后查找关于 Outlook 部分。它应该列出一个版本并构建。
-
版本为:2016 MSO (16.0.8730.2175) 32-bit。我怀疑这是错误,因为我刚刚尝试了一个通过 REST API 标记消息的演示项目,并且它在我的客户端中工作......我使用 Fiddler 检查两个请求,它们看起来是相同的,但我的只是没有由于某种原因不能工作:(
标签: outlook-addin office-addins outlook-restapi