Outlook插件REST调用获取附件详情遇RequestBroker--ParseUri报错求助
问题原因与解决办法
核心错误点
你遇到的RequestBroker--ParseUri错误,根源是直接使用了EWS格式的ItemId拼接REST API地址。Outlook插件中Office.context.mailbox.item.itemId返回的是EWS(Exchange Web Services)兼容的ID,而Outlook REST API要求使用REST格式的ID,直接用原ID会导致API无法识别资源路径。
具体修正步骤
转换ItemId为REST格式
使用Office.context.mailbox.convertToRestId()方法,将EWS格式的itemId转换为REST API兼容的ID,指定目标版本为Office.MailboxEnums.RestVersion.v2_0。修正URL构造逻辑
用转换后的REST格式ID替换原EWS ID,拼接API地址。如果要获取单个附件的内容(/$value),附件ID如果是从EWS获取的,同样需要用convertToRestId转换。修复代码中未定义变量的问题
你代码里attachment.name的attachment变量未定义,需要先获取附件列表,再针对单个附件请求内容。
修正后的代码示例
// 获取当前邮件的EWS格式ID const ewsItemId = Office.context.mailbox.item.itemId; // 转换为REST格式ID const restItemId = Office.context.mailbox.convertToRestId( ewsItemId, Office.MailboxEnums.RestVersion.v2_0 ); Office.context.mailbox.getCallbackTokenAsync({ isRest: true }, function (result) { if (result.status === Office.AsyncResultStatus.Succeeded) { const callbackToken = result.value; const headers = { Authorization: `Bearer ${callbackToken}` }; // 1. 先获取该邮件的所有附件列表 const attachmentsListUrl = `${Office.context.mailbox.restUrl}/v2.0/me/messages/${restItemId}/attachments`; fetch(attachmentsListUrl, { headers }) .then(response => response.json()) .then(data => { // 假设取第一个附件,获取其REST格式ID const firstAttachment = data.value[0]; const restAttachmentId = Office.context.mailbox.convertToRestId( firstAttachment.Id, Office.MailboxEnums.RestVersion.v2_0 ); // 2. 请求该附件的内容 const attachmentContentUrl = `${Office.context.mailbox.restUrl}/v2.0/me/messages/${restItemId}/attachments/${restAttachmentId}/$value`; return fetch(attachmentContentUrl, { headers }); }) .then(response => response.arrayBuffer()) .then(arrayBuffer => { // 处理附件内容,比如转base64 const base64Data = arrayBufferToBase64(arrayBuffer); console.log("附件内容转换完成"); }) .catch(error => { console.log("获取附件失败:", error); }); } });
关于你尝试的第二种URL的问题
${item.itemId}仍然是EWS格式的ID,没有转换为REST格式,所以同样会触发资源找不到的错误,必须先转换ID格式再使用。
内容的提问来源于stack exchange,提问作者Pearl
相关产品推荐
相关产品推荐

