Загрузка `$ metadata` не выполняется должным образом из-за того, что https://services.odata.org не поддерживает CORS

Я пытаюсь использовать ссылку на службу OData Northwind R / W: https://services.odata.org/V3/OData/OData.svc/.

Он отлично работает при локальном тестировании. Но без использования прокси или фиктивного сервера сервис сообщает об ошибке:

NetworkError: 501 не реализовано

Код контроллера:

// 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"
  }
});

comment
Пожалуйста, избегайте текущего принятого ответа. https://cors-anywhere.herokuapp.com/ больше не может использоваться, как было объявлено в github.com/Rob--W/ cors -where / issues / 301.   -  person Boghyon Hoffmann    schedule 05.02.2021


Ответы (2)


Поскольку вы используете 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 для разработки, используя настройки назначения в SCP .

person sakthi    schedule 19.05.2015

Обновление (2021-06-16): для OData V4 TripPin < / em> обратный прокси-сервер больше не требуется, поскольку хост теперь поддерживает CORS.


Исходный ответ:

Проблема в том, что службы от odata.org в настоящее время не поддерживают CORS. . Чтобы узнать, что такое CORS в целом, см. Политика одинакового происхождения и CORS (совместное использование ресурсов между разными источниками).

Вкратце, в вашем случае происходит следующее:

  1. Клиент отправляет предварительный запрос методом OPTIONS, чтобы узнать, какие запросы разрешены сервером.
  2. Сервер отвечает, что не понимает этот OPTIONS запрос.
  3. Клиент сообщает ОПЦИИ ... 501 (Не реализовано).

Один из способов обойти эту проблему - использовать обратный прокси-сервер, который можно настроить в SAP Business Technology Platform (он же SAP BTP, ранее известный как SAP Cloud Platform или SCP), а также с помощью с использованием UI5 Tooling в случае локальной разработки.

Существует обширная документация о том, как решить эту проблему. Просмотрите тему Ошибка запроса из-за политики того же происхождения (совместное использование ресурсов из разных источников - CORS) и примените изменения в соответствии со своей средой разработки.

Если вы работаете с инструментами UI5 локально, я рекомендую ui5-middleware-simpleproxy.


Поначалу может показаться, что общедоступная прокси-служба cors-anywhere.herokuapp.com работает, но она предварительно отправляет каждый отдельный запрос с предварительным запросом последовательно (то есть по два запроса каждый раз), поскольку предварительные запросы не кэшируются этим сервером. по умолчанию. src Также там ограничено количество запросов за период, поэтому вы будете заблокированы, если отправите несколько запросов слишком много раз.ОБНОВЛЕНИЕ: < / strong> cors-anywhere.herokuapp.com официально больше не используется. См. Объявление: https://github.com/Rob--W/cors-anywhere/issues/301

person Boghyon Hoffmann    schedule 21.12.2018