0

我正在尝试从 Excel 网页版调用外部 API ( https://api.fortnox.se/3/customers/2 )。

我正在调用的 Web API 返回一个 jason 数据结构,例如此处“检索客户”会话下的“响应”:https ://developer.fortnox.se/documentation/resources/customers/

响应数据结构:

{
    "Customer": {
        "@url": "https://api.fortnox.se/3/customers/102",
        "Active": true,
        "Address1": "Halltorpsgatan",
        "Address2": null,
        "City": "KLIPPAN",
        "Comments": null,
        "CostCenter": null,
        "Country": "Sverige",
        "CountryCode": "SE",
        "Currency": "SEK",
        "CustomerNumber": "102",
        "DefaultDeliveryTypes": {
            "Invoice": "PRINT",
            "Offer": "PRINT",
            "Order": "PRINT"
        },
        "DefaultTemplates": {
            "CashInvoice": "DEFAULTTEMPLATE",
            "Invoice": "DEFAULTTEMPLATE",
            "Offer": "DEFAULTTEMPLATE",
            "Order": "DEFAULTTEMPLATE"
        },
        "DeliveryAddress1": null,
        "DeliveryAddress2": null,
        "DeliveryCity": null,
        "DeliveryCountry": null,
        "DeliveryCountryCode": null,
        "DeliveryFax": null,
        "DeliveryName": null,
        "DeliveryPhone1": null,
        "DeliveryPhone2": null,
        "DeliveryZipCode": null,
        "Email": "a.s@example.com",
        "EmailInvoice": "a.s@example.com",
        "EmailInvoiceBCC": "",
        "EmailInvoiceCC": "",
        "EmailOffer": "a.s@example.com",
        "EmailOfferBCC": "",
        "EmailOfferCC": "",
        "EmailOrder": "a.s@example.com",
        "EmailOrderBCC": "",
        "EmailOrderCC": "",
        "Fax": null,
        "GLN": null,
        "GLNDelivery": null,
        "InvoiceAdministrationFee": null,
        "InvoiceDiscount": null,
        "InvoiceFreight": null,
        "InvoiceRemark": "",
        "Name": "Anders Svensson",
        "OrganisationNumber": "",
        "OurReference": "",
        "Phone1": "0435-9249236",
        "Phone2": null,
        "PriceList": "A",
        "Project": "",
        "SalesAccount": null,
        "ShowPriceVATIncluded": false,
        "TermsOfDelivery": "",
        "TermsOfPayment": "",
        "Type": "PRIVATE",
        "VATNumber": "",
        "VATType": "SEVAT",
        "VisitingAddress": null,
        "VisitingCity": null,
        "VisitingCountry": null,
        "VisitingCountryCode": null,
        "VisitingZipCode": null,
        "WWW": "",
        "WayOfDelivery": "",
        "YourReference": "",
        "ZipCode": "264 32"
    }
}

受 Stackoverflow 帖子的启发:Office Script 上的 Fetch error (Excel on web)我编写了以下代码:

interface aCustomer {
  Customer: CustomerClass;
}

interface CustomerClass {
  Address1: string;
  Country: string;
}

async function main(workbook: ExcelScript.Workbook): Promise<void> {
  let response = await fetch("https://api.fortnox.se/3/customers/2", {
    method: "GET",
    mode: "no-cors",
    headers: {
      "Access-Token": "XXXX",
      "Client-Secret": "XXXX",
      "Content-Type": "application/json",
      "Accept": "application/json"
    }
  });
  let customer2: aCustomer = await response.json();
  console.log(customer2);
}

但是当我运行它时,它一直抛出错误:“第 21 行:输入意外结束

第 21 行:让 customer2: Customer = await response.json()

我想我定义了一个错误的接口,或者知道问题可能是什么?谢谢!

4

1 回答 1

0

似乎您尝试使用的 API 很可能提供给桌面客户端应用程序或服务器应用程序使用,但不是直接从浏览器中的客户端 JavaScript 提供(CORS 可能会成为问题)。

一种可能的解决方法是使用“获取代理”。简而言之,它是一个简单的 Web 服务器,它将您的原始请求传递给目标 API,并将响应发送回您的客户端 JavaScript。这可能会起作用,因为此 Fetch 代理服务器和目标 API(服务器到服务器通信)之间不会存在 CORS 问题,同时此 Fetch 代理服务器配置为允许来自客户端 JavaScript 的 CORS。

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

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

于 2021-04-05T21:20:31.960 回答