我在 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;
当然现在有一个不同的问题,但至少这个问题已经解决了。