由于来自 https://services.odata.org 的服务不支持 CORS,加载“$metadata”失败

Loading of `$metadata` fails due service from https://services.odata.org not supporting CORS

我正在尝试使用 Northwind R/W OData 服务 link:https://services.odata.org/V3/OData/OData.svc/

本地测试运行良好。但是没有使用proxy或者mock server,服务报如下错误:

NetworkError: 501 Not Implemented

控制器代码:

// ODataModel required from "sap/ui/model/odata/v2/ODataModel"
var oModel = new ODataModel({
  serviceUrl: "https://services.odata.org/V3/OData/OData.svc/",
  headers: {
    DataServiceVersion: "3.0",
    MaxDataServiceVersion: "3.0"
  }
});

由于您使用的是 Northwind,我相信它仅用于开发。所以你可以利用https://cors-anywhere.herokuapp.com/来访问跨源资源。

var oModel = new ODataModel({ // required from "sap/ui/model/odata/v2/ODataModel"
  serviceUrl: "https://cors-anywhere.herokuapp.com/https://services.odata.org/V2/(S(frik5l2zde0sxh4jiifyhqo4))/OData/OData.svc/"
});

或者另一种方法是 在 chrome 中禁用安全标志以进行开发 使用 .

更新 (2021-06-16): OData V4 TripPin service, a reverse proxy server is no longer required as the host now supports CORS.


原回答:

问题是 services from odata.org currently don't support CORS. To learn about what CORS is in general, see Same origin Policy and CORS (Cross-origin resource sharing).

简而言之,您的情况是这样的:

  1. 客户端发送预检请求,使用方法OPTIONS,查看服务器允许什么样的请求。
  2. 服务器响应它不理解 OPTIONS 请求。
  3. 客户报告“OPTIONS ... 501(未实施)”。

规避此问题的方法之一是使用可在 SAP Business Technology Platform(又名 SAP BTP,以前称为 SAP Cloud)中配置的反向代理服务器平台或 SCP)以及在本地开发的情况下使用 UI5 工具

有关如何解决此问题的详细文档。请仔细阅读主题 Request Fails Due to Same-Origin Policy (Cross-Origin Resource Sharing - CORS) 并根据您的开发环境应用更改。

如果在本地使用 UI5 工具,我建议 ui5-middleware-simpleproxy


public 代理服务 cors-anywhere.herokuapp.com 一开始似乎可以工作,但它初步会按顺序发送带有预检请求的每个请求(即每次两个请求),因为默认情况下,该服务器 缓存预检请求。src Also the number of requests per period is limited there, so you will get blocked when sending several requests too many times.UPDATE: cors-anywhere.herokuapp.com is officially no longer usable. See the announcement: https://github.com/Rob--W/cors-anywhere/issues/301