Excel 365 中的 Office 脚本无法获取某些网址

问题描述 投票:0回答:1

我在 Excel 365 中使用 Office 脚本。函数获取始终失败,并出现以下错误。这很奇怪,因为它不会因某些网址而失败,我用 dummyjson 测试没问题(例如:https://dummyjson.com/products/1)。

Line 13: Failed to fetch

您可以在这里查看代码

async function main(workbook: ExcelScript.Workbook) {
  
  let url = 'http://ip-api.com/json/24.48.0.1';
  let headers = 
  {
    "Content-Type": "application/json"
  };
  let options = {
    'headers': headers,
    'method': 'GET', 
  }

  await fetch(url, options)
  .then(
    (response) => response.json()  
    ).then(
      (result) => console.log(result)
    )
}
typescript office365 office-scripts
1个回答
0
投票

这很可能是由 CORS 问题引起的,该问题可能会阻止您从当前域(运行 Office 脚本的位置)向某些特定域(托管目标 Web API 的位置)发出 Web 请求。

一些 Web API 服务选择允许 CORS,但有些则不允许。这就是为什么您在调用不同的 API 时会看到不一致的行为。

您可以在运行脚本时通过查看浏览器 DevTools(Chrome/Edge 为 F12)的控制台选项卡来确认。如果出现像

Access to fetch at ... from origin ... has been blocked by CORS policy...
这样的错误,那么可能就是这种情况。

如果您无法控制 API 服务提供商以在服务器端启用 CORS,则您需要找到一种方法通过某种中间层或代理服务来“桥接”您的请求。这称为“获取代理”。

简而言之,它是一个简单的 Web 服务器,它将您的原始请求传递到目标 API,并将响应发送回客户端 JavaScript。这可以工作,因为此 Fetch 代理服务器和目标 API(服务器到服务器通信)之间不会出现 CORS 问题,同时此 Fetch 代理服务器配置为允许来自客户端 JavaScript 的 CORS。

您可以构建并托管自己的 Fetch 代理服务器,也可以尝试一些现有的服务器。如果您关心数据隐私或性能,您可能想要构建和托管自己的数据隐私或性能。这篇Stack Overflow 帖子特别讨论了一种现有的流行 Fetch 代理服务器实现(“CORS Anywhere”)。

这篇文章对 CORS 问题和 Fetch Proxy 的想法也有一些很好的解释。

© www.soinside.com 2019 - 2024. All rights reserved.