0

我在 Angular 1.3 项目中使用 BreezeJS 1.5.1 来尝试查询 SAP 网关服务器,我确信它实现了 OData。正如标题所说,对 $metadata 服务的每个请求都会从服务器返回406 Not Acceptable响应。

<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
  <code>005056A509B11ED19BEB6513AA349DA5</code>
  <message xml:lang="en">
    The resource identified by the request is only capable of generating response entities which have content characteristics not acceptable according to the accept headers sent in the request
  </message>
</error>

我尝试使用几种不同的适配器配置('OData'、'odata'、'WebApiOData')来初始化 Breeze;这可确保 Breeze/$metadata在启动时调用而不是/Metadata,但不能解决问题。

// breeze.config.initializeAdapterInstances({ dataService: 'OData' });
// breeze.config.initializeAdapterInstance('dataService', 'odata', true);
breeze.config.initializeAdapterInstances({ dataService: 'webapiodata' });

网关服务器必须始终为其元数据调用返回 XML(JSON 元数据在 SAP 上不可用),并且请求的 Accept 标头有问题 ( Accept:application/json;odata.metadata=full)。Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8除了直接从有效的 Chrome ( )调用元数据服务的那些之外,我找不到它将在 Postman 中接受的正确标题组合。

我已经将应用程序指向不同的服务甚至不同的网关实例,所有这些都具有相同的结果。我错过了一个基本的配置吗?

2014 年 10 月 31 日编辑

根据 Ward 在下面的回答,我截获了 dataJS 请求(如http://www.getbreezenow.com/documentation/controlling-ajax的OData Ajax部分中所建议的那样)并替换了 $metadata 调用的 Accept 标头。

var oldClient = $window.OData.defaultHttpClient;
var myClient = {
  request: function (request, success, error) {
    $log.log('Intercepting OData request', request.requestUri);
    if (endsWith(request.requestUri, '$metadata')) {
      request.headers.Accept = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8';
    }
    return oldClient.request(request, success, error);
  }
};
$window.OData.defaultHttpClient = myClient;

当然现在有一个不同的问题,但至少这个问题已经解决了。

4

2 回答 2

1

不,你没有错过任何基本的东西。但是,SAP 可能有。

我记得,OData $metadata 请求的结果始终是 XML,而不是 JSON,我相信 Breeze 会很乐意将它作为 XML 接收。

是的,即使响应不是 JSON,accept 标头也会指定 JSON。这对 Breeze 来说有点草率(或者 Data.js 库 Breeze 委托给......还不确定)。

但 SAP 不应该惊慌失措。请求的接受标头应该是建议性的,服务器应尽其所能满足请求媒体类型格式。它不必遵守请求的格式。In 可以根据需要以不同的格式返回。

在这种情况下,SAP 应该刚刚以 XML 格式发送元数据。显然,SAP 很挑剔。

我会尽快调查此事。同时,您可以使用 $http 拦截器自己修补此特定请求的接受标头。

稍后再回来。

于 2014-10-30T23:15:31.053 回答
0

仅供参考,在 SAP Gateway 中,您可以通过 ...?$format=json 或 ...?$format=xml 轻松指定 JSON 或 XML 呈现。默认为 xml。所以对于元数据,它看起来像这样: ...IWBEP/GWDEMO/ProductCollection/?$metadata&$format=json 或 ...IWBEP/GWDEMO/ProductCollectio/?$metadata&$format=xml

于 2014-11-04T10:49:35.970 回答